首页 理论教育51单片机案例设计结果

51单片机案例设计结果

【摘要】:汇编程序如下:第2条指令执行后,如图4-5所示,内部RAM中15H单元的内容已送入R6中;继续执行第3条指令,结果显示与图4-4相同。图4-13 任务2存储器窗口显示5上述程序需要说明的是:1)由于PUSH指令不能寄存器寻址,即R2不能压栈弹栈,因此压栈弹栈操作需对直接地址02H操作。图4-14 任务3存储器窗口显示12)解法2。分析:64H的无符号数和有符号数表示见表4-4。表4-5 64H+64H的CY和OV结果按照PSW定义,由图4-16可知运算后PSW为00000101B。

(1)编写完成任务1的汇编程序

1)解法1。汇编程序如下:

978-7-111-49736-3-Chapter04-6.jpg

单击单步执行,第1条指令执行后,打开存储器显示窗口,在Address框中输入d:15H显示内部RAM的15H单元内容,如图4-3所示,说明第1条传送指令将立即数AAH送到了内部RAM的15H单元。执行第2条指令后,如图4-4所示,内部RAM的15H单元的内容传送到55H单元。

978-7-111-49736-3-Chapter04-7.jpg

图4-3 解法1存储器窗口显示1

978-7-111-49736-3-Chapter04-8.jpg

图4-4 解法1存储器窗口显示2

2)解法2。汇编程序如下:

978-7-111-49736-3-Chapter04-9.jpg

第2条指令执行后,如图4-5所示,内部RAM中15H单元的内容已送入R6中;继续执行第3条指令,结果显示与图4-4相同。

3)解法3。汇编程序如下:

978-7-111-49736-3-Chapter04-10.jpg

第2条指令执行后,如图4-6所示,立即数15H单元的内容已送入Rl中;继续执行第3条指令,对Rl进行间接寻址即将RO中保存的15H看成地址,将15H单元的内容送到55H单元,结果显示与图4-4相同。

978-7-111-49736-3-Chapter04-11.jpg

图4-5 解法2存储器窗口显示

978-7-111-49736-3-Chapter04-12.jpg

图4-6 解法3存储器窗口显示

4)解法4。汇编程序如下:

978-7-111-49736-3-Chapter04-13.jpg

第2条指令执行后,如图4-7所示,立即数15H单元的内容已送入A中;继续执行第3条指令,将A中的数送入55H单元,结果显示与图4-4相同。

5)解法5。汇编程序如下:

978-7-111-49736-3-Chapter04-14.jpg

第3条指令执行后,如图4-8所示,PSW中的RS1、RS0值改变,此时R5指向内部RAM中15H单元,因此R5中存AAH;继续执行第3条指令,将R5中的数送入55H单元,结果显示与图4-4相同。

(2)编写完成任务2的汇编程序

汇编程序如下:

978-7-111-49736-3-Chapter04-15.jpg

978-7-111-49736-3-Chapter04-16.jpg

图4-7 解法4存储器窗口显示

978-7-111-49736-3-Chapter04-17.jpg

图4-8 解法5存储器窗口显示

第3条指令执行后,SP寄存器的值如图4-9所示,为30H;

第4条指令执行后,结果如图4-10所示,SP寄存器的值变成31H,内部RAM中31H的单元变成了A中保存的01H,注意体会PUSH指令“先增1,再存储”的特点;

978-7-111-49736-3-Chapter04-18.jpg

图4-9 任务2存储器窗口显示1

978-7-111-49736-3-Chapter04-19.jpg

图4-10 任务2存储器窗口显示2

第5条指令执行后,结果如图4-11所示,SP寄存器的值变成32H,内部RAM中32H的单元变成了R2中保存的05H;

第6条指令执行后,结果如图4-12所示,SP寄存器的值变成31H,A中保存的值变成05H,注意体会POP指令“先弹栈,再减1”的特点;

978-7-111-49736-3-Chapter04-20.jpg

图4-11 任务2存储器窗口显示3

978-7-111-49736-3-Chapter04-21.jpg(www.chuimin.cn)

图4-12 任务2存储器窗口显示4

第7条指令执行后,结果如图4-13所示,SP寄存器的值变成30H,R2中保存的值变成01H,完成了R2和A的交换,注意内部RAM存储单元中31H、32H仍然保留01H、05H没有变。

978-7-111-49736-3-Chapter04-22.jpg

图4-13 任务2存储器窗口显示5

上述程序需要说明的是:

1)由于PUSH指令不能寄存器寻址,即R2不能压栈弹栈,因此压栈弹栈操作需对直接地址02H操作。寄存器指令不能压栈的原因可能是受RS0、RS1影响,使Rn物理位置不固定,压栈操作后,若物理位置改变,会给程序调试带来麻烦,并且错误非常隐蔽,不易发现。因此计算机工程师经过编程实践,决定寄存器不能压栈。而特殊功能寄存器虽名为寄存器,但寻址方式属直接寻址,因此可以进行堆栈操作。读者可利用Keil调试软件进行实验验证:

978-7-111-49736-3-Chapter04-23.jpg

2)若入栈和出栈的顺序相反,可完成两数交换。

(3)编写完成任务3的汇编程序

1)解法1。使用MOVC A,@A+PC指令编程,汇编程序如下:

978-7-111-49736-3-Chapter04-24.jpg

程序开始运行前可以用C:30H查看一下ROM中存储内容,如图4-14所示,30H~37H存储的是汇编程序对应的机器码,37H之后为TAB表格。执行BCD_ASCII子程序中的MOVC A,@A+PC指令后,结果如图4-15所示,07H对应的ASCII结果已保存在A中。

978-7-111-49736-3-Chapter04-25.jpg

图4-14 任务3存储器窗口显示1

2)解法2。使用MOVC A,@A+DPTR指令编程,汇编程序如下:

978-7-111-49736-3-Chapter04-26.jpg

978-7-111-49736-3-Chapter04-27.jpg

978-7-111-49736-3-Chapter04-28.jpg

图4-15 任务3存储器窗口显示2

对于程序存储器数据传送指令需要说明的是,DPTR可以通过传送指令MOV改变,而PC不能通过传送指令改变。PC和DPTR的区别可从任务3的解法1和解法2体现出来。

(4)编写完成任务4的汇编程序

编写完成64H+64H的汇编程序,并观察Keil的寄存器窗口中PSW值是否正确。

分析:64H的无符号数和有符号数表示见表4-4。

表4-4 64H所表示的无符号数和有符号数

978-7-111-49736-3-Chapter04-29.jpg

64H+64H的运算过程如图4-16所示。

因此64H+64H后,CY和OV结果见表4-5。

表4-5 64H+64H的CY和OV结果

978-7-111-49736-3-Chapter04-30.jpg

按照PSW定义,由图4-16可知运算后PSW为00000101B。

完成加法任务的汇编程序如下:

978-7-111-49736-3-Chapter04-31.jpg

第1条指令执行后,结果如图4-17所示;第2条指令执行后,结果如图4-18所示。

978-7-111-49736-3-Chapter04-32.jpg

图4-16 64H+64H的运算过程

978-7-111-49736-3-Chapter04-33.jpg

图4-17 任务4存储器窗口显示1

978-7-111-49736-3-Chapter04-34.jpg

图4-18 任务4存储器窗口显示2

继续完成如下加法程序,并分析PSW的值:

978-7-111-49736-3-Chapter04-35.jpg