第3章MCS-51单片机汇编语言程序设计单片机原理、接口及应用第3章MCS-51单片机汇编语言程序设计内容提要★伪指令★汇编语言程序设计步骤★顺序程序设计★分支程序设计★循环程序设计★位操作程序设计★子程序★小结第3章MCS-51单片机汇编语言程序设计1.机器指令:指令系统中的全部指令。每条机器指令都有对应的机器代码,可以被CPU执行。2.伪指令:汇编控制指令,没有指令代码,只用于汇编过程,为汇编程序提供汇编信息。一、汇编语言指令类型宏汇编功能:将需要反复多次执行的程序段定义成一个宏指令名(宏定义)。编程时,可在程序中使用宏指令名来替代被定义的程序段(宏调用)。3.1伪指令第3章MCS-51单片机汇编语言程序设计宏定义过程:宏调用过程:…宏指令名实际参数…宏指令名实际参数宏指令名MACRO形式参数…;被定义的程序段ENDM第3章MCS-51单片机汇编语言程序设计二.伪指令常用伪指令及功能:1.起始指令ORGnn功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始地址,连续存放在程序存储器中。指令地址机器码源程序ORG2000H2000H7830MAIN:MOVR0,#30H2002HE6MOVA,@R0…ORG3000H3000H23TAB:DB23H,100,‘A’3001H643002H41第3章MCS-51单片机汇编语言程序设计2.字节定义标号:DB(字节常数,或字符或表达式)功能:指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(八位二进制数)。例如LN:DB32,’C’,25H,-1;LN~LN+2地址单元依次存放20H,43H,25H,FFH地址数据LN20LN+143LN+225LN+3FF3.字定义标号:DW(字常数或表达式)作用:指示在程序存储器中以标号为起始地址的单元里存放的数为字数据(即16位的二进制数),例如:GH:DW1234H,5678H,08GH1234GH+25678GH+40008第3章MCS-51单片机汇编语言程序设计5.等值指令标号EQU(数值表达式)表示EQU两边的量等值,用于为标号或标识符赋值。例如:X1EQU2000HX2EQU0FH…MAIN:MOVDPTR,#X1;DPTR=2000HADDA,#X2;A=A+0FH4.保留字节标号:DS(数值表达式)作用:指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。例如L1:DS32;从L1地址开始保留32个存储单元。第3章MCS-51单片机汇编语言程序设计6.位定义标号BIT[位地址]作用:同EQU指令,不过定义的是位操作地址。例如AICBITP1.1。7.汇编结束END作用:指示源程序段结束。END指令放在程序的最后。A51汇编程序还有一些其它的伪指令,列在教材表3-1中,以备查阅。第3章MCS-51单片机汇编语言程序设计汇编语言程序设计步骤一.确定方案和计算方法二.了解应用系统的硬件配置、性能指标三.建立系统数学模型,确定控制算法和操作步骤四.合理分配存储器单元和了解I/O接口地址五.编制源程序1.按功能设计程序,明确各程序之间的相互关系2.用流程图表示程序结构和功能开始1YN?3.程序中用注释说明指令在程序中的作用,方便阅读、调试和修改第3章MCS-51单片机汇编语言程序设计顺序程序设计例3-1编程将外部数据存储器的000EH和000FH单元的内容相换。常用程序结构顺序程序、分支程序、循环程序、子程序000EH000FH000EH000FH000EH000FH000EH000FH分析:外部数据存储器的数据操作只能用MOVX指令,且只能和A之间传送,因此必须用一个中间环节作暂存,设用20H单元。用R0、R1指示两单元的低八位地址,高八位地址由P2指示。编程过程如下:000EH000FH000EH000FH000EH000FH第3章MCS-51单片机汇编语言程序设计ORG0000HMOVP2,#0H;送地址高八位至P2口MOVR0,#0EH;R0=0EHMOVR1,#0FH;R1=OFHMOVXA,@R0;A=(000EH)MOV20H,A;(20H)=(000EH)MOVXA,@R1;A=(000FH)XCHA,20H;A=(000EH),(20H)=(000FH)MOVX@R1,AMOVA,20HMOVX@R0,A;交换后的数送各单元SJMP$END第3章MCS-51单片机汇编语言程序设计3.3顺序程序设计顺序程序(简单程序),程序走向只有一条路径例3-2:将R4R5双字节符号数求补程序。ORG0000HMOVA,R5;取低字节CPLAADDA,#1;低字节变补MOVR5,AMOVA,R4;取高字节CPLAADDCA,#0;高字节变补ORLA,#80H;恢复负号MOVR4,AEND第3章MCS-51单片机汇编语言程序设计例3-3分解压缩式BCD码,使其成为非压缩式BCD码。ORG0000HMOVR0,#40H;设指针MOVA,@R0;取一个字节MOVR2,A;暂存ANLA,#0FH;清0高半字节INCR0MOV@R0,A;保存数据个位片内RAM42H41H40H65MOVA,R2SWAPA;十位换到低半字节ANLA,#0FHINCR0MOV@R0,A;保存数据十位END0506第3章MCS-51单片机汇编语言程序设计地址数据TAB0TAB+11TAB+24TAB+39TAB+416HTAB+525H例3-4设变量放在片内RAM的20H单元,其值为00H~05H之间,要求编查表程序,查出变量的平方值,并放入片内RAM的21H单元。ORG0000HMOVDPTR,#TABMOVA,20HMOVCA,@A+DPTR;查表MOV21H,ASJMP$TAB2:DB00H,01H,04H,09H,16H,25HEND分析:在程序存储器安排一张平方表,首地址为TAB,以DPTR指向表首址,A存放变量值,利用查表指令MOVCA,@A+DPTR,即可求得。表中数据用BCD码存放合乎人们的习惯.如果平方值为两个字节,程序应如何编。DPTRA第3章MCS-51单片机汇编语言程序设计ORG0000HMOVA,R2JNBACC.7,N;为正数?CPLA;负数变补INCAMOVR2,AN:SJMP$;结束3.4分支程序的设计由条件转移指令构成程序判断框部分,形成分支结构3.5.1单分支程序一个判断决策框,两种分支结构图。条件满足?N影响条件Y处理段条件满足?N影响条件Y处理1处理2例1求8位有符号数的绝对值。方法:正数不变,负数变补第3章MCS-51单片机汇编语言程序设计例2用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,其秤出的重量以10kg为1个计价单位G,G已存入40H单元。计价方法为50kg以内按3元,50kg以上分段计价:50kg按3元计价,超过部分按2元计价。由此列出算式:G×3+(G-5)×2;当G>5M=G×3;当G≤53G因重复使用,先暂存在R2。流程见左,程序如下:(A-5)*2+R2R2NYR2(41H)(40H)A(A=G)3GR2A=5?开始结束第3章MCS-51单片机汇编语言程序设计ORG0100HFRT:MOVA,40H;取行李重量计价单位GMOVR3,AMOVB,#03H;运费M=G×3MULABMOVR2,A;暂存3GMOVA,R3;取回GCJNEA,#05H,L1;G≤5?SJMPWETCL1:JCWETC;是,转至WETCSUBBA,#05H;否则M=3G+2(G-5)RLCAADDA,R2MOVR2,AWETC:MOV41H,R2;存运费MRET第3章MCS-51单片机汇编语言程序设计多分支散转程序的设计有一类分支程序,它根据不同的输入条件或不同的运算结果,转向不同的处理程序,称之为散转程序。这类程序通常利用JMP@A+DPTR间接转移指令实现转移。有如下两种设计方法:1.查转移地址表:将转移地址列成表格,将表格的内容作转移的目标地址。2.查转移指令表:将转移到不同程序的转移指令列成表格,判断条件后查表,转到表中指令执行,下面用两个例子说明。第3章MCS-51单片机汇编语言程序设计1.利用转移地址表实现转移例3-7根据R3的内容转向对应的程序,R3的内容为0~n,处理程序的入口符号地址分别为PR0~PRn(n128)。分析:将PR0—PRn入口地址列在表格中,每一项占两个单元,PRn在表中的偏移量为2n,因此将R3的内容乘2即得PRn在表中的偏移地址,从偏移地址2n和2n+1两个单元分别取出PRn的高八位地址和低八位地址送DPTR寄存器,用JMP@A+DPTR指令(A先清零)即转移到PRn入口执行。第3章MCS-51单片机汇编语言程序设计ORG0000HMOVA,R3;R3→AADDA,ACC;A*2MOVDPTR,#TABPUSHACCMOVCA,@A+DPTR;取地址表中高字节MOVB,A;暂存于BINCDPLPOPACCMOVCA,@A+DPTR;取地址表中低字节MOVDPL,AMOVDPH,B;DPTR为表中地址CLRA;A=0JMP@A+DPTR;转移TAB:DWPR0,PR1,PR2,…..,PRn;转移地址表END01100220..TABTAB+2DPHDPL例如R3=1的操作0220第3章MCS-51单片机汇编语言程序设计2.利用转移指令表实现转移例3-8设有五个按键0、1、2、3、4其编码分别为3AH、47H、65H、70H、8BH,要求根据按下的键转向不同的处理程序,分别为PR0、PR1//PR2、PR3、PR4,设按键的编码已在B寄存器中,编出程序。分析:将键码排成表,将键码表中的值和B中的键编码比对,记下在键码表中和B中的键编码相等的序号,另安排一个转移表,安排AJMP指令(机器码),因每条AJMP指令占二字节,将刚才记下的序号乘2即为转移表的偏移地址,利用JMP@A+DPTR执行表内的AJMP指令,从而实现多分支转移,设JPT的地址为001AH、PR0入口地址为0110H、,参考2.4.2节,求AJMPPR0的机器码0000000100010000001000010000(2110h)a10a9a8a7a6a5a4a3a2a1a0第3章MCS-51单片机汇编语言程序设计AJMPPR0的机器码为2110H,PR1入口地址为0220HAJMPPR1的机器码为4120H,转移指令表JPT的内容如下所示。设B=65H,键值为2:2041JPT+42002JPT+21021JPTAJMPPR0AJMPPR1AJMPPR2TAB3AHTAB+147HTAB+265HTAB+370H转移指令表JPT键码表TAB65HA2B2×AA=1A=2A=065H65H第3章MCS-51单片机汇编语言程序设计ORG0000HMOVDPTR,#TAB;置键码表首址MOVA,#0;表的起始位的偏移量为0NEXT:PUSHACCMOVCA,@A+DPTR;A=键码表的编码CJNEA,B,AGAN;将B中值和键码表的值比较POPACCRLA;如相等,序号乘2得分支表内偏移量MOVDPTR,#JPT;置分支表首址JMP@A+DPTRAGAN:POPACC;不相等比较下一个INCA;序号加1CJNEA,#5,NEXTSJMP$;键码查完还没有B中按键编码程序结束JPT:AJMPPR0;分支转移表AJMPPR1AJMPPR2AJMPPR3AJMPPR4TAB:DB3AH,47H,65H,70H,8BH;键码表END第3章MCS-51单片机汇编语言程序设计当程序中的某些指令需要反复执行多次时,采用循环程序的方式,这样会使程序缩短,节省存储单元(并不节省执行时间)。循环次数的控制,有两种控制方式:•第一种方法先判断再处理即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制。•第二种方法先处理再判断,即循环执行一遍后,下一轮还需不需要进行,多以计循环次数控制。循环可以有单重循环和多重循环,在多重循环中,内外循环不能交叉,也不允许外循