《单片机原理及应用PPT电子教案-第四章 MCS-51汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《单片机原理及应用PPT电子教案-第四章 MCS-51汇编语言程序设计.ppt(63页珍藏版)》请在三一办公上搜索。
1、2023/2/20,1,单片机原理及应用,第四章 MCS-51汇编语言程序设计,2023/2/20,2,课时:4子程序查表程序顺序程序分支程序循环程序,主要内容:,2023/2/20,3,4.1 汇编语言设计概述,语句格式 一条汇编语言的语句包括四部分内容:标号、操作码、操作数和注释。其格式为:标号:操作码操作数;注释 如:LOOP:MOV A,#20H;(A)20H,$表示原地踏步,2023/2/20,4,4.1.3 伪指令1、定位伪指令 格式:ORG n2、定义字节伪指令 格式:标号:DB X1,X2,Xn 功能:把Xi存入从标号开始连续的单元中。3、定义双字节伪指令 格式:标号:DW X
2、1,X2,Xn 功能:把Xi存入从标号开始的连续单元中。,2023/2/20,5,4、赋值伪指令 格式:字符名称x EQU n 功能:将数据或地址n赋给字符名称。5、结束汇编指令 格式:END 指示源程序到结束,常将其放在汇编语言源程序的末尾。,2023/2/20,6,4.1.4 汇编语言程序设计步骤1、分析任务,确定算法或解题思路2、根据算法和解决思路画出程序流程图 流程图是由一些框图和流程线组合而成:3、分配内存工作区及端口4、编写程序5、上机调试,2023/2/20,7,4.2 汇编语言源程序的汇编,汇编语言源程序汇编后的机器代码如:,2023/2/20,8,顺序结构分支结构循环结构子程
3、序中断服务子程序,4.3 汇编语言实用程序设计,2023/2/20,9,4.3.2 子程序设计,子程序:在同一个程序中,往往有很多地方都需要执行同样的一项任务,而该任务又往往是很规则,所以不能用循环实现,所以,这时可以对这个任务进行编写,形成一个子程序,在需要使用该任务的时候就可以调用子程序,执行完该任务后,又返回到原来的地方,继续以后的操作,以节省存储空间和编程的重复劳动。,调用指令:ACALL addr11 LCALL addr16返回指令:RET,2023/2/20,10,保存与恢复寄存器内容例如:SUB1:PUSH PSW PUSH A PUSH R6(此处省略了子程序的内容)POP
4、R6 POP A POP PSW RET,必须有标号,2023/2/20,11,子程序的参数传递主程序在调用子程序时,经常需要传送一些参数,子程序运行完后也经常将一些参数回送给主程序,这叫参数传递。【例】编程计算c=a2+b2。编程说明:这个问题中,计算某数的平方可以用子程序来实现,两次调用该子程序,并求和便得到所需结果。设a、b 分别存于内部RAM 的30H、31H单元,结果C存于内部RAM的40H单元。,2023/2/20,12,参数传递:主程序中,将某数存放到累加器A中,作为子程序的入口参数;子程序中,将所求数的平方值存放在累加器A中,作为出口参数(即主程序的返回值)。子程序的入口参数:
5、A中存放某数的值。子程序的出口参数:A中存放所求数的平方。子程序如下:SQR:INC A MOVC A,A+PC;查平方表 RETTABLE:DB 0,1,4,9,16 DB 25,36,49,64,81主程序流程图如图 所示。,2023/2/20,13,2023/2/20,14,主程序如下:START:MOV A,30H ACALL SQR;调查表子程序 MOV R1,A;a2暂存R1中 MOV A,31H ACALL SQR;调查表子程序 ADD A,R1 MOV 40H,A END,2023/2/20,15,子程序的嵌套,2023/2/20,16,4.3.3 查表程序设计【例】利用查表的
6、方法编写Y=X2(X=0,1,29)的程序。编程说明:设变量X的值存放在内存30H单元中,变量Y的值存入内存31H单元。先用远查表指令MOVC A,A+DPTR 编写程序(参考程序1);再用近查表指令MOVC A,A+PC 编写程序(见参考程序2)。,2023/2/20,17,参考程序1:ORG 1000HSTART:MOV A,30H MOV DPTR,#TABLE MOVC A,A+DPTR MOV 31H,ATABLE:DB 0,1,4,9,16 DB 25,36,49,64,81 END,2023/2/20,18,参考程序2:ORG 1000HSTART:MOV A,30H ADD A
7、,#02H MOVC A,A+PC MOV 31H,A DB 0,1,4,9,16 DB 25,36,49,64,81 END,1002,1004,1005,PC=1005,1007,A的值为中间指令的字节,2023/2/20,19,【例】将1位十六进制数,转换成相应ASC码。用计算求解和查表求解,进行比较。(1)计算求解:编程说明:设待转换的一位十六进制数存放在40H 单元中,转换后的ASC码仍存放在40H 中。编程思路:十六进制数09 的ASC为41H46H.,当待转换的数9时,加30H,既是其对应的ASC码;当待转换的数9时,加37H。程序流程如图3-11所示。,2023/2/20,20
8、,2023/2/20,21,参考程序如下:ORG 0100 H MOV A,40 H ANL A,#0F H CLR C SUBB A,#0AH JC NEXT ADD A,#0AH ADD A,#37H SJMP SAVENEXT:ADD A,#0AH ADD A,#30HSAVE:MOV 40H,A END,2023/2/20,22,(2)查表求解:ORG 0100H MOV A,40H ANL A,#0FH ADD A,#02H MOVC A,A+PC MOV 40H,A DB 0,1,2,3,4,5 DB 6,7,8,9,A,B DB C,D,E,F END,2023/2/20,23,
9、4.3.4 顺序结构程序设计 按照程序编写的顺序,依次执行。任何复杂的程序,都含有较大成份的顺序结构程序。【例】将两位压缩BCD码转换成二进制数编程思路:(a1a0)BCD=a110+a0编程说明:待转换的两位压缩BCD码存放于R2,转换结果存回R2。程序流程图如图所示。,2023/2/20,24,2023/2/20,25,编程如下:START:MOV A,R2 ANL A,#0F0H;取高位BCD码 SWAP A MOV B,#0AH MVL AB MOV R3,A MOV A,R2 ANL A,#0FH;取低位BCD码 ADD A,R3 MOV R2,A END,2023/2/20,26,
10、4.3.5 分支程序设计,2023/2/20,27,【例】求符号函数的值 1 当X0Y=0 当X=0 的值。-1 当X0 编程说明:设变量X存放在40H单元中,函数Y存放在41H单元中。此程序为三分支程序。程序流程图如图所示。,2023/2/20,28,2023/2/20,29,编程如下:START:MOV A,40H JZ COMP JNB ACC.7,POST MOV A,#81H;表示-1 SJMP COMP POSI:MOV A,#01H;表示+1COMP:MOV 41H,A END,2023/2/20,30,【例】求单字节有符号二进制数的补码。,2023/2/20,31,编程如下:C
11、MPT:MOV A,30H JNB ACC.7,NCH;(A)0,不需要转换 MOV C,ACC.7;保存符号 MOV 10H,C CPL A ADD A,#1 MOV C,10H MOV ACC.7,C;恢复符号NCH:END,2023/2/20,32,4.3.6 循环程序设计,2023/2/20,33,2023/2/20,34,(1)、单重循环程序设计1.计数控制的循环程序 将外部RAM 1000H单元后的100个单元清0,2023/2/20,35,ORG 0000HST:MOV DPTR,1000H MOV R5,100 MOV A,00HLP:MOVX DPTR,A INC DPTR
12、DJNZ R5,LP SJMP$,2023/2/20,36,例:有20个无符号数存放在内部RAM 50H开始的单元中,求它们的和,将和放到内部RAM 4EH和4FH两单元中。,2023/2/20,37,MOV 4EH,00H MOV 4FH,00H MOV R7,20;设置计数器 MOV R0,50H;设置间址指针LOOP:MOV A,4FH;加一个单元的内容 ADD A,R0 MOV 4FH,A CLR A ADDC A,4EH;加低位的进位 MOV 4EH,A INC R0;修改间址指针 DJNZ R7,LOOP SJMP$,2023/2/20,38,(2).条件控制的循环程序例:将内部R
13、AM 30H中的无符号数转换成十进制数,结果放入R6和R7中解:二进制数转换成十进制数,采用除10取余的方法,如:二进制数7BH转换成十进制的过程是:7BH0AH0CH03H0CH0AH01H02H所以7BH转换成十进制数是:123,2023/2/20,39,MOV 31H,00H;31H33H单元清0 MOV 32H,00H MOV 33H,00H MOV R0,33H;设置间址寄存器 MOV A,30H;无符号数送ALOOP:MOV B,10;设置除数 CJNE A,00H,NEZ;被除数为0?MOV A,32H;为0,将31H33H中 SWAP A;的ASCII数拼为压缩BCD数 ORL
14、 A,33H;放入R6和R7中 MOV R7,A MOV R6,31H SJMP$NEZ:DIV AB;被除数不为0,除以10 MOV R0,B;保存余数 DEC R0;修改间址指针 SJMP LOOP,2023/2/20,40,(3).双重控制的循环程序例:把内部RAM中起始地址为30H的字节数据传送到外部RAM 3000H为首址的区域,直到发现$字符的ASCII码为止,数据串的最大长度为32B解:本题要求由两个条件控制:1、遇到$停止2、最多传送32个字节,2023/2/20,41,MOV R0,30H;设置内部RAM指针 MOV DPTR,3000H;设置外部指针 MOV R7,32;设
15、置计数器LOOP:MOV A,R0 CJNE A,$,ISO;是$否?SJMP$;是$,则结束ISO:MOV A,R0;从内部取数 MOVX DPTR,A;送外部RAM INC R0;修改内部RAM指针 INC DPTR;修改外部RAM指针 DJNZ R7,LOOP;判断是否传送32B SJMP$;传送完32B,则结束,2023/2/20,42,(4)多重循环程序 多重循环也叫做循环嵌套。例:编制2ms延时程序(所用晶振为12MHz)解:每条指令执行都需要一定的时间,即一个指令周期为:14个机器周期,对于采用12MHz的晶振来说的系统,它的一个机器周期为:1us。一个指令周期为:14us。延时
16、1ms需要2000个机器周期。,2023/2/20,43,执行一次内循环需要5us,可令R5100,即:执行完内循环需要500us。而执行一次外循环需要503us,可令R64,则:执行完循环需要503us42012us2ms,2023/2/20,44,MOV R6,04HST:MOV R5,100L0:NOP NOP NOP DJNZ R5,L0 DJNZ R6,ST END,周期,1,1,1,1,1,2,2,1+500+2=503,1+1+1+2=5,5*100=500,503*4=2012,2023/2/20,45,4.3.7 码制转换例:将双字节二进制数转换为BCD码(将R3、R2中的无
17、符号二进制数转换成BCD数存入R6(万)、R5(千、百)R4(十、个)解:二进制数转换成BCD数即:将二进制数左移一位,乘以2,然后再加上下一次左移的一位。加法运算按BCD数加法来做,2023/2/20,46,BCBCD:CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,10H;设置循环次数LP0:CLR C;左移一位,移入Cy MOV A,R2 RLC A MOV R2,A MOV A,R3 RLC A MOV R3,A,2023/2/20,47,MOV A,R4;实现()ai ADDC A,R4 DA A MOV R4,A MOV A,R5 ADDC A,R5
18、 DA A MOV R5,A MOV A,R6 ADDC A,R6 DA A MOV R6,A DJNZ R7,LP0,2023/2/20,48,例:将BCD数转换成二进制数,R5(千位、百位)、R4(十位、个位)为BCD数,将它们转换成二进制数存于R5、R4中解:其中加法运算按二进制数加法运算来做。,2023/2/20,49,BCDBIN:MOV A,R5;取高字节BCD数 MOV R2,A LCALL BCDBIN1 MOV B,64H;将转化的千百位乘100 MUL AB MOV R6,A XCH A,B MOV R5,A MOV A,R4;取低字节BCD数 MOV R2,A LCALL
19、 BCDBIN1 ADD A,R6;加千位百位 MOV R4,A MOV A,R5 ADDC A,00H MOV R5,A SJMP$,2023/2/20,50,子程序:将R2中的内容转换成R2高4位乘10加上R2低4位的形式BCDBIN1:MOV A,R2 ANL A,0FH SWAP A MOV B,0AH MUL AB MOV R3,A MOV A,R2 ANL A,0FH ADD A,R3 MOV R2,A RET,2023/2/20,51,例:将4位二进制数转换成ASCII码,4位二进制数存放于R2中,转换后的ASCII码存也放于R2中解:若4位二进制数小于等于9,即为09数字时,则
20、加上30H,若大于9,即为AF字母时,则加上37H,2023/2/20,52,BINASC:MOV A,R2;取4位二进制数 ANL A,0FH;屏蔽高4位 PUSH A;保护二进制数 CLR C SUBB A,0AH;判断是否大于10 POP A;弹出二进制数 JC LOOP;若小于10,转到LOOP ADD A,07H;大于等于10,加7LOOP:ADD A,30H;加上30H MOV R2,A;保存到R2 SJMP$,2023/2/20,53,例:将ASCII码转换成4位二进制数,ASCII码存放于R2,转换后的二进制数也存放在R2解:本题是上题的逆过程,首先要将ASCII码减去30H,
21、然后判断是否大于10,若小于10,则所得的数就是要转换的二进制数,否则,减去07H,得转换得二进制数,2023/2/20,54,ASCBIN:MOV A,R2;取ASCII码 CLR C SUBB A,30H;减去30H MOV R2,A SUBB A,0AH;减去10 JC LOOP;判断是否大于10 MOV A,R2;若大于10,则减7 SUBB A,07H MOV R2,ALOOP:RET,2023/2/20,55,4.4 程序举例例:BCD码多字节加法。被加数低字节指针为R0,加数低字节指针为R1,R3为字节数,BCD码加完后,由R0指出和的低字节地址指针,R3存放字节数解:BCDAD
22、D:MOV 20H,R0;保存指针 MOV 23H,R3;保存字节数 CLR CLP0:MOV A,R0;取一字节被加数 ADDC A,R1;与加数相加 DA A;调整和 MOV R0,A;保存结果,2023/2/20,56,INC R0;修改被加数指针 INC R1;修改加数指针 DJNZ R3,LP0;判断是否加完 MOV R3,23H;取BCD数字节 JNC RETURN;判断是否有进位 MOV R0,01H;有进位则保存 INC R3;有进位,字节数加1RETURN:MOV R0,20H;取和低字节指针 END,2023/2/20,57,例:求内部RAM的50H5AH中的最大值并放入5
23、AH单元解:先取出一个数暂存到A中,然后依次取出其它的数与该数进行两两比较,将比较后较大的数暂存到A中,这样N个数经过N1次比较后A中的数就是最大数。编程前我们拟用R0作为数据块的地址指针,R2作为数据块长度计数器。,2023/2/20,58,ST:MOV R0,50H;给数据块地址指针 MOV R2,10;设置数据块长度 MOV A,R0;取第一个数LOOP:INC R0;取下一个数 MOV B,R0 CJNE A,B,LP0;比较是否相等LP0:JNC NEXT;若A大于等于B,专至NEXT MOV A,R0;若A小于B,将BANEXT:DJNZ R2,LOOP;判断是否比较完毕 MOV
24、R0,A;最大值送5AH SJMP$,2023/2/20,59,例:将内部RAM中的数据(无符号数),按从小到大的顺序排列,数据区的首址存放在R0中,字节数N存放在R2中。解:按顺序取出数据,依次与其后面的数进行比较,若比较后前者大于后者,则将两者交换。设置两个指针,一个是指出前者数据的指针R0,一个是指出后者要比较的数据指针R1。若取出的是第1个数,则要进行N1次比较可以找到最小的数,若取出的是第2个数,则要进行N2次比较找到第2小的数,依此类推,进行i次比较后可以找到第i小的数据。,2023/2/20,60,ST:MOV A,R0;设置取数的指针 MOV R1,A DEC R2;设置比较次
25、数和取数次数 MOV A,R2 MOV R5,ALP0:MOV A,R0;根据指针R0取数 INC R1 CLR C SUBB A,R1;比较 JC LP1;若前者小,则转移 MOV A,R0;将两个数据交换 XCH A,R1 MOV R0,ALP1:DJNZ R5,LP0;判断比较是否完毕 INC R0;取下一个数据 DJNZ R2,ST;判断比较是否进行完毕,2023/2/20,61,练习1、编写程序实现2个4位BCD数相加,设被加数存放在内部RAM的40H和41H单元,加数存放在45H和46H单元,和数存放在50H和51H单元,并设最高位不产生进位。解:,2023/2/20,62,2、编写程序,将1字节的压缩BCD数转换成为二进制数,并存入内部RAM的30H单元中。解:十位10个位,2023/2/20,63,3、编写程序,将一个字节的二进制数转换为BCD数(0255),并存入内部RAM的31H和32H单元中解:采用除10取余的方法,