如上述C代码中,把延时函数的定义删除了,然后把延时函数的实现搬到main函数的上面,编译后程序代码减少到63个字节,减少了4个字节,如图6-5所示。图6-4 编译结果2图6-5 编译结果3省略函数形参函数带形参,是为了在函数调用时传递实参,不但可以避免重复代码出现,还可以通过传递不同的实参值多次调用函数且实现不同的函数功能,总体代码也会得到精简。......
2023-10-28
(1)编写完成任务1的汇编程序
1)解法1。汇编程序如下:
单击单步执行,第1条指令执行后,打开存储器显示窗口,在Address框中输入d:15H显示内部RAM的15H单元内容,如图4-3所示,说明第1条传送指令将立即数AAH送到了内部RAM的15H单元。执行第2条指令后,如图4-4所示,内部RAM的15H单元的内容传送到55H单元。
图4-3 解法1存储器窗口显示1
图4-4 解法1存储器窗口显示2
2)解法2。汇编程序如下:
第2条指令执行后,如图4-5所示,内部RAM中15H单元的内容已送入R6中;继续执行第3条指令,结果显示与图4-4相同。
3)解法3。汇编程序如下:
第2条指令执行后,如图4-6所示,立即数15H单元的内容已送入Rl中;继续执行第3条指令,对Rl进行间接寻址即将RO中保存的15H看成地址,将15H单元的内容送到55H单元,结果显示与图4-4相同。
图4-5 解法2存储器窗口显示
图4-6 解法3存储器窗口显示
4)解法4。汇编程序如下:
第2条指令执行后,如图4-7所示,立即数15H单元的内容已送入A中;继续执行第3条指令,将A中的数送入55H单元,结果显示与图4-4相同。
5)解法5。汇编程序如下:
第3条指令执行后,如图4-8所示,PSW中的RS1、RS0值改变,此时R5指向内部RAM中15H单元,因此R5中存AAH;继续执行第3条指令,将R5中的数送入55H单元,结果显示与图4-4相同。
(2)编写完成任务2的汇编程序
汇编程序如下:
图4-7 解法4存储器窗口显示
图4-8 解法5存储器窗口显示
第3条指令执行后,SP寄存器的值如图4-9所示,为30H;
第4条指令执行后,结果如图4-10所示,SP寄存器的值变成31H,内部RAM中31H的单元变成了A中保存的01H,注意体会PUSH指令“先增1,再存储”的特点;
图4-9 任务2存储器窗口显示1
图4-10 任务2存储器窗口显示2
第5条指令执行后,结果如图4-11所示,SP寄存器的值变成32H,内部RAM中32H的单元变成了R2中保存的05H;
第6条指令执行后,结果如图4-12所示,SP寄存器的值变成31H,A中保存的值变成05H,注意体会POP指令“先弹栈,再减1”的特点;
图4-11 任务2存储器窗口显示3
(www.chuimin.cn)
图4-12 任务2存储器窗口显示4
第7条指令执行后,结果如图4-13所示,SP寄存器的值变成30H,R2中保存的值变成01H,完成了R2和A的交换,注意内部RAM存储单元中31H、32H仍然保留01H、05H没有变。
图4-13 任务2存储器窗口显示5
上述程序需要说明的是:
1)由于PUSH指令不能寄存器寻址,即R2不能压栈弹栈,因此压栈弹栈操作需对直接地址02H操作。寄存器指令不能压栈的原因可能是受RS0、RS1影响,使Rn物理位置不固定,压栈操作后,若物理位置改变,会给程序调试带来麻烦,并且错误非常隐蔽,不易发现。因此计算机工程师经过编程实践,决定寄存器不能压栈。而特殊功能寄存器虽名为寄存器,但寻址方式属直接寻址,因此可以进行堆栈操作。读者可利用Keil调试软件进行实验验证:
2)若入栈和出栈的顺序相反,可完成两数交换。
(3)编写完成任务3的汇编程序
1)解法1。使用MOVC A,@A+PC指令编程,汇编程序如下:
程序开始运行前可以用C:30H查看一下ROM中存储内容,如图4-14所示,30H~37H存储的是汇编程序对应的机器码,37H之后为TAB表格。执行BCD_ASCII子程序中的MOVC A,@A+PC指令后,结果如图4-15所示,07H对应的ASCII结果已保存在A中。
图4-14 任务3存储器窗口显示1
2)解法2。使用MOVC A,@A+DPTR指令编程,汇编程序如下:
图4-15 任务3存储器窗口显示2
对于程序存储器数据传送指令需要说明的是,DPTR可以通过传送指令MOV改变,而PC不能通过传送指令改变。PC和DPTR的区别可从任务3的解法1和解法2体现出来。
(4)编写完成任务4的汇编程序
编写完成64H+64H的汇编程序,并观察Keil的寄存器窗口中PSW值是否正确。
分析:64H的无符号数和有符号数表示见表4-4。
表4-4 64H所表示的无符号数和有符号数
64H+64H的运算过程如图4-16所示。
因此64H+64H后,CY和OV结果见表4-5。
表4-5 64H+64H的CY和OV结果
按照PSW定义,由图4-16可知运算后PSW为00000101B。
完成加法任务的汇编程序如下:
第1条指令执行后,结果如图4-17所示;第2条指令执行后,结果如图4-18所示。
图4-16 64H+64H的运算过程
图4-17 任务4存储器窗口显示1
图4-18 任务4存储器窗口显示2
继续完成如下加法程序,并分析PSW的值:
有关51单片机案例笔记的文章
如上述C代码中,把延时函数的定义删除了,然后把延时函数的实现搬到main函数的上面,编译后程序代码减少到63个字节,减少了4个字节,如图6-5所示。图6-4 编译结果2图6-5 编译结果3省略函数形参函数带形参,是为了在函数调用时传递实参,不但可以避免重复代码出现,还可以通过传递不同的实参值多次调用函数且实现不同的函数功能,总体代码也会得到精简。......
2023-10-28
评价程序优劣的因素1)正确性,容错性。程序设计过程与基本设计方法1)模块化;结构化;自顶而下与自底而上。4)从原理到程序实现:原理→模型→算法→流程→程序设计→调试→优化→验证→建档。常用的程序调试方法1)原则:先硬后软;先局部,后整体。程序的优化与文件编制1)参照评价因素,修改程序结构、数据结构、算法及程序等。5)使用说明功能、操作方法、出错信息与排除方法、注意事项等。......
2023-10-28
AT89S51是单片机的一种型号,这种型号下有DIP、PLCC、TQFP等封装。DIP封装的芯片从芯片插座上插拔时应特别小心,以免损坏引脚。51单片机的DIP封装如图2-8所示。图2-8 51单片机的DIP封装a)器件外观 b)器件外观及尺寸图2-8 51单片机的DIP封装(续)c)电路符号 d)焊接剖面51单片机的PLCC封装如图2-9所示。4)芯片面积与封装面积之间的比值较小。......
2023-10-28
硬件设计一个嵌入式系统的硬件电路设计包括三部分内容:单片机芯片的选择、单片机系统扩展、系统配置。2)系统的扩展与外设配置的水平应充分满足应用系统当前的功能要求,并留有适当余地,便于以后进行功能的扩充。4)整个系统中相关的元器件要尽可能做到性能匹配。2)各功能程序实现模块化、系统化。4)运行状态实现标志化管理。软件抗干扰是计算机应用系统提高可靠性的有力措施。......
2023-10-28
2)控制端低电平时,接地端MOS管截止,使非接地端MOS管漏极开路,输出“1”时须外接上拉电阻,最小系统作准双向I/O口用。P2口特点1)控制端高电平时,作为高8位地址输出口。表7-1 P3口第2功能3)对应特殊功能寄存器地址B0H。......
2023-10-28
AT89S51是一款低功耗、高性能CMOS 8位单片机,可反复擦写1000次的Flash只读程序存储器。中断控制系统 89S51单片机具有5个中断源,两个中断优先级的中断控制系统,以满足控制应用的需要。时钟电路为单片机产生时钟脉冲序列。本设计中单片机的最小系统设计如图17-2所示。当其输出为1时,光耦合器6N137的OUTPUT脚输出为高电平。当其输出为1时,报警系统关闭。......
2023-11-04
图3-4 焊接的操作姿势a)握笔法 b)正握法 c)反握法焊接步骤1)准备焊接。如焊丝中已加了焊剂,则不需要在焊接时另加焊剂。注意加热时烙铁和焊件采用面接触,不要用烙铁对焊件施加压力。2)查看是否有连焊、焊点是否拉尖的现象。6)焊接部位有无热损伤和机械损伤现象。在外观检查中发现有可疑现象时,采用手触检查。......
2023-10-28
1)使用非法的或错误的标识符,如main写成mian,写成,或使用sin(2α)、cosΦ、π*r*r等。2)变量未经定义就使用。3)变量类型使用不当。5)语句或定义结束缺少分号或误用分号。6)表达式中漏写了必要的乘号*。例如,将3*x*y+5错写成3xy+5。7)表达式中缺少必要的圆括号,或圆括号不匹配,或者用花括号、方括号取代了圆括号。......
2023-10-28
相关推荐