“debug”工具栏中找到对应的快捷按钮。常用按钮有:运行,单步,过程单步,单步跳出,执行到当前,反汇编窗口,观察窗口,存储器窗口。其中单步调试方式特别常用。单步执行后,可以通过各个窗口观察执行结果,从而判断该条语句是否出现问题。如果程序较长,可以采用下面的方法来调试。首先,在合适的位置设置断点,方法为:在某一行上右击,弹出的快捷菜单中选择“Insert/Remove Breakpoint”。设置成功后,该行的前面会有红色方块指示。这时如果单击“运行”按钮,程序运行到断点处会自动停止。删除断点也需使用同样的方法。
如果程序的运行要依赖于外围接口,例如并行口、串行口、中断、定时/计数器等,Keil的“Peripherals”菜单中提供了一些选项,通过这些选项打开对应外围接口的对话选框,可以观察外围接口的状态,或者更改外围接口的运行情况。
习题四
4-1 51内核单片机有哪几种寻址方式?片内RAM低128字节及高128字节分别支持哪些寻址方式?片内扩展RAM、片外RAM及特殊功能寄存器分别支持哪些寻址方式?
51内核单片机的寻址方式有:立即(数)寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。
片内RAM低128字节支持直接寻址、寄存器间接寻址。 片内RAM高128字节支持寄存器间接寻址。 片内扩展RAM及片外RAM支持间接寻址。 特殊功能寄存器支持直接寻址。
4-2 区分下列指令有什么不同?
(1) MOV A,#22H和MOV A,22H
MOV A,#22H ;将立即数22H送入A寄存器中,第二操作数为立即寻址。 MOV A,22H ;把片内RAM字节地址为22H单元的内容送入A寄存器中,第二操作数为直接寻址。
(2) MOV A,R1和MOV A,@R1
MOV A,R1 ;把R1的内容送入A寄存器中,第二操作数为寄存器寻址。 MOV A,@R1 ;将寄存器R0的内容作为RAM某单元的地址,将该单元的内容传送给A寄存器,第二操作数为寄存器间接寻址。 (3) MOV A,@R1和MOVX A,@R1
MOV A,@R1 ;将寄存器R1的内容作为片内RAM某单元的地址,将该单元的内容传送给A寄存器
MOVX A,@R1 ;将寄存器R1的内容作为片内扩展或外部RAM某单元的地址,将该单元的内容传送给A寄存器
两者的区别是:MOV访问的是内部RAM,MOVX访问的是片内扩展或外部RAM。 (4) MOVX A,@R1和MOVX A,@DPTR
主要的区别在于对外输出地址的方式上。
5
如果是访问片外扩展RAM, MOVX A,@R1
只是占用P0口,输出R1中的8位地址。
而MOVX A,@DPTR要占用P0、P2口,输出DPTR中的16位地址。 (5) MOVC A,@A+DPTR和MOVX A,@DPTR
MOVC A, @A+DPTR ;功能是A寄存器的内容作为无符号数和DPTR内容相加后得到一个16位的地址,将程序存储器中该地址的内容传送给A。
MOVX A,@DPTR ;以DPTR寄存器的值作为片内扩展RAM或者片外RAM的地址,将该地址单元的内容送入A 。
两者的区别是MOVC访问的是整个ROM的64KB空间;MOVX访问的是整个片内扩展RAM或片外扩展RAM。
4-3 写出完成下列各项任务的指令。
(1) 片内RAM 30H 单元的内容送到片内RAM 50H单元中。 MOV 50H,30H
(2) 片内RAM 40H单元的内容送到片内扩展RAM 50H单元中。 ANL AUXR,#11111101B MOV A,40H
MOV DPTR,#50H MOVX @DPTR ,A
(3) 片内RAM 50H单元的内容送到片外RAM 2000H单元中。 ORL AUXR,#00000010B MOV A , 50H
MOV DPTR , #2000H MOVX @DPTR , A
(4) 片外RAM 2000H单元的内容送到片外RAM 4000H单元中。 ORL AUXR , #00000010B MOV DPTR,#2000H MOVX A,@DPTR MOV DPTR,#4000H MOVX @DPTR,A
(5) ROM 1000H单元的内容送到片外RAM 8000H单元中。 MOV DPTR,#1000H MOV A , #0
MOVC A , @A+DPTR MOV DPTR,#8000H
ORL AUXR,#00000010B MOVX @DPTR , A
(6) 将程序状态字寄存器PSW内容传送到片内扩展RAM 0D0H单元中。 ANL AUXR , #11111101B MOV A,PSW
MOV DPTR , #0D0H MOVX @DPTR , A
(7) 将片内RAM 01H~FFH单元内容清零。
6
ANL PSW , #11100111B MOV R0,#0FFH MOV A,#0
LOOP:MOV @R0,A DJNZ R0,LOOP
(8) 使片内RAM 20H 单元的b7、b6位清零,b5、b4位置1,b3、b2位取反,其余各位保持不变。 ANL 20H,#00111111B ORL 20H,#00110000B XRL 20H,#00001100B
4-4下列各条伪指令前的标号各代表的地址是多少?
ORG 0100H
TABLE:DS 4 ;TABLE代表的的地址是0100H WORD:DB 15,0FFH,30 ;WORD代表的地址是0104H BIN EQU 0200H
TAB1: DW 07H ;TAB1代表的地址是0107H
4-5 假设程序头文件中含有如下变量定义伪指令
DBUF DATA 40H BDATA DATA 60H
(1) 请指出如下指令中源操作数的寻址方式。 MOV R0,#DBUF ;立即(数)寻址 MOV R0,DBUF ;直接寻址
(2) 执行如下程序段后,片内RAM 40H~4FH单元的内容是什么?60H单元的内容又是什么? MOV BDATA,#10H MOV R0,#DBUF CLR A
LOOP: MOV @R0,A INC A INC R0
DJNZ BDATA,LOOP
执行以上程序段后,片内RAM 40H~4FH单元的内容是:0-0FH; 60H单元的内容为0。
4-6 编写一个延时10ms的子程序。
选择STC12C5A60S2单片机,系统时钟频率为12MHz,程序如下: DELAY_10ms:
MOV R7,#120 ;2T DL: MOV R6,#250 ;2T DJNZ R6,$ ;4T DJNR R7,DL ;4T RET ;4T
7
4-7编程实现
MOV C,P1.1 ORL C,P1.2 CPL C
MOV PSW.5,C
MOV C,P1.4 ANL C,/P1.3
ORL C,PSW.5
MOV P1.0,C
的逻辑运算。
4-8 将存放在片内RAM 51H、52H和片外RAM 2000H、2001H的四位BCD码相加,结果存放在片内RAM 50H、51H、52H单元中(假设低位字节存放在高地址中,高位字节存放在低地址中)。
ORL AUXR,00000010B
MOV DPTR,#2001H
MOVX A,@DPTR ADD A,52H DA A
MOV 52H,A
MOV DPTR ,#2000H MOVX A,@DPTR ADDC A,51H DA A MOV 51H,A MOV A,#00H ADDC A,#00H MOV 50H,A
4-9编程实现将片内扩展RAM 0200H~0220H单元的内容,全部移到片内RAM 30H单元开始的位置,并将原位置清零。
MOV R0,#30H MOV DPTR,#0200H MOV R1,#21H
ANL AUXR , #11111101B LOOP:MOVX A,@DPTR
MOV @R0,A MOV A,#0
MOVX @DPTR,A INC R0 INC DPTR
8