单片机之汇编语言设计.ppt

上传人:小飞机 文档编号:5937832 上传时间:2023-09-06 格式:PPT 页数:64 大小:1.31MB
返回 下载 相关 举报
单片机之汇编语言设计.ppt_第1页
第1页 / 共64页
单片机之汇编语言设计.ppt_第2页
第2页 / 共64页
单片机之汇编语言设计.ppt_第3页
第3页 / 共64页
单片机之汇编语言设计.ppt_第4页
第4页 / 共64页
单片机之汇编语言设计.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《单片机之汇编语言设计.ppt》由会员分享,可在线阅读,更多相关《单片机之汇编语言设计.ppt(64页珍藏版)》请在三一办公上搜索。

1、,第4章 汇编语言程序设计,4.1 概 述,4.2 简单程序,4.3 分支程序,4.4 循环程序,4.6 子程序的设计及调用,4.7 程序设计举例,4.5 查表程序,下页,4.1 概 述,一、汇编语言和高级语言相比具有下列优点:,上页,下页,回目录,专有特性,MOV P1,A,如:输出操作,二、汇编语言程序设计的步骤:,三、汇编语言程序的结构,上页,下页,回目录,例1:内部RAM从DATA1单元有一数据块,存放若干无符号数,第一单元为数据块长度,求这些无符号数之和。,起始地址,程序主体,汇编结束标志,标号,注释,上页,下页,回目录,上页,下页,回目录,四、评价程序质量的标准:,程序的执行时间,

2、程序所占用的内存字节数目,程序的逻辑性、可读性,程序的兼容性、可扩展性,程序的可靠性,时 间空 间,4.2 简单程序,简单程序的特点:,既无分支,又无循环,按照顺序执行,例4-2:将一个字节内的两个BCD码拆开并变成ASCII码,存入两个RAM单元。BCD码放在内RAM的20H,转换后高半字节放到21H,低字节放22H。,BCDH BCDL,0011,0011,方法1:,BCD码09对应的ASCII码为30H39H转换时,将20H中的BCD码拆开,高四位置为“0011”即可。,BCDH,BCDL,上页,下页,回目录,可完成一定的基本功能,是编写复杂程序的基础,程序:,0011 BCDH,000

3、0 0000,;两个BCD数送A,;BCDL数送22H,;完成转换,;BCDH数送A的低4位,;完成转换,;存数,BCDH BCDL,BCDL,0000,0011,0000,BCDH,0011,上页,下页,回目录,;原地踏步,相当与停机,方法1小结:,以上程序用了8条指令,15个内存字节,执行时间为9个机器周期。,方法2:,采用除10H取余法将两个BCD数拆开,BCDH BCDL,0001 0000,0000 BCDH,0000 BCDL,DIV AB,上页,下页,回目录,0011 BCDH,0011 BCDL,程序:,;取BCD码至A,;完成转换,;存ASCII码,;完成转换,;存ASCII

4、码,BCDH BCDL,0001 0000,0000 BCDH,0000 BCDL,DIV AB,0011,0011,上页,下页,回目录,方法2小结:,以上程序用了7条指令,16个内存字节,执行时间为13个机器周期。,双字节求补设:两个字节原码数存在R1、R0中求补后结果,存在R3、R2中。,例4-3:,方法:,求补采用“模-原码”的方法,上页,下页,回目录,即用“0”去减“原码”,-),程序:,CLR C,CLR A,SUBB A,R0,MOV R2,A,CLR A,SUBB A,R1,ORG 1000H,MOV R3,A,SJMP$,END,;低字节求补,;送R2,;A清零,;高字节求补,

5、;送R3,上页,下页,回目录,将内部RAM的20H单元中的8位无符号二进制数,转换为3位BCD码,并将结果存放在FIRST(百位)和SECOND(十位、个位)两个单元中。,例4-4:,解:,可将被转换数除以100,得百位数;余数除以10得十位数;最后余数即为个位数。,编程如下:,例如:255(十进制)除以100,得 2(百位数)余数除以10,得5(十位数)最后余数5即为个位数,上页,下页,回目录,5 5 H,程序(设(20H)=0FFH):,;除100,;百位BCD,;除10,;除数10 B,;十位数送高位,;A为十位、个位BCD,;存十位、个位数,0FFH,6 4H,0 2H,3 7H,0

6、AH,3 7H,MOV A,B,0 5H,0 5H,5 0H,5 5H,0 2 H,上页,下页,回目录,FIRST,SECOND,4.3 分支程序,简单分支:,测试标志位,解:,这是一个简单分支程序,可以使两数相减,若CY=1,则被减数小于减数。用JC指令进行判断。,N路分支:,利用散转指令JMP A+DPTR可转向任一处理程序,例4-5 设内RAM 30H,31H存放两个无符号数,试比较 两数的大小,较小的数存入30H单元,较大的数 存入31H单元。,程序的流程图如下:,简单分支程序举例:,上页,下页,回目录,多重分支:,判断程序设置的条件,判断2个以上的条件,被称为复合条件,根据程序运行情

7、况,可以有N种选择,程序:,;做减法比较两数,;若(30H)小,则转移,;交换两数,流程图:,CY=1则转移,若CY1则顺序执行,上页,下页,回目录,例4-6:空调机制冷时,若排出的空气温度比吸入的空气 温度低8则认为工作正常,否则便认为是故障,并设置故障标志。,解:,为了可靠的监控空调机的工作情况,做两次减法:第一次(40H)-(41H),若CY=1,则肯定有故障;第二次两个温度的差值减去8,若CY=1,则肯定有故障,程序的流程图如下:,上页,下页,回目录,首先定义一些工作单元,低,高,置热?,置冷能力不足?,流程图:,上页,下页,回目录,故 障,正常,入 出,故 障,程序:,;A(40H)

8、-(41H),;CY=1,则故障,;是则故障,;温度小于8?,;工作正常标志,;转出口,;设置故障标志,若CY1顺序执行,CY=1转移,CY=1转移,若CY1顺序执行,上页,下页,回目录,;停机,多重分支程序举例,例4-7:设30H单元存放的是一元二次方程ax2+bx+c=0 根的判别式=b2 4ac的值。,试根据30H单元的值,编写程序,判断方程根的三种情况。在31H中存放“0”代表无实根,存放“1”代表有相同的实根,存放“2”代表两个不同的实根。,解:,为有符号数,有三种情况,这是一多重分支程序 即小于零,等于零、大于零。可以用两个条件转移指令来判断,首先判断符号位,用指令JNB ACC.

9、7,rel判断,若ACC.7=1,则一定为负数;此时0 若ACC.7=0,则0。此时再用指令JNZ rel 判断 若0,则 0,否则=0,上页,下页,回目录,流程图:,上页,下页,回目录,0,则无实根,=0,则 1个实根,0,则2个实根,P124,程序:,;0 无实根,;=0 有相同实根,;0转 TOW,;有两个不同实根,上页,下页,回目录,P124,4.4 循环程序,循环程序:一些有规可循而又反复处理的问题,利用比较转移指令CJNE、减1不为“0”转移指令DJNZ等实现,例4-13:在内部RAM 30H4FH 连续32个单元中存放了 单字节无符号数,求32个无符号数之和,并存入内部RAM 5

10、1H,50H中。,解:,这是重复相加问题,要设置一些工作单元 设:R0 做加数地址指针,R7 做循环次数计数器,R3 做和数的高字节寄存器。,程序的流程图如下:,上页,下页,回目录,地址指针,循环次数计数器,流程图:,上页,下页,回目录,N,Y,N,Y,(A)+(R0)A,(R3)+1R3,P130,程序:,;取被加数,;R0作加数地址指针,;CY=0,和256,则转,;作加法,;CY=1,加到高字节,;修改R0指针,;未完,重复加,;存和数,初始化部分,循环体部分,结束部分,上页,下页,回目录,循环执行直到R7=0,循环控制,循环程序的结构,P129,例4-14:从外部RAM BLOCK单元

11、开始有一无符号数数据块,,数据块长度存入LEN单元,求出其中最大数存入MAX单元。,为了方便进行比较,我们使用CY标志来判断两数的大小,使用B寄存器作比较与交换的寄存器,使用DPTR作外部RAM地址指针。,解:这是一个基本搜索问题,采用两两比较法。,取两者较大的数再与下一个数进行比较,若数据块长度LEN=n则应比较n-1次,最后较大的数就是数据块中的最大数。,程序的流程图如下:,上页,下页,回目录,P130 请阅读!,阅读,流程图:,上页,下页,回目录,A中 的数总是较大,较大数交换至A,恢复较大数至A,初始化工作单元,编程:,;定义长度计数单元,上页,下页,回目录,;取数至A,;0CY,;修

12、改指针,;暂存于B,;取下一数,;大者送A,;若(A)(B)则恢复A,;未完继续比较,;存最大数,;*若用RET指令结尾则 该程序可作子程序调用,;作减法比较,RET,例4-15:从外部RAM BLOCK单元开始有一数据块,数据块长度存入LEN单元,,试统计其中正数、负数和零的个数,分别存入PCOUNT、MCOUNT、ZCOUNT单元。,解:这是一个多重分支的单循环问题。数据块中是带符号数,先用JB ACC.7,rel 指令判断符号位。,程序的流程图如下:,若ACC.7=1,则该数一定是负数,MCOUNT单元加1;,若ACC.7=0,则该数可能是正数,也可能是零;,用JNZ rel 判断A是否

13、为零,若A0,则一定是正数,PCOUNT单元加1;,若既不为正也不为负,则一定是零,ZCOUNT单元加1;,上页,下页,回目录,P132请阅读!,阅读!,流程图:,上页,下页,回目录,P132,负数,正数,零,程序:,上页,下页,回目录,上页,下页,回目录,P132,作业 P156:1、4、5、6,!,4.5 查表程序,上页,下页,回目录,对于复杂参数的计算如:,非线性参数,对数、指数、三角函数,微分、积分等,用汇编编程十分困难,甚至无法建立数学模型,用查表的方法简单便捷,MCS-51指令系统中有两条指令具有极强的查表功能,(1)MOVC A,A+DPTR,作基址寄存器,作变址寄存器,长查表指

14、令,寻址64KB,(2)MOVC A,A+PC,作基址寄存器,作变址,短查表指令页内查表指令,指向表格首址,指向表格的第 i 项,第i项加变址调整值,例4-20:一个十六进制数放在HEX单元的低四位,将其转换成ASCII码,查表程序:,解:,十六进制 09 的ASCII码为 30H39H,AF 的ASCII码为 41H46H,,利用查表指令 MOVC A,A+DPTR,MOVC A,A+PC,先用伪指令 DB 或 DW 把表格的数据存入ROM,上页,下页,回目录,来获得数据,ASCII码表格的首址为ASCIITAB,上页,下页,回目录,编程1:,0 1 2 3 4 5 6 7 8 9,A B

15、C D E F,(A)=3,33H,(A)=15,46H,编程2:,;2字节,;1字节,#3,上页,下页,回目录,;变址调整,ALU,(PC)=0207H,01H,04H,31H,查十六进制数“01H”的ASCII码(PC做基址),上页,下页,回目录,ALU,01H,31H,查十六进制数“01H”的ASCII码(DPTR做基址),020BH,上页,下页,回目录,4.6 子程序的设计及调用,一、子程序的概念,把能完成某种基本操作,并具有相同操作的程序段,单独 编成子程序。如:函数、运算、代码转换、数据采集、延时等,利用调用子程序指令(ACALL或LCALL)和从子程序返回指令RET,使用子程序的

16、优点,不必重复书写同样的程序,提高编程效率,程序的逻辑结构简单,便于阅读,缩短了源程序和目标程序的长度,节省了存储器空间,使程序模块化、通用化、便于交流共享资源,便于按某种功能调试,上页,下页,回目录,二、调用子程序的要点,子程序开头的标号段必须有一个标志,该标志既是 子程序的名字又是其入口地址,以便主程序调用。,在主程序中利用指令ACALL或LCALL可转入子程序。该指令具有保护断点的功能,例如:调用延时子程序,LCALL(ACALL)DELY,子程序结尾必须使用一条从子程序返回指令RET,它具有恢复断点的功能,主程序,CALL断点,子程序,RET,1、子程序的结构,上页,下页,回目录,2、

17、参数传递,子程序入口条件:,在调用一个子程序时,主程序应先把有关参数放到某些约定的位置,子程序运行时,可以从约定的位置得到有关参数。,子程序出口条件:,子程序结束前,也应把处理结果送到约定位置,参数传递的方法:,子程序无须传递参数,这类子程序中所需要的参数是子程序赋予,不需要主程序给出,上页,下页,回目录,主程序:,子程序:,不需主程序提供入口参数,从子程序开始到子程序返回,大约为20ms,例4-23 调用延时子程序DELY,子程序开始的标号,子程序返回指令,调用子程序,上页,下页,回目录,982=196s,1s,1s,设:主频为12MHZ,2s,(196+2+2)100,+3,=20003s

18、=20.003ms,2s,1s,+3,意味着每个机器周期为1s,用累加器和工作寄存器传递参数,入口参数:,放在累加器A和工作寄存器中R0 R7中,出口参数:,放在累加器A和工作寄存器中R0 R7中,例4-24 双字节求补子程序CPLD,解:采用“变反加1”的方法,十六位数变反加1,不仅低字节要加1,高字节要加低字节的进位。故采用ADD指令,不采用INC指令。INC指令不影响CY位,上页,下页,回目录,入口参数:(R7R6)=16位数,出口参数:(R7R6)=求补后的16位数,上页,下页,回目录,Cy,+Cy,R7R6,R7R6,通过操作数地址传递参数,入口参数:(R0)=求补数低字节指针,(R

19、7)=n-1,出口参数:(R0)=求补后高字节指针,例4-25 n字节求补子程序CPLN,上页,下页,回目录,地址,通过堆栈传递参数,解:由于要进行两次转换,故可调用查表子程序完成,主程序,*PCH,*PCL,HEX,栈底,断点地址,上页,下页,回目录,子程序,上页,下页,回目录,HEX,Result,Result,PC,HEX,HEX,*PCL,*PCH,断点,ASC,主程序,子程序,上页,下页,回目录,3、现场保护,现场保护:如果子程序使用的寄存器与主程序使用的寄存器 有冲突,在转入子程序前,特别是进行中断服务 子程序时,要进行现场保护。,保护内容:主程序使用的内部 RAM 内容,各工作寄

20、存器内容,累加器 A 和 DPTR 以及 PSW 等寄存器内容。,保护方式:将要保护的单元压入堆栈。,上页,下页,回目录,中断保护时:还可以用 RS1 RS0 来选择其他通用寄存器组,以便保护主程序现场。,R0 R7,冲突,例如:十翻二子程序的现场保护,推入与弹出应按照“先进后出”,或“后进先出”的顺序,上页,下页,回目录,三、子程序的调用及嵌套,1、子程序的调用,上页,下页,回目录,请阅读P144,使用 LCALL 或 ACALL 指令,主程序:,上页,下页,回目录,请阅读P144,子程序:,A37 A30,0,0,A37,A36,A36 0,A26 A37,A16 A27,A06 A27,

21、上页,下页,回目录,2、子程序的嵌套,子程序的嵌套:子程序中可调用其他子程序,上页,下页,回目录,子程序与主程序的概念是相对的,在一个子程序中又可调用其它子程序,这就是子程序的多重嵌套。,多重嵌套的过程,*PC0L,*PC0H,*PC1L,*PC1H,*PC2H,*PC2L,主程序,LCALL SUB1,继续主程序,*PC0,断点入栈,LCALL SUB2,*PC1,断点入栈,LCALL SUB3,*PC2,断点入栈,RET,弹出断点,RET,弹出断点,RET,弹出断点,上页,下页,回目录,栈 底,堆栈的设置是十分重要的,请阅读P146,4.7 程序设计举例,例4-29 多字节无符号数减法子程

22、序NSUB,功能:n字节无符号数减法,出口:(R0)=差数高字节地址指针,上页,下页,回目录,请阅读P147148,流程图:,程序:,上页,下页,回目录,请阅读P147148,例4-30 双字节无符号数快速乘法子程序MULD,功能:双字节无符号数乘法,积为32位,出口:(R0)=乘积的高字节地址指针,上页,下页,回目录,编程思路与手乘法相似:,被乘数,乘数,上页,下页,回目录,bdH,bdL,adH,adL,bcL,bcH,acL,acH,bdL,adH,相乘过程,上页,下页,回目录,按位权对齐,位权,位权,请阅读P148 149,程序,上页,下页,回目录,请阅读P149,上页,下页,回目录,请阅读P149,例4-33 多字节十进制加法子程序BCDADD,功能:n字节十进制加法,出口:(R0)=和数高字节地址指针,上页,下页,回目录,请阅读P152,程序:,上页,回目录,过“9”补“6”,CY,AC,BCDH,BCDL,请阅读P152,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号