1、延时子程序
1 2 3 4 5 6 7 8
| DELAY:MOV R5,#25 ;写一个延时函数,DELAY就是延时函数的意思。R5是一个寄存器,我们把立即数25移到R5里面去 D1:MOV R6,#100 ;把100放到R6这个寄存器中 D2:MOV R7,#100 ;把100放到R7这个寄存器中 DJNZ R7,$ ;DJNZ指令:减一不为零转移指令。这里的$就是停在这里的意思,和DJNZ R7,DJNZ是一个意思 DJNZ R6,D2 DJNZ R5,D1 RET END
|
例:已知晶振为12MHz,试编写10ms的延时子程序。
答:晶振为12MHz时,机器周期Tcy=1us(2分)
故10ms=10000us=100 * 100 * Tcy (2分)
因此,
(2 * 内循环+3) * 外循环 +3
1 2 3 4 5
| DEALY: MOV R0,#100 D1: MOV R1,#50 D2: DJNZ R1,D2;(2*50*100us) DJNZ R0,D1 RET
|
2、查RAM数据
试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。
1 2 3 4 5 6 7
| FIND: MOV R0,#02FH ;把30H的前一个29H立即数给R0 MOV 51H,#0 ;把立即数0给51H这个单元 LOOP: INC R0 ;R0自增1 CJNE @R0,#0AAH,NEXT ;R0是地址,地址里面的内容和立即数0AAH进行比较,不相等就到NEXT,相等就执行下一条指令 INC 51H ;51H自增1 NEXT:CJNE R0,#50H,LOOP ;R0的地址和立即数50H进行比较,不相等就到LOOP,相等就执行下一条指令 RET
|
分析一下程序设计逻辑:R0是一个地址,把30H前面一个地址2FH给它,然后把立即数0给51H,即默认未找到即为00H。
R0自增1,地址就会从2FH变成30H,然后判断30H这个地址里面的值是否是0AAH,如果是说明找到了,就把51H增加1。然后下一句看看R0有没有到到50H,如果有,下一句就是程序结束,如果没有就会循环,因为已经找到了,再不断自增1,直到50H即可,反正51H已经是01H了。
如果30H不是0AAH那么就直接到NEXT,不让51H变成01H,然后因为没有到50H所以就继续循环看看其他单元是否有0AAH
3、I/O口实验(可能不考)
设计一个用3个按键控制8个LED灯闪烁状态的程序,要求:
1)没有按键按下时,8个小灯亮500MS,灭500MS循环
2)第一个按键按下,8个小灯间隔4个亮,4个灭,500MS循环
3)第二个按键按下,8个小灯全灭,然后每隔500MS从左向右依次亮一个,全亮后再熄灭,如此循环
4)第三个按键按下,回到主程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| FIRST BIT P1.0 SECOND BIT P1.1 THIRD BIT P1.2 MAIN: KEY1:JB FIRST,KEY2;如果FIRST没有被按下即为1,则跳转到KEY2,如果被按下,则执行下面语句 CALL DELAY;调用延时,消除抖动 JNB FIRST,$;松手检测,只有按下之后松手FIRST为1之后,程序才能执行 CALL DELAY;调用延时,消除抖动 /*开始执行*/ LOOP1: JNB THIRD,KEY2;如果THIRD被按下,则跳转到KEY2 MOV P0,#55H CALL DELAY MOV P0,#0AAH CALL DELAY JMP LOOP1 KEY2: JB THIRD,KEY0;如果THIRD没有被按下即为1,则跳转到KEY0,如果被按下,则执行下面语句 CALL DELAY;调用延时,消除抖动 JNB FIRST,$;松手检测,只有按下之后松手,程序才能执行 CALL DELAY;调用延时,消除抖动 JMP MAIN
KEY0:;没有按键按下时,亮500MS灭500MS循环 MOV P0,#00H CALL DELAY MOV P0,#0FFH CALL DELAY JMP KEY1 DELAY:MOV R5,#5 D1:MOV R6,#200 D2:MOV R7,#250 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END
|
4、定时器实验
1)利用定时器设计1s的中断,要求每一秒计数值加1,该值在40H单元中,并实时地将40H单元内容通过8个LED灯显示出来。
2)将定时器用于检测按键动作(即定时器当成外部中断功能使用),要求按键动作一次计数值加1,该值在30H单元中,并实时将30H单元内容通过8个LED灯显示出来。
期中考的方波要掌握:
请完成从P1.0引脚上输出周期为2ms的方波的程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ORG 0000H LJMP MAIN ORG 000BH ;T0接口 LJMP T0_INT ORG 0100H MAIN: MOV SP,#60H MOV TH0,#0FEH ;H高 MOV TL0,#0CH ;L低 MOV TMOD,#01H; 16BIT计数 0000 0001 启用定时器0的工作方式1。即首先对TMOD寄存器初始化 ;打开中断 SETB ET0 SETB EA SETB TR0 SETB P1.0;p1.0置1 JMP $ ;(主程序)(5分)
T0_INT: MOV TH0,#0FEH MOV TL0,#0CH CPL P1.0 ;反 RETI ;跳出中断 (定时中断)(4分) END
|
5、串口实验
设计一个简单的双机通信:

甲机为单片机,乙机为PC机或单片机,具体实验内容如下:
甲机每秒钟计数单元加1(可以假设计数单元为30H),同时每秒钟到的时候将计数单元数据向乙机发送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ORG 0000H LJMP MIAN ORG 0040H MAIN: MOV SCON,#80H 方式2 MOV 30H,#00H LOOP: MOV A,30H MOV SBUF,A ;当成发送的寄存器 JNB TI,$ ;如果发送完数据t1置1,过后不会变为0. 判断是否为1,如果为1才继续执行 CLR TI ;手动清0 LCALL DELAY INC 30H LJMP LOOP DELAY:MOV R7,#10 D1: MOV R6,#200 D2: MOV R5,#250 DJNZ R5,$ DJNZ R6,D2 DJNZ R7,D1 RET END
|