资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第三章 MCS-51单片机汇编语言程序设计,3.1 概述,一、二种程序语言,汇编语言,:短、快;充分发挥硬件功能。,执行效率高,高级语言(C语言),:长、慢;硬件控制麻烦;,编程效率高,单片机能执行的程序是,机器语言,(目标程序)。,二、目标程序两种文件格式,用于写入单片机或仿真调试。,BIN文件:,二进制文件,机器码。,HEX文件:,INTEL公司定义,,地址、数据和校验码,ASCII码存储,可显示、打印,需用符号转换程序OHS51转换,三、两种语言的操作过程:,图3-1,连接/定位器,L51,汇编语言,源程序,汇编器A51,符号转换程序OHS51,绝对地址目标程序,.BIN,C语言程序,浮动地址目标程序,编译器C51,HEX,图 3-1 两种语言源程序转换成目标程序,编辑器、汇编器、编译器、连接/定位器、,符号转换程序、.,WAVE、,KEIL uVision2,WAVE集成软件:,P248,五、汇编与汇编程序,汇编语言,源程序,转换成机器语言,目标,程序。,四、集成开发环境,1、汇编的两方法,手工汇编,人工查指令表,得到程序中每条指令对应的机器代码,,人工计算地址,。早期使用。,机器汇编,用汇编程序对汇编语言源程序进行汇编。,源程序要提供给一些附加信息,遵循汇编程序的一些约定。用伪指令实现。,1)确定程序中每条汇编语言指令的,机器码,2)确定每条指令在存储器中的存放,地址,3),语法检查,,提供错误信息,4),生成,目标执行文件(*.OBJ/*.HEX)、,列表文件(*.LST)、.,地址 机器码源程序,ORG 2000H,2000H 78 30 MAIN:MOV R0,#30H,2002H E6 MOV A,R0,2、汇编的主要任务,六、汇编语言程序设计步骤,与书中不太一样,1、确定,方案,和计算方法,2、了解应用系统的,硬件配置,、,性能指标,3、建立系统数学模型,确定控制算法和操作步骤,4、,合理分配,存储器单元,和了解,I/O接口地址,5、编制源程序,1)按,功能,模块,设计程序,明确各程序之间的相互关系,2),用,流程图,表示程序结构和功能,开始,1,Y,N,?,3)程序中用,注释,说明指令在程序中的作用,方便阅读、,调试,和修改,1.机器指令,:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被CPU执行。,2.伪指令,:汇编控制指令,没有,机器,代码,只用于汇编过程,为汇编程序提供汇编信息。,3、宏指令,定义、调用,一、汇编语言指令类型,伪,指令,ORG 3000H,例3-11 片内RAM无符号数排序(P57),MOV A,#0 ;表的起始字节的偏移量为0,ORL C,00H;最终结果YC,分析:在程序存储器安排一张平方表,首地址为TAB,以DPTR指向表首址,A存放变量值,利用查表指令MOVC A,A+DPTR,即可求得。,MOV R0,A ;,单片机能执行的程序是机器语言(目标程序)。,L1:DS 32;从L1地址开始保留32个存储单元。,CPL A ;,ANL C,/X4;X4 X5 X6 X7,FRT:MOV A,40H;,SETB 00H,7分别记为X0X7,编制程序用软件实现下式:Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7,宏调用:,宏指令名,实际参数,宏指令名,实际参数,宏定义:,宏指令名,MACRO,形式参数,;被定义的程序段,ENDM,二、常用伪指令及功能,ORG,nn,定义程序或数据块的起始地址,,连续存放在程序存储器中。,例:,指令地址 机器码源程序,ORG 2000H,2000H 78 30 MAIN:MOV R0,#30H,2002H E6 MOV A,R0,ORG 3000H,3000H 23 TAB:DB 23H,100,A,3001H 64,3002H 41,标号:,DB,表达式,,在程序存储器中以标号为起始地址存放字节数据。,例:,LN,:,DB 32,C,25H,-1,地址,数据,LN,20,LN+1,43,LN+2,25,LN+3,FF,3.字定义,标号:,DW,表达式,,在程序存储器中以标号为起始地址存放字数据。,低地址高字节!,例:,GH,:,DW 1234H,5678H,08,GH,12,34,GH+2,56,78,GH+4,00,08,5.等值指令,符号,EQU,表达式 表示EQU两边的量等值,用于为或标识符赋值。例:X1 EQU 2000H X2 EQU 0FH MAIN:MOV DPTR,#X1 ;DPTR=2000H ADD A,#X2 ;A=A+0FH,4保留字节,标号,:,DS,数值表达式,在程序存储器中保留以标号为起始地址的若干,字节单元,单元数由数值表达式指定。,例:,L1:DS 32;从L1地址开始保留32个存储单元。,6.,位定义,符号,BIT,位地址,类似,EQU,指令,定义的是位操作数地址。,例:。,7.,汇编结束,END,源程序段结束。,汇编程序对,END指令后的内容不处理。,A51,汇编程序其它伪指令:,P50表,3-1,顺序程序(简单程序),程序走向只有一条路径。,常用程序结构,顺序程序,分支程序,循环程序,子程序,例3-1 外部数据存储器的000EH和000FH单元的内容交换,000EH,000FH,000EH,000FH,000EH,000FH,000EH,000FH,分析:,只能用MOVX与A间传送;,必须用中间变量(20H)暂存;,低八位地址用R0、R1指示;,高八位地址由P2指示。,程序如下页:,000EH,000FH,000EH,000FH,000EH,000FH,ORG 0000H,MOV P2,#0H ;送地址高八位至P2口,MOV R0,#0EH ;R0=0EH,MOV R1,#0FH ;R1=0FH,MOVX A,R0 ;A=(000EH),MOV 20H,A ;(20H)=(000EH),MOVX A,R1 ;A=(000FH),XCH A,20H ;A=(000EH),(20H)=(000FH),MOVX R1,A,MOV A,20H,MOVX R0,A ;交换后的数送各单元,SJMP$,END,例3-2:将R4R5双字节符号数求补程序。,ORG 0000H,MOV A,R5;取低字节,CPL A,ADD A,#1 ;低字节变补,MOV R5,A,MOV A,R4;取高字节,CPL A,ADDC A,#0;高字节变补,ORL A,#80H;恢复负号,MOV R4,A,END,加此指令有问题,书P51例3-2为(31)(30H)求补,也有问题!,地址,数据,TAB,0,TAB+1,1,TAB+2,4,TAB+3,9,TAB+4,16H,TAB+5,25H,例3-3 片内RAM的20H单元变量值为00H05H,用查表法 其平方值,存入片内RAM的21H单元。,ORG 0000H,MOV DPTR,#TAB,MOV A,20H,MOVC A,A+DPTR;查表,MOV 21H,A,SJMP$,TAB2:DB 00H,01H,04H,09H,16H,25H,END,分析:在程序存储器安排一张平方表,首地址为TAB,以DPTR指向表首址,A存放变量值,利用查表指令MOVC A,A+DPTR,即可求得。,表中数据用BCD码存。,若平方值为两字节,程序应如何改?,若用MOVC A,A+PC呢?,DPTR,A,例(书无):分解压缩型BCD码为非压缩型式BCD码。,ORG 0000H,MOV R0,#40H;设指针,MOV A,R0;取一个字节,MOV R2,A;暂存,ANL A,#0FH;清0高半字节,INC R0 ;R0=41H,MOV R0,A ;保存数据个位,片内RAM,42H,41H,40H,65,MOV A,R2,SWAP A ;十位换到低半字节,ANL A,#0FH,INC R0 ;R0=42H,MOV R0,A;保存数据十位,END,05,06,ORG 0000H,MOV A,R2,JNB ACC.7,N,;为正数?,CPL A,;负数求补,INC A,MOV R2,A,N:SJMP$,;结束,3.4 分支程序,由条件转移指令构成程序判断框部分,,,形成分支结构,3.4.1 单分支程序,一个条件判断,有两种分支结构。,条件满足?,N,影响条件,Y,处理段,条件满足?,N,影响条件,Y,处理1,处理2,例1 求8位有符号数的绝对值。,方法:正数不变,负数求补。,例2 根据行李重量计算行李运费,以10kg为1个计价单位G,G在40H单元中。计价方法:为50kg以内按3元;50kg以上部分按2元计价。,由此列出算式:,G3+(G-5)2,;当G5,M=,G3 ;当G5,3G因重复使用,先暂存在R2。流程见左,程序如下页:,ORG 0100H,FRT:MOV A,40H,;取行李重量计价单位G,MOV R3,A,MOV B,#03H,;,运费,M=G3,MUL AB,MOV R2,A,;暂存3G,MOV A,R3,;取回G,CJNE A,#05H,L1,;G 5?,SJMP WETC,L1:JC WETC,;是,转至WETC,SUBB A,#05H,;否则 M=3G+2(G-5),RLC A,ADD A,R2,MOV R2,A,WETC:MOV 41H,R2,;存运费 M,RET,根据,多种,输入条件或,多种,运算结果,转向不同的处理程序。,通常用JMP A+DPTR间接转移指令实现。,有两种设计方法:,1.查转移地址表:,将,转移地址,列成表格,将表格的内容作转移的目标地址。,2.查转移指令表:,将转移到不同程序的,转移指令,列成表格,判断条件后查表,转到表中指令执行。,程序例子见下页。,1.利用转移地址表实现转移,例3-7 根据R3的内容转向对应的程序,R3=0n,处理程序入口符号地址为PR0PRn(n128)。,分析:PR0PRn列成表格,每一项占两个单元;,PRn在表中的偏移量为2n,R3乘2得偏移地址;,(2n)、(2n+1)为高/低八位地址,送DPTR;,用JMP A+DPTR(A先清零)即转移到PRn入口。,PR0,EQU 0110H ;用伪指令定义PRn的具体地址,PR1 EQU 0220H,PR2 EQU 0330H,MOV A,R3,;R3A,ADD A,ACC,;A*2,MOV DPTR,#TAB,PUSH ACC,MOVC A,A+DPTR,;取地址表中高字节,MOV B,A,;暂存于B,INC DPL,;有问题!,POP ACC,MOVC A,A+DPTR,;取地址表中低字节,MOV DPL,A,MOV DPH,B,;DPTR为表中地址,CLR A,;A=0,JMP A+DPTR,;转移,TAB:DW PR0,PR1,PR2,.,PRn;,转移地址表,01,10,02,20,.,TAB,TAB+2,DPH DPL,例 R3=1的操作,02,20,2.利用转移指令表实现转移,例3-8 设有五个按键编码分别为3AH、47H、65H、70H、8BH,已存于B中,要据此键转向不同的处理程序,分别为PR0、PR1、PR2、PR3、PR4。,分析:键码列表(一字节),AJMP指令列表(二字节);,B与键码表逐项相比,得序号,乘2得AJMP表的偏移地址;,用JMP A+DPTR转向AJMP指令,从而实现多分支转移。,设JPT的地址为001AH、PR0入口地址为0110H,P39:2.4.2节,,求AJMP PR0的机器码:,001A=0000 0,000 0001 1010,0110=0000 0,001,0001 0000,001,0 0001,0001 0000,(2110h),a10a9a8,a7a6a5a4a3a2a1a0,程序中不必写机器码,PR0入口地址为0100H,AJMP PR0的机器码为,2110H,,,PR1 ,AJMP PR1,0220H,,,PR2,入口地址为0220H,AJMP,PR2,的机器码为,4120H,。,设B=,65H,键值为,2,:,20,41,JPT+4,20,02,JPT+2,10,21,JPT,AJMP PR0,AJMP PR1,AJMP PR2,TAB,3AH,TAB+1,47H,TAB+2,65H,TAB+3,70H,转移指令表JPT,键码表TAB,65H,A,2,B,2A,A=1,A=2,A=0,65H,65H,MOV DPTR,#TAB ;置键码表首址,MOV A,#0 ;表的起始字节的偏移量为0,NEXT:,PUSH ACC,MOVC A,A+DPTR ;A=键码表的编码,CJNE A,B,AGAN ;将B中值和键码表的值比较,POP ACC,RL A ;如相等,序号乘2得分支表内偏移量,MOV DPTR,#JPT ;置分支表首址,JMP A+DPTR,AGAN:,POP ACC,;不相等比较下一个,INC A ;序号加1,CJNE A,#5,NEXT,SJMP$;键码查完还没有B中按键编码程序结束,JPT:AJMP PR0 ;分支转移表,AJMP PR1,AJMP PR2,AJMP PR3,AJMP PR4,TAB:DB 3AH,47H,65H,70H,8BH;键码表,END,循环程序可重复执行指令段多次,使程序缩短,节省存储单元,但不节省执行时间。,循环次数控制有两种方式:,1、先判断再处理,:先判断循环条件是否满足,如不满足,就不循环,,多以循环条件控制,。,2、先处理再判断,:循环执行一遍后,再判断下一轮是否还循环,,多以计循环次数控制,。,特别注意循环次数设置正确,不能死循环,。,单重循环:,多重循环:,内外循环不能交叉;,不允许外循环跳入内循环,。,3.5 循 环 程 序 设 计,例 3-9 10ms延时子程序,单片机晶振为6MHz。,分析:,两个因素:,晶振频率,和,循环次数,;,晶振6MHz,一个机器周期是,2s,;,用内循环实现1ms延时,外循环10次。,由1ms计算内循环次数:,从P295,附录A,查每条指令机器周期;,内循环次数设为未知数,MT,;,列式计算内循环次数。,NEXT:PUSH ACC,ADDC A,0,MT=125=7DH,根据多种输入条件或多种运算结果,转向不同的处理程序。,POP ACC,28 H,存最高字节积高字节,有问题!,4、合理分配存储器单元和了解I/O接口地址,P59例3-13:十进制转换为二进制,这是程序设计的重要技巧之一。,1)确定程序中每条汇编语言指令的机器码,思考:不用PUSH、POP,将低字节进位加到R2中。,HEX文件:INTEL公司定义,,POP PSW,4)生成目标执行文件(*.,例3-1 外部数据存储器的000EH和000FH单元的内容交换,根据多种输入条件或多种运算结果,转向不同的处理程序。,ORG 0020H,MOV R0,#0AH;外循环10次,DL2:MOV R1,#MT;内循环MT次,DL1:,NOP,NOP ;,空操作指令,DJNZ R1,DL1,DJNZ R0,DL2 RET,1,1,1,1,2,2,(,1+1+2,)2SMT=1000S,MT=125=7DH,实际延时时间:,1,+,1,+(,1+1+2,)125+,2,102S,若需要延时更长时间,可以采用多重循环。,机器周期数,内,外,一重最大延时?,能否准确延时?,例3-10 编写多字节数10程序。,首址20H多字节,无,符号数,低地址低地址,R7字节数,乘10后的积仍存放在原地址中。,345 H,0A H,32 H,28 H,2B H,1E H,20B H,分析:,用R1为多字节数的地址指针,,部分积的低字节仍存放于本单元,,部分积的高字节存放于R2,,以便和下一字节的部分积的低位相加。以R7作字节数计数。,CLR C ;清进位位C,MOV R1,#20H;R1指示地址,MOV R2,#00H;存积的高八位寄存器R2清0,S10:MOV A,R1 ;取一字节送A,MOV B,#0AH ;10送B,PUSH PSW,MUL AB ;字节乘10,POP PSW,ADDC A,R2 ;上次积高八位加本次积低八位,MOV R1,A ;送原存储单元,MOV R2,B ;积的高八位送R2,INC R1 ;指向下一字节,DJNZ R7,S10 ;未乘完去SH10,否则向下执行,MOV R1,B ;存最高字节积高字节,有问题!,思考:不用PUSH、POP,将低字节进位加到R2中。,例3-11 片内RAM无符号数排序(P57),START:CLR 00H,CLR C,MOV R7,#0AH,MOV R0,#30H,MOV A,R0,LOOP:INC R0,MOV R2,A,SUBB A,R0,MOV A,R2,JC NEXT,SETB 00H,XCH A,R0,DEC R0,XCH A,R0,INC R0,NEXT:MOV A,R0,DJNZ R7,LOOP,JB 00H,START,SJMP$,此程序有错!,P58例3-12:多字节BCD码减法,P59例3-13:十进制转换为二进制,在实验中调试验证。,MCS-51单片机有着优异的,位逻辑,功能,可以方便的实现各种复杂的,逻辑运算,。,这是,软件替代硬件,的方法,简化、完成代替硬件,但要多费运算时间。,例3-14,编程序,以实现图3-7中的逻辑运算电路.,3.6 位操作程序设计,其中P1.1和P2.2分别是端口线上的信息,TF0和IE1分别是定时器定时溢出标志和外部中请求标志,25H和26H分别是两个位地址,运算结果由端口线P1.3输出。程序见下页。,图3-7 硬件逻辑运算电路,MOV R5,A,在程序存储器中保留以标号为起始地址的若干,POP ACC,4、合理分配存储器单元和了解I/O接口地址,INC A ;序号加1,单片机能执行的程序是机器语言(目标程序)。,0A H,编辑器、汇编器、编译器、连接/定位器、,ANL C,F0,a=(31H),b=(32H),c=(34H,33H)(BCD码)。,RL A ;如相等,序号乘2得分支表内偏移量,PRn;转移地址表,图3-7 硬件逻辑运算电路,执行效率高,DJNZ R1,DL1,定义、调用,ORL C,TF0,MOV F0,C,MOV C,IE1,ORL C,/25H,ANL C,F0,ANL C,/26H,MOV P1.3,C,SJMP$,例3-15,设累加器A的各位ACC.0ACC.7分别记为X0X7,编制程序用软件实现下式:Y=,X,0,X,1,X,2,+,X,0,X,1,X,2,+,X,0,X,1,X,2,X,3,+,X,4,X,5,X,6,X,7,X2 BIT ACC.2,ORG 0000H,MOV C,X0,ANL C,X1,ANL C,X2,MOV 00H,C,;X0X1X2,MOV C,X0,ANL C,/X1,MOV 01H,C;,X0X1,ANL C,/X2,ORL C,00H,MOV 00H,C,MOV C,X2,ANL C,01H,ANL C,X3,;X0X1X2X3,ORL C,/00H,MOV 00H,C,MOV C,X7,ANL C,/X6,ANL C,/X5,ANL C,/X4,;X4 X5 X6 X7,ORL C,00H;最终结果YC,SJMP$,子程序对,模块化程序设计,是必不可少的,,用,ACALL,或,LCALL,调用,用,RET,结尾。,子程序节省存储空间,使程序,简短、清晰。,要善于灵活的使用子程序,,这是程序设计的,重要技巧,之一。,在使用子程序时,有以下几点应注意:,3.7 子程序,当一段程序需多次应用,或为多人应用时,这段程序编为子程序。,独立完整的程序段,1)保护现场、恢复现场,为避免子程序中使用的,存储单元,或寄存器,与,冲突。,子程序可使用不同的寄存器组,,只用于中断子程序,。,为了通用,应在子程序中保护、恢复现场,。,2)设置入口参数和出口参数,即,传递参数,理论上四种方法都可以使用,。,寄存器、存储器、地址表(参数表)、堆栈,3)子程序嵌套:,程序中可包括对另外子程序的调用。,例3-16 实现c=a,2,+b,2,,设a,b10。,a=(31H),b=(32H),c=(34H,33H)(BCD码),。,解:求平方编为子程序,用查表法。,主程序,MOV SP,#3FH,MOV A,31H ;取a,LCALL SQR ;求a方,MOV R1,A,MOV A,32H ;取b,LCALL SQR ;求b方,ADD A,R1 ;求和,DA A ;调整,MOV 33H,A,MOV A,#0,ADDC A,0,MOV 34H,A,SJMP$,子程序,SQR:INC A,MOVC A,A+PC,RET,TAB:DB 00H,01H,04H,DB 09H 16H,25H,DB 36H,49H,64H,DB 81H,END,P62例3-17:,求两个无符号数据块中最大值的乘积,3.8 小 结,1、程序设计的关键:,指令熟悉,、和,算法(思路)正确清晰;,对复杂程序应先画出,流程图;,多练习多上机调试,,熟能生巧。,2、,伪指令,是非执行指令,,提供汇编信息,应正确使用。,3、掌握各类程序的设计方法,顺序程序、分支程序、循环程序、子程序,,能熟练应用,查表技术,简化程序的设计。,
展开阅读全文