资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第四章,MCS-51,单片机 汇编语言程序设计,【,学习目的和要求,】,了解汇编语言程序设计中的顺序结构、分支结构、循环结构程序和子程序的设计方法。,掌握代码转换和算术运算程序的基本编程方法和一些常用的子程序段,能正确地使用,MCS-51,指令编制汇编语言程序。,第四章,MCS-51,单片机汇编语言程序设计,4.1,汇编语言程序设计方法,4.2,代码转换类程序,4.3,运算类程序,第四章,MCS-51,单片机汇编语言程序设计,4.1,汇编语言程序设计方法,汇编语言特点:,高效、便捷,用汇编语言编写一个程序的过程分为,3,步:,(1),分析课题,确定计算方法、运算步骤和顺序,画出流程图。,(2),确定数据,包括工作单元的数量,分配存放单元。,(3),按所使用计算机的指令系统,根据流程图编写汇编语言程序。,顺序程序、分支程序和循环程序,再加上广泛使用的子程序和中断服务子程序。,1,顺序程序,2,分支程序,程序中含有转移指令,,无条件分支,有条件分支,有条件分支又分为:,单分支,结构和,多分支,结构。,3,循环程序,4,子程序,5,中断服务子程序,第四章,MCS-51,单片机汇编语言程序设计,1,、顺序程序,顺序程序的特点和设计方法:,结构比较简单,按程序编写顺序依次执行,程序流向不变。,使用数据传送类指令较多,程序中没有控制转移类指令。,可作为复杂程序中的某一组成部分。,第四章,MCS-51,单片机汇编语言程序设计,【,例,4-1,】,双字节二进制数求补。,程序说明:对,R3(,高,8,位,),、,R2(,低,8,位,),中的二进制定,点数取反加,1,即可得到其互补数。,程序清单:,BINPL,:,MOV A,,,R2,CPL A,;低位字节取反,ADD A,,,#01H,;加,1,MOV R2,,,A,;低位字节补码送,R2,MOV A,,,R3,CPL A,;高位字节取反,ADDC A,,,#00H,;加进位,MOV R3,,,A,;高位字节补码送,R3,RET,第四章,MCS-51,单片机汇编语言程序设计,2,分支程序,特点是程序中含有转移指令,转移指令有分为,无条件转移,和,有条件转移,,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。有条件分支转移程序按结构类型来分,又分为,单分支转移结构,和,多分支转移结构,。,一、分支转移结构,1单分支转移结构,一个入口,两个出口,两者选一。,J,Z,J,NZ,C,JNE,D,JNZ,J,NC,J,B,JNB,J,BC,第四章,MCS-51,单片机汇编语言程序设计,【,例,4-2,】,设变量,x,存放在,VAR,单元之中,函数值,y,存放在,FUNC,中,按下式给,y,赋值,:,程序清单:,VAR EQU 30H,FUNC EQU 31H,START,:,MOV A,,,VAR,;取,x,JZ COMP,;为,0,,转,COMP,JNB ACC.7,POSI,;,0,,转,POSI,MOV A,,,#0FFH,;,0,-1,送入,A,SJMP COMP,POSI,:,MOV A,#01H,;,+1,送入,A,COMP,:,MOV FUNC,A,END,2,多分支转移结构,程序的判别部分有两个以上的出口流向。,常见的两种,多分支选择指令,:,间接转移指令,:JMP A+DPTR;,比较转移指令,:CJNE,A,direct,rel,;,CJNE,A,#data,rel,;,CJNE,Rn,#data,rel,;,CJNE ,Ri,#data,rel,;,第四章,MCS-51,单片机汇编语言程序设计,【,例,4-3】32,个分支转移程序。根据入口条件转移到,32,个 目的地址。,入口,:(R3),转移目的地址的序号,00H-1FH,。,出口:转移到相应子程序入口。,程序清单:,MP,:,MOV A,,,R3,;取序号,RL A,;序号乘,2,MOV DPTR,,,#JTAB,;,32,个子程序,首地址送,DPTR,JMP,A+DPTR,;根据序号转移,JTAB,:,AJMP ROUT00,;,32,个子程序首地址,AJMP ROUT01,AJMP ROUT31,第四章,MCS-51,单片机汇编语言程序设计,3,循环程序,包括:,循环初始化、循环处理、循环控制、循环结束,计数循环控制结构 条件控制结构,图,4-4,循环程序流程图的两种组织方式,第四章,MCS-51,单片机汇编语言程序设计,【,例,4-4,】,若,Xi,均为单字节数,并按,i(i,=1,n),的顺序存放在内部,RAM,从,50H,开始的单元中,,n,放在,R2,中,要求将它们,的和,(,双字节,),放在,R3,、,R4,中。,程序清单:,ADD1,:,MOV R3,,,#00H,;清和存储单元,MOV R4,,,#00H,MOV R2,,,#n,;置循环计数初值,MOV R0,,,#50H,LOOP,:,MOV A,,,R4,;取部分和低位,ADD A,,,R0,;与,Xi,相加,MOV R4,,,A,INC R0,;,Xi,地址加,1,CLR A,ADDC A,,,R3,;低位字节向高位进位,MOV R3,,,A,DJNZ R2,,,LOOP,;未加完继续重复,END,入口:,Xi,存放在从,50H,开始的单元;,n,放在,R2,中。,出口:和存放于,R3,、,R4,中,第四章,MCS-51,单片机汇编语言程序设计,【,例,4-5,】,已知,8051,单片机使用的晶振为,6MHz,,要求,设计一个软件延时程序,延时时间为,10ms,。,延时程序的延时时间主要与所用晶振频率和延时程序中的循环次数有关。由晶振频率为,6MHz,可知,一个机器周期为,2,。,入口:,(R0)=,毫秒数;,(R1)=1ms,延时预定值。,出口:定时到,退出程序。,程序清单:,ORG 2000H,周期数,MOV R0,,,#0AH,;毫秒数,R0 1,DL2,:,MOV R1,,,#MT,;,1ms,延时值,R1 1,DL1,:,NOP 1,NOP 1,DJNZ R1,,,DL1,;,1ms,延时循环,2,DJNZ R0,,,DL2,;,10ms,延时循环,2,END,该延时程序实际上是一个双重循环程序。内循环的预定值,MT,尚需计算,:,(1+1+2),2,MT=1000(,s),MT=125=7DH,用,7DH,代替程序中的,MT,,则该程序执行后,能实现,10ms,的延时。若考虑其他指令的时间因素,则该段延时程序的精确延时时间应为:,12,s,+,(1,+,2)2,s,+,(1,+,1,+,2)2,s,12510=10062(,s,),第四章,MCS-51,单片机汇编语言程序设计,4,、子程序设计,子程序的特点和设计方法:,子程序的第一条指令的地址为子程序的入口地址,,该指令前应有标号。,主程序中用调用指令调用子程序,在子程序末尾用返回指令从子程序返回到主程序。,在子程序的开始,使用压栈指令把需要保护的内容压入堆栈;在返回主程序前,使用弹出指令把堆栈中保护的内容送回原来的寄存器或存储单元中。,在子程序中尽量使用相对转移指令,以便子程序放在内存的任何区域都能被主程序调用。,子程序的入口参数由主程序通过相关的工作寄存器、特殊功能寄存器、片内,RAM,或堆栈等传递给子程序;子程序的出口参数由子程序通过相关的工作寄存器、特殊功能寄存器、片内,RAM,或堆栈等传递给主程序。,第四章,MCS-51,单片机汇编语言程序设计,【,例,4-6,】,用程序实现,,设,a,、,b,、,c,分别存于内部,RAM,的,30H,、,31H,、,32H,单元。,主程序清单:,STAR,:,MOV A,,,30H,ACALL SQR,;调用查表子程序,MOV R1,,,A,;暂存,R1,中,MOV A,,,31H,ACALL SQR,;调查表子程序,ADD A,,,R1,;平方和存,A,中,MOV 32H,,,A,SJMP$,;等待,子程序清单:,SQR,:,INC A,;加,RET,占的一个字节,MOVC A,,,A+PC,;查平方表,RET,TAB,:,DB 0,,,1,,,4,,,9,,,16,DB 25,,,36,,,49,,,64,,,81,END,子程序入口条件:,(A)=,待查表的数。,出口条件:,(A)=,平方值。,第四章,MCS-51,单片机汇编语言程序设计,4.2,代码转换类程序,(,1,)双字节二进制数转换成,BCD,数。,转换方法:,因为,所以将二进制数从最高位逐次左移入,BCD,码寄存器的最低位,并且每次都,实现 的运算。共循环,16,次,由,R7,控制。,入口:,R3R2(16,位无符号二进制整数,),。,出口:,R6(,万位,),、,R5(,千位、百位,),、,R4(,十值、个位,),存放,5,位,BCD,码。,第四章,MCS-51,单片机汇编语言程序设计,程序清单:,BCBCD,:,CLR A,;,BCD,码寄存器清零,MOV R4,,,A,MOV R5,,,A,MOV R6,,,A,MOV R7,,,#10H,;设循环指针,LP0,:,CLR C,;,C,清,0,MOV A,,,R2,;取,16,位无符号数低字节,RLC A,;低字节带进位左移,MOV R2,,,A,;左移结果保存在,R2,中,MOV A,,,R3,;取,16,位无符号数高字节,RLC A,;高字节带进位左移,MOV R3,,,A,;左移结果保存在,R3,中,MOV A,,,R4,;实现 的运算,ADDC A,,,R4,;(,R4,),+,(,R4,),=,(,R4,),2,,带进位相加,,C,中为,ai,DA A,;十进制调整,MOV R4,,,A,MOV A,,,R5,ADDC A,,,R5,;(,R5,),+,(,R5,),=,(,R5,),2,DA A,MOV R5,,,A,MOV A,,,R6,ADDC A,,,R6,;(,R6,),+,(,R6,),=,(,R6,),2,DA A,MOV R6,,,A,DJNZ R7,LP0,RET,第四章,MCS-51,单片机汇编语言程序设计,(,2,),BCD,数转换成双字节二进制数。,转换方法:,因为,,而,运算可编成子程序。,入口:,R5(,千位,百位,),、,R4(,十位,个位,),为,BCD,码。,出口:,R5R4(16,位无符号二进制整数,),。,第四章,MCS-51,单片机汇编语言程序设计,程序清单:,BCDB,:,MOV A,,,R5,MOV R2,,,A,;取千位、百位,BCD,码,ACALL BCDB1,;调用子程序,MOV B,,,#64H,MUL AB,;乘以,100,MOV R6,,,A,;乘积低,8,位送,R6,XCH A,,,B,;交换乘积高、低位,MOVR5,,,A,;乘积高位送,R5,MOV A,,,R4,;取十位、个位,BCD,码,MOV R2,,,A,;送入,R2,ACALL BCDB1,;调用子程序,ADD A,,,R6,;加千位、百位乘积低,8,位,MOV R4,,,A,;送入,R4,MOV A,,,R5,;乘积高,8,位送,A,ADDC A,,,#00H,;加进位位,MOV R5,,,A,;存结果,HERE,:,SJMPHERE,子程序清单:,BCDB1,:,MOV A,,,R2,;取,BCD,码,ANL A,,,#0F0H,;屏蔽低,4,位,SWAP A,MOV B,,,#0AH,MUL AB,;高位,BCD,码乘以,10,MOV R3,,,A,;乘积送,R3,MOV A,,,R2,;取,BCD,码,ANL A,,,#0FH,;屏蔽高,4,位,ADD A,,,R3,;高位加低位,BCD,码,MOV R2,,,A,;送,R2,RET,第四章,MCS-51,单片机汇编语言程序设计,(,3,),4,位二进制数转换为,ASCII,码。,转换方法:,数字,09,的,ASC
展开阅读全文