1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单片微型计算机原理及应用,C,Microcontrollers Principle and Applications,单击此处编辑母版标题样式,*,Microcontrollers Principle and Applications,单片机原理及应用,C,上节内容回顾,MCS51,单片机的指令,数据传送类,(,28,条,),算术运算类,(,24,条,),逻辑运算类,(,25,条,),控制转移类,(,17,条,),位操作类,(,17,条,),练习,已知累加器,A,当前的内容为,23H,,进位位,C,为,1,,执行下列指令后,累加器,A
2、和进位位,C,各为多少?,ANL A,#7FH,ORL A,#35,XRL A,#FFH,RLC A,CJNE A,#40H,AA,INC A,SJMP BB,AA,:ADD A,#23H,BB:SJMP$,第,8-9,讲教学目的和要求,【,教学目标,】,通过讲述,MCS-51,单片机的汇编语言程序设计的基本步骤、基本方法,使学生对指令系统有进一步的认识和理解,同时使得学生掌握使用汇编语言进行程序设计的方法,通过实例加以巩固。,【,教学重点,】,单片机程序设计的基本方法;,查表、差值运算、译码等简单程序设计方法;,【,教学难点,】,如何将实际问题转换成单片机能识别和解决的问题,第五章,MCS
3、51,的汇编语言程序设计,5.1,汇编语言程序设计概述,语言的发展,机器语言,(,Machine Language,),:,二进制表示指令和数据,能被机器直接识别的计算机语言。速度快、占用内存少。,汇编语言,(,Assembly Language,),:,采用助记符表示的程序设计语言。内存空间少,而且执行速度快,但移植性差。,高级语言,(High Level Language),:,高级语言则是面向用户的语言,移植性较好。,MCS51,单片机支持用,汇编语言,和,C,高级语言,进行编程,在单片机内部最终转换成,机器语言,存储和运行。,源程序的编辑与汇编,解决实际问题时,往往需要根据业务逻辑和
4、支持的指令,完成程序的,编写、调试、编译、烧制,等过程。,汇编语言程序的结构,汇编语言程序的四分段书写格式,标号字段,操作码字段,操作数字段,注释字段,START,:,MOV,A,#00H,;0A,MOV,R1,#10,;10R1,MOV,R2,#00000011B,;3R2,LOOP:,ADD,A,R2,;(A)+(R2)A,DJNZ,R1,LOOP,;R1,减,1,,,若不为,0,则循环,NOP,;,延迟,1,个机器周期,HERE:,SJMP,HERE,;,原地跳转,END,;,程序结束,5.1.1,指令的格式,注意:,标号,:表示该指令所在的符号地址,一般由字母和数字组成,,第一位为字母
5、其余位为字母、数字任选。,操作助记符不能缺少;,操作数个数可为:,1,、,2,、,3,个,根据指令本身而定;,2,个操作数的指令,,目的操作数在左边;,一般格式,标号,:,操作助记符,目的操作数,源操作数,;,注释,汇编程序设计中,每一行书写一条指令。,指令的补充说明,所有的符号均为,英文符号,,尤其注意常用的,”,”,、,”,;,”,。若书写错误,编译程序将提示“不能识别的符号”。,标号的书写,标号后必须跟,冒号,。,标号最大支持,18,个字符,且必须以,字母,开头,同一标号在一个程序中,只能定义一次,不允许用,系统保留字,作为标号,一般只有别的指令需要访问的语句才有,标号,汇编时,汇编
6、程序自动将标号转换成地址。,指令的补充说明,立即数和直接地址的书写,若是十进制数,后缀可无,也可以写,D,;其他进制必须带后缀。二进制,B,、八进制,O,、十六进制,H,。,可以是字符串,如,A,、,YU,,编译时自动转换成其,ASCII,可以是指令的,标号,美元符号,$,的使用,。,$,符号表示当前地址,一般在,程序结束或原地跳转,时使用,以下两条指令等价:,HERE,:,SJMP HERE,SJMP,$,5.1.2,伪指令,伪指令,也称,汇编命令,。仅对汇编过程进行指示,方便汇编程序将代码转换成,机器代码,。,伪指令无对应的单片机,可执行代码,伪指令具有控制汇编程序的输入输出、定义数据和符
7、号、条件汇编,分配存储空间等功能。,快速理解伪指令,:如分配存储空间伪指令,汇编程序在编译时,根据伪指令的指示,完成存储空间的划分、初值的置入等工作。无需单片机去执行。,5.1.2.1,ORG,伪指令,起始地址设定伪指令,用于指定接下来指令在,ROM,中的存放位置,使用格式:,ORG,16,位地址,(,以,四位十六进制,方式书写,),举例:有如下指令段,ORG 2000H,START,:,MOV A,,,#00H,注意,ORG,可以多次使用,使用顺序必须由小到大,ROM,MOV A,,,#00H,74H,2000H,00H,ORG,伪指令,ORG,2500H,ORG,2000H,ORG 300
8、0H,ORG 2000H,ORG 2500H,ORG 3000H,错误的书写方式,正确,的书写方式,5.1.2.2,END,伪指令,汇编终止伪指令,用于告诉汇编程序,将某一段源程序翻译成机器指令的工作,到此为止,。后面的指令将忽略。,在整个源程序的最后添加,END,语句。,举例,MOV A,,,#12H,MOV A,,,#23H,END,MOV A,,,#45H,ROM,MOV A,,,#12H,74H,12H,74H,23H,MOV A,,,#23H,5.1.2.3,DB,伪指令,定义字节数据表伪指令,用于从指定地址开始,在,ROM,的连续单元中定义,字节,数据,格式:,标号:,DB,字节数
9、据表,。用,”,”,分割表中的多个数,举例:,ORG 1000H,TABLE,:,DB 20H,32,A,8,编译时:,十进制等自动转换成十六进制,字符转换成,ASCII,码,ROM,1000H,20H,20H,41H,38H,1001H,1002H,1003H,ASCII,码表,09,:,30H39H,AZ,:,41H5AH,az,:,61H7AH,5.1.2.4,DW,伪指令,定义字数据表伪指令,从指定地址开始,在,ROM,的连续单元中定义,16,位的数据字,格式:,标号:,DW,字数据表,。用,”,”,分割表中的多个字,举例:,ORG 2000H,TABLE,:,DW 1246H,10,
10、ROM,2000H,12H,46H,00H,0AH,2001H,2002H,2003H,5.1.2.5 EQU,伪指令,用于给标号赋值,赋值后,后续程序中可用此标号表示对应的数据,格式:,标号,EQU,数据或汇编表达式,。,举例:,LEN EQU,10,*,3,SUM EQU,21H,MOV R7,LEN,MOV,SUM,A,对于常用的常量,采用此种方式后,当该常量发生变化时,无需频繁更改主程序内容,只需修改之前的赋值语句即可。,5.1.2.6 BIT,伪指令,将位地址定义成为符号名指令,赋值后,后续程序中位地址可直接用,符号名,表示,增加程序的可读性。,格式:,符号名,BIT,位地址表达式,
11、举例:,ST BIT P1.0 ;,将,P1.0,的位地址赋给符号名,ST,CF BIT 0D7H ;,将位地址为,D7H,的位定义为符号名,注意:,用,BIT,定义的“符号名”一经定义便不能重新定义和改变,5.2,汇编语言程序,设计步骤,分析问题,根据任务的要求,确定程序的功能要求、输入输出、解决步骤等问题。,算法设计,将实际问题转化为计算机处理的程序算法,算法比较与优化(内存需求与运行速度),汇编语言程序,设计步骤,流程描述,将算法的内容用,流程图,的形式表示,更加直观。,典型外设查询程序流程,汇编语言程序,设计步骤,分配内存等资源,将片,内,RAM,资源合理分配,把,内存区,、,堆栈
12、区,、,各种缓冲区,进行合理分配。确定每个区域的首地址,便于编程使用。,程序的编写与调试,根据以上工作,结合,MCS51,单片机的指令系统,完成源代码的编写,并上机调试,考查各种边界情况。,源程序的编辑,依据汇编语言规则,用好,伪指令,符号,不用中文,SJMP$,用于调试,以,.ASM,存盘,ORG 0000H,LJMP,MAIN,ORG 0040H,MAIN,:MOV R7,#16,MOV R0,#60H,MOV A,#55H,LOOP,:MOV R0,A,INC R0,DJNZ R7,LOOP,SJMP$,END,ROM,LJMP 0040H,02H,0000H,00H,40H,7FH,0
13、040H,10H,MOV R7,#16,80H,004BH,FEH,SJMP$,程序汇编及连接,源程序的汇编,汇编源程序转为目标程序的过程叫,汇编,汇编通常在,Windows,下的集成开发环境完成,用,A51.EXE,汇编生成,.OBJ,、,.LIB,及,.LST,目标程序的连接,.OBJ,、,.LIB,经,BL51.EXE,生成无扩展名的绝对地址目标文件,绝对地址目标文件可以用于仿真器调试,调试无误的目标文件用,OH51.EXE,转换为,.HEX,文件,.HEX,文件经编程器写入单片机存储器,注意事项,强化模块观念,程序模块(主程序模块、各种子程序模块),模块化优点:分块设计、便于阅读、调试
14、方便,采用循环和子程序,使程序占用空间减少、结构清晰,循环初值和结束条件,避免“死机”现象,子程序的现场保护(注意栈平衡、寄存器内容),5.3,汇编语言程序基本结构,汇编语言程序主要包含四种结构,顺序结构,分支结构,循环结构,子程序结构,5.3.1,顺序结构,指令执行时,其,执行顺序,按照指令在存储器中的,存放顺序,进行的。,开始,语句,1,语句,n,结束,【,特点,】,顺序执行,程序通常简单,;,无分支、无循环、无转移,图中无判断框;,顺序结构,举例,1,数据传送,:内部,RAM,的,2AH,2EH,单元中存储的数据如图所示。试编写程序实现图示的数据传送结果。,2EH,78H,56H,34H
15、12H,2DH,2CH,2BH,00H,2AH,ACC,2EH,56H,34H,12H,00H,2DH,2CH,2BH,00H,2AH,ACC,78H,方法,1,内部,RAM,的,2AH,2EH,单元内容传递至,2BF2EF,、,A,中。,MOV A,,,2EH,;,2,字节,,1,个机器周期,MOV 2EH,,,2DH,;,3,字节,,2,个机器周期,MOV 2DH,,,2CH,;,3,字节,,2,个机器周期,MOV 2CH,,,2BH,;,3,字节,,2,个机器周期,MOV 2BH,,,#00H,;,3,字节,,2,个机器周期,使用,14,个字节的指令代码,执行时间为,9,个机器周期,2
16、EH,78H,56H,34H,12H,2DH,2CH,2BH,00H,2AH,ACC,78H,56H,34H,12H,00H,2EH,56H,34H,12H,00H,2DH,2CH,2BH,00H,2AH,ACC,78H,方法,2,内部,RAM,的,2AH,2EH,单元内容传递至,2BF2EF,、,A,中。,CLR A,;,1,字节,,1,个机器周期,XCH A,,,2BH,;,2,字节,,1,个机器周期,XCH A,,,2CH,;,2,字节,,1,个机器周期,XCH A,,,2DH,;,2,字节,,1,个机器周期,XCH A,,,2EH,;,2,字节,,1,个机器周期,使用,9,个字节的指令
17、代码,执行时间为,5,个机器周期,2EH,78H,56H,34H,12H,2DH,2CH,2BH,00H,2AH,ACC,00H,12H,00H,34H,12H,56H,34H,78H,56H,2EH,56H,34H,12H,00H,2DH,2CH,2BH,00H,2AH,ACC,78H,顺序结构,举例,2,码制转换,:片内,RAM,的,21H,单元存放一个十进制数据十位的,ASCII,码,,22,H,单元存放该数据个位的,ASCII,码。编写程序将该数据转换成压缩,BCD,码存放在,20H,单元。,20H,36H,34H,21H,22H,数字字符的,ASCII,码为,30H,+,数,如字符,
18、3,的,ASCII,码为,33H,。,右侧表示存放的为数据,64,。,64H,程序,ASCII,到压缩,BCD,码的转换,分析,取,21H,单元低位数据,移至高位,取,22H,单元内容,去掉高位,上述结果组合,传送至,20H,单元,20H,36H,34H,21H,22H,64H,程序,ASCII,到压缩,BCD,码的转换,程序,ORG 0040H,START:MOV A,21H,;,取十位,ASCII,码,ANL A,#0FH,;,保留低半字节,SWAP A,;,移至高半字节,MOV 20H,A,;,存入,20H,单元,MOV A,22H,;,取个位,ASCII,码,ANL A,#0FH,;,
19、保留低半字节,ORL 20H,A,;,合并到结果单元,SJMP$,END,20H,36H,34H,21H,22H,ACC,36H,06H,60H,60H,34H,04H,64H,20H,X,21H,程序,平方表区,顺序结构,举例,3,查表程序,:有一变量存放在片内,RAM,的,20H,单元,其取值范围为:,00H,05H,。要求编制一段程序,使用查表指令,根据变量值求其平方值,并存入片内,RAM,的,21H,单元。,X,2,开始,A,(21H),(20H),A,表格首地址,DPTR,MOVC A,A+DPTR,结束,查表操作,程序,ORG 1000H,START,:,MOV DPTR,,,#T
20、ABLE,MOV A,,,20H,MOVC A,,,A+DPTR,MOV 21H,,,A,SJMP$,ORG 2000H,TABLE,:,DB 00,,,01,,,04,,,09,,,16,,,25,END,开始,A,(21H),(20H),A,表格首地址,DPTR,MOVC A,A+DPTR,结束,练习,根据累加器,A,的值,(,0 7FH,),查平方表,求平方值,结果放在,BA,中。,TABLE,:,DW 0000H,0001H,0004H,0009H,DW 0010H,0019H,MOV DPTR,,,#TABLE,MOVC A,,,A+DPTR,MOV B,,,A,INC A,MOVC
21、 A,,,A+DPTR,TABLE,00H,00H,00H,01H,TABLE+1,00H,ROM,04H,TABLE+2,TABLE+3,TABLE+4,TABLE+5,RL A,PUSH ACC,POP ACC,MOV DPTR,,,#TABLE,RL A,PUSH ACC,MOVC A,,,A+DPTR,MOV B,,,A,POP ACC,INC A,MOVC A,,,A+DPTR,5.3.2,分支结构,指令执行时,根据不同的情况执行不同的程序段。,单分支 双分支 多分支,单分支,结构,设累加器,A,中存储有符号数的原码,编程转换成补码,开始,保存,A,最高位,结束,最高位为,0,N,A
22、数据位取反,+1,恢复符号位,Y,CMPT,:,JNB Acc.7,RETURN,MOV C,,,Acc.7,CPL A,ADD A,,,#1,MOV Acc.7,,,C,RETURN,:,SJMP$,END,双分支,结构,设变量,x,以补码,的形式存放在片内,RAM,的,30H,单元,变量,y,与,x,的关系是:,当,x,0,时,y=x,;,当,x=0,时,,y=20H,;,当,x,0,时,y=x,;,当,x=0,时,,y=20H,;,当,x0,转结束,MOV A,#05H ;x 0,处理,ADD A,30H,MOV 30H,A ;X+05H,送,Y,SJMP DONE,5.3.3,循环结
23、构,按某种控制规律,重复执行,的程序称为,循环程序,。循环程序有,先执行后判断,和,先判断后执行,两种基本结构。,例,1,延时程序,编写一段延时,50ms,的程序,若晶振频率为,12MHz,,则一个机器周期为,1s,,,延时,50ms,,,则程序的执行时间为,50000,个机器周期。,立即数取指在,0255,之间,可考虑,200*250=50000,。,需要用到减,1,,结果不为,0,则重复的指令。,执行一条,DJNZ,指令需要,2,个机器周期,即,2s,。采用,循环计数法,实现延时,需要用到,双重循环,。,延时程序,DEL,:,MOV R7,,,#200,;,1,s,DEL1,:,NOP ;
24、1,s,DEL1,:MOV R6,,,#?,;,1,s,NOP,;,1,s,DEL2,:,DJNZ R6,,,DEL2,;,2,s,DJNZ R7,,,DEL1,;,2,s,DEL1,:MOV R6,,,#123,;,1,s,共计,(,2123,2,2,),200+1 s,,,即,50.001ms,例,2,未知次数的循环,将,内部,RAM,中起始地址为,data,的数据串传送到,外部,RAM,中起始地址为,buffer,的存储区域内,直到发现,$,字符停止传送。,data,?H,?H,data+1,内部,RAM,$,?,buffer,buffer+1,外部,RAM,问题,何时终止传送?,对取
25、出的数进行与,S,进行比较,判断是否相等。,用,CJNE,例,2,未知次数的循环,程序,将,内部,RAM,中起始地址为,data,的数据串传送到,外部,RAM,中起始地址为,buffer,的存储区域内,直到发现,$,字符停止传送。,MOV R0,,,#data,MOV DPTR,,,#buffer,LOOP:MOV A,,,R0,CJNE,A,,,$,,,继续执行地址,结束,LP,:,MOVX DPTR,,,A,INC R0,INC DPTR,SJMP LOOP,LP2:SJMP$,END,SJMP,LP2,CJNE,A,$,LP,5.4,子程序,及其调用,在实际应用中,经常会遇到一些带有,通
26、用性,的问题,在一个程序中可能要,使用多次,。这时可以将其设计成通用的子程序供随时调用,,减少代码冗余,。,一个程序中可以多次调用一个子程序,多个程序可以调用一个子程序,子程序可以调用子程序,最多支持,8,级,调用子程序时,单片机能自动保存,PC,内容,遇,RET,返回时,能自动恢复,PC,程序,1,子程序,RET,程序,2,子程序结构,子程序编写完成后,使用,ACALL,函数名,(,短距离调用,),LCALL,函数名,(,整个,ROM,区调用,),此处的,函数名,,实际上是一个标号,编译后形成具体的地址。,子程序的处理过程中,可能要影响,PSW,、,ACC,,以及其他的一些功能寄存器,若这些
27、影响是子程序功能的一部分,则无需保护;,否则,,一定要保护现场,使得主程序得以正确执行。,保护现场,子程序处理,恢复现场,RET,子程序,函数名:,通过,堆栈,进行,现场的保护,SUB1,:,PUSH PSW,;,保护现场,PUSH ACC,;,PUSH B,;,MOV PSW,,,#10H,;,换当前工作寄存器组,POP B,;,恢复现场,POP ACC,;,POP PSW,;,RET,注意:,保护和恢复的工作在子程序中进行。,保护与恢复的顺序要对应。,子程序结构,子程序参数的传递,。,调用子程序时,语句中无法携带子程序运行所需的,参数,。,明确子程序的功能后,对子程序使用的参数,应在调用之
28、前完成数据的赋值等工作。,类似乘法指令,MUL AB,,必须在此指令之前将,AB,赋值,运算才有意义。,保护现场,子程序处理,恢复现场,RET,子程序,函数名:,子程序举例,编写程序,实现,c=a,2,+b,2,。设,a,,,b,,,c,分别存于内部,RAM,的,30H,,,31H,,,32H,三个单元中,如何求数的平方,MUL AB,左移,查表,开始,调用求平方子程序,结束,a,2,R1,(31H)A,(30H)A,A+R1A,调用求平方子程序,A32H,方法,1,:直接相乘,START,:,MOV A,,,30H,;,取,a,ACALL SQR,;,调用乘法,MOV R1,,,A,;,a2
29、暂存于,R1,中,MOV A,,,31H,;,取,b,ACALL SQR,;,调用查平方表,ADD A,,,R1,;,a2+b2,存于,A,中,MOV 32H,,,A,;,存结果,SJMP$,SQR,:,PUSH PSW,MOV B,A,MUL AB,;,POP PSW,RET,开始,调用求平方子程序,结束,a,2,R1,(31H)A,(30H)A,A+R1A,调用求平方子程序,A32H,方法,2,:左移,1,次,START,:,MOV A,,,30H,;,取,a,ACALL SQR,;,调用乘法,MOV R1,,,A,;,a2,暂存于,R1,中,MOV A,,,31H,;,取,b,ACAL
30、L SQR,;,调用查平方表,ADD A,,,R1,;,a2+b2,存于,A,中,MOV 32H,,,A,;,存结果,SJMP$,SQR,:,PUSH PSW,RL A,POP PSW,RET,开始,调用求平方子程序,结束,a,2,R1,(31H)A,(30H)A,A+R1A,调用求平方子程序,A32H,方法,3,:查表,START,:,MOV A,,,30H,;,取,a,ACALL SQR,;,调用乘法,MOV R1,,,A,;,a2,暂存于,R1,中,MOV A,,,31H,;,取,b,ACALL SQR,;,调用查平方表,ADD A,,,R1,;,a2+b2,存于,A,中,MOV 32H
31、A,;,存结果,SJMP$,SQR,:,MOV DPTR,,,#TAB,;,子程序,MOVC A,,,A+DPTR,;,RET,TAB,:,DB 0,,,1,,,4,,,9,,,16,,,25,,,36,,,49,,,64,,,81,DB ,开始,调用求平方子程序,结束,a,2,R1,(31H)A,(30H)A,A+R1A,调用求平方子程序,A32H,5.5,综合举例,设有一串字符,依次存放在内部,RAM,从,30H,单元开始的连续单元中,该字符串以,0AH,为结束标识,(0AH,不计入字符长度,),,编写程序,统计该字符串个数,将该数放入累加器,A,中。,30H,?H,?H,?H,?H
32、RAM,0AH,个数,A,MOV R1,,,#30H,MOV R0,,,#00H,LP,:,CJNE R1,,,#0AH,,,NE,SJMP ED,NE,:,INC R0,INC R1,SJMP LP,ED:MOV A,,,R0,SJMP$,END,改进,MOV R1,,,#30H,MOV R0,,,#00H,LP,:,CJNE R1,,,#0AH,,,NE,SJMP ED,NE,:,INC R0,INC R1,SJMP LP,ED:MOV A,,,R0,SJMP$,END,MOV R1,,,#2FH,MOV R0,,,#0FFH,NE,:,INC R0,INC R1,LP,:,CJNE R
33、1,,,#0AH,,,NE,MOV A,,,R0,SJMP$,END,综合举例,设在,30H,和,31H,单元中各有一个,8,位数据,:,(30H)=x,7,x,6,x,5,x,4,x,3,x,2,x,1,x,0,(3lH)=y,7,y,6,y,5,y,4,y,3,y,2,y,1,y,0,现在要从,30H,单元中取出低,5,位,并从,31H,单元中取出低,3,位完成拼装,拼装结果送,40H,单元保存,即,(40H)=y,2,y,1,y,0,x,4,x,3,x,2,x,1,x,0,。,分析,:,从最终结果来看,,40H,单元的数与,30H,单元的数较为接近,可以,30H,单元数据作为,初始操作数
34、据,。,30H,单元最高,3,位无用,可先去掉。得,000 x,4,x,3,x,2,x,1,x,0,将,31H,单元高低位交换,可得到,y,3,y,2,y,1,y,0,y,7,y,6,y,5,y,4,,左移,1,位可得,y,2,y,1,y,0,y,7,y,6,y,5,y,4,y,3,,再去掉低,5,位,即,y,2,y,1,y,0,00000,。,再拼装即可,。,综合举例,设在,30H,和,31H,单元中各有一个,8,位数据,:,(30H)=x,7,x,6,x,5,x,4,x,3,x,2,x,1,x,0,(3lH)=y,7,y,6,y,5,y,4,y,3,y,2,y,1,y,0,现在要从,30H
35、单元中取出低,5,位,并从,31H,单元中取出低,3,位完成拼装,拼装结果送,40H,单元保存,即,(40H)=y,2,y,1,y,0,x,4,x,3,x,2,x,1,x,0,。,MOV 40H,,,30H,ANL 40H,,,#00011111B,MOV A,,,31H,SWAP A,RL A,ANL A,,,#11100000B,ORL 40H,,,A,本章小结,1,、伪指令:,ORG,、,DB,、,DW,、,EQU,、,END,等。,2,、程序设计步骤。,3,、常用程序结构:顺序结构、分支结构、循环结构,(,1,)顺序程序:直线程序或简单程序单重分支,(,2,)分支程序,(,3,)循环程序:,构成:初始化、循环体、控制变量的修改、循环次数的控制。,本节作业,P79,第,7,题,P80,第,8,、,10,题,






