您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 51单片机汇编程序设计.
3.3汇编语言程序设计3.3.1汇编语言及其语句格式1、汇编语言这里介绍MCS-51单片机的汇编语言。2、汇编语言的语句格式一条汇编语言的语句包括四部分内容:标号、操作码、操作数和注释。其格式为:标号:操作码操作数;注释例如:LOOP:MOVA,#20H;(A)←20H3.3.2伪指令1、定位伪指令格式:ORGn2、定义字节伪指令格式:标号:DBX1,X2,……Xn此伪指令的功能是把Xi存入从标号开始连续的单元中。3、定义双字节伪指令格式:标号:DWX1,X2,……Xn此伪指令的功能是把Xi存入从标号开始的连续单元中。4、预留存贮区伪指令格式:DSnDSn从标号指定单元开始,预留n个单元的存贮区。5、赋值伪指令格式:字符名称xEQUn此指令的功能是将数据或地址n赋给字符名称。6、结束汇编指令格式:ENDEND指示源程序到结束,常将其放在汇编语言源程序的末尾。3.3.3汇编语言程序设计过程1、分析任务,确定算法或解题思路2、根据算法和解决思路画出程序流程图流程图是由一些框图和流程线组合而成:`置的框图连接在一起,位于不同框图的圈内,应标注相同的字母。3、根据流程图编写程序4、上机调试程序3.3.4顺序结构程序设计按照程序编写的顺序,依次执行。任何复杂的程序,都含有较大成份的顺序结构程序。【例3-8】将两位压缩BCD码转换成二进制数编程思路:(a1a0)BCD=a1×10+a0编程说明:待转换的两位压缩BCD码存放于R2,转换结果存回R2。程序流程图如图3-1所示。编程如下:START:MOVA,R2ANLA,#0F0H;取高位BCD码SWAPAMOVB,#0AHMVLABMOVR3,AMOVA,R2ANLA,#0FH;取低位BCD码ADDA,R3MOVR2,AEND3.3.5分支程序设计【例3-9】求符号函数的值1当X0Y=0当X=0的值。-1当X0编程说明:设变量X存放在40H单元中,函数Y存放在41H单元中。此程序为三分支程序。程序流程图如图3-3所示。编程如下:START:MOVA,40HJZCOMPJNBACC.7,POSTMOVA,#81H;表示-1SJMPCOMPPOSI:MOVA,#01H;表示+1COMP:MOV41H,AEND【例3-10】求单字节有符号二进制数的补码。编程如下:CMPT:MOVA,30HJNBACC.7,NCH;(A)≥0,不需要转换MOVC,ACC.7;保存符号MOV10H,CCPLAADDA,#1MOVC,10HMOVACC.7,C;恢复符号NCH:END图3-5中,K的最大值一般为128。【例3-1‰】用单片机作四则运算。编程说明:在单片机系统中,设置+、-、×、÷四个运算键,这四个运算键的键值分别为0、1、2、3(键值存放在寄存器(2中),当其中一个按键按下时,进行相应的运算。P1口输入被加数、被减数、被乘数或被除数,以及运算结果的低8位或商。P3口输入加数、减数、乘数或除数,,以及结果的高8位或余数。键号存放在累加器A中。程序流程图如图3-6所示。参考程序如下:START:MOVP1,#0FFHMOVP3,#0FFHMOVDPTR,#TABLECLRCMOVA,R2SUBBA,#04HJNCERRORADDA,#0-4HCLRCRLA;正确的散转偏移号,键号×2JMP@A+DPTRTABLE:AJMPPRG0AJMPPRG1AJMPPRG2AJMPPRG3ERROR:(错误处理)PRG0:MOVA,P1ADDA,P3MOVP1,ACLRAADDCA,#00H;进位位放入A中MOVP3,ARETPRG1:MOVA,P1CLRCSUBBA,P3MOVP1,ACLRARLCA;借位放入A中MOVP3,ARETPRG2:MOVA,P1MOVB,P3MULABMOVP1,AMOVP3,BRETPRG3:MOVA,P1MOVB,P3DIVABMOVP1,AMOVP3,BRET【例3-12】已知内存单元有16个二进制无符号数,分别存放在30H~3FH中,试求它们的累加和,并将其和数存放在R4、R5中。编程说明:存放16个二进制无符号数的首地址为30H,此循环程序的循环次数为16次,和数放在R4、R5中。程序流程如图3-8。参考程序如下:START:MOVR0,#30HMOVR2,#10HMOVR4,#00HMOVR5,#00HLOOP:MOVA,R5ADDA,@R0MOVR5,AMOVA,#00HADDCA,R4MOVR4,AINCR0DJNZR2,LOOPEND【例3-13】将内部数据存贮器30H~4FH单元中的内容传送至外部数据存贮器2000H开始的单元中。解:编程说明:内部数据区首址:R0←30H外部数据区首址:DPTR←2000H循环次数:R2←32H程序流程如图3-9所示。参考程序如下:START:MOVR0,#30HMOVDPTR,#2000HMOVR2,#32HLOOP:MOVA,@R0MOVX@DPTR,AINCR0INCDPTRDJNZR2,LOOPEND【例3-14】试将内部数据存储器中连续存放的N个数据由小到大进行排列。设:数据区首地址存于寄存器R0中,数据个数N存于寄存器R6中。程序流程如图3-10所示。参考程序如下:MOV30H,R0L1:DECR6MOVA,R6MOVR3,AMOVR2,AMOVA,R0MOVR1,AINCR1L2:MOVA,@R0CLRCSUBBA,@R1JCL3MOVA,@R0XCHA,@R1MOV@R0,AL3:INCR1DJNZR2,L2INCR0DJNZR3,L1MOVR0,30HEND3.3.8查表程序设计【例3-15】利用查表的方法编写Y=X2(X=0,1,2…9)的程序。编程说明:设变量X的值存放在内存30H单元中,变量Y的值存入内存31H单元。先用远查表指令MOVCA,@A+DPTR编写程序(参考程序1);再用近查表指令MOVCA,@A+PC编写程序(见参考程序2)。参考程序1:ORG1000HSTART:MOVA,30HMOVDPTR,#TABLEMOVCA,@A+DPTRMOV31H,ATABLE:DB0,1,4,9,16DB25,36,49,64,81END参考程序2:ORG1000HSTART:MOVA,30HADDA,02HMOVCA,@A+PCMOV31H,ADB0,1,4,9,16DB25,36,49,64,81END【例3-16】将1位十六进制数,转换成相应ASCⅡ码。用计算求解和查表求解,进行比较。(1)计算求解:编程说明:设待转换的一位十六进制数存放在40H单元中,转换后的ASCⅡ码仍存放在40H中。编程思路:十六进制数0~9的ASCⅡ为41H~46H.,当待转换的数≤9时,加30H,既是其对应的ASCⅡ码;当待转换的数9时,加37H。程序流程如图3-11所示。参考程序如下:ORG0100HMOVA,40HANLA,#0FHCLRCSUBBA,#0AHJCNEXTADDA,#0AHADDA,#37HSJMPSAVENEXT:ADDA,#0AHADDA,#30HSAVE:MOV40H,AEND(2)查表求解:ORG0100HMOVA,40HANLA,#0FHADDA,02HMOVCA,@A+PCMOV40H,ADB‘0’,‘1’,‘2’,‘3’,‘4’,‘5’DB‘6’,‘7’,‘8’,‘9’,‘A’,‘B’DB‘C’,‘D’,‘E’,‘F’END3.3.9子程序设计1、子程序的调用与返回MCS-51单片机有两条子程序调用指令:ACALLaddr11、LCALLaddr16;一条子程序返回指令RET。2、保存与恢复寄存器内容例如:SUB1:PUSHPSWPUSHAPUSHR6∶(此处省略了子程序的内容)∶POPR6POPAPUSHPSW3、子程序的参数传递主程序在调用子程序时,经常需要传送一些参数,子程序运行完后也经常将一些参数回送给主程序,这叫参数传递。【例3-17】编程计算c=a2+b2。编程说明:这个问题中,计算某数的平方可以用子程序来实现,两次调用该子程序,并求和便得到所需结果。设a、b分别存于内部RAM的30H、31H单元,结果C存于内部RAM的40H单元。参数传递:主程序中,将某数存放到累加器A中,作为子程序的入口参数;子程序中,将所求数的平方值存放在累加器A中,作为出口参数(即主程序的返回值)。子程序的入口参数:A中存放某数的值。子程序的出口参数:A中存放所求数的平方。子程序如下:SQR:INCAMOVCA,@A+PC;查平方表RETTABLE:DB0,1,4,9,16DB25,36,49,64,81主程序流程图如图3-12所示。主程序如下:START:MOVA,30HACALLSQR;调查表子程序MOVR1,A;a2暂存R1中MOVA,31HACALLSQR;调查表子程序ADDA,R1MOV40H,AEND4、子程序的嵌套3.4MCS-51汇编语言实用程序设计(略)
本文标题:51单片机汇编程序设计.
链接地址:https://www.777doc.com/doc-3826489 .html