《单片机原理及应用教程.ppt》由会员分享,可在线阅读,更多相关《单片机原理及应用教程.ppt(54页珍藏版)》请在三一办公上搜索。
1、第3章 MCS-51指令系统及汇编语言程序设计3.1 指令系统简介3.2 寻址方式3.3 指令系统3.4 汇编语言程序设计基础3.5 程序设计实例,指令系统是一种CPU所能直接执行的所有命令的集合,CPU的主要功能是由它的指令系统来体现的。3.1 指令系统简介MCS-51系列单片机指令系统共有111条指令,其中有49条单字节指令、45条双字节指令和17条三字节指令。MCS-51的指令系统中有64条指令的执行时间为一个机器周期(12个振荡周期),45条指令的执行时间为两个机器周期。3.1.1 指令格式MCS-51指令系统中的每一条指令都有两级指令格式:CPU可直接识别并执行的机器语言指令。汇编语
2、言指令(简称汇编指令)。机器语言指令由二进制数“0”和“1”编码而成,也称目标代码,执行速度最快。,汇编语言指令是在机器语言指令的基础上,用英文单词或英文单词缩写表示机器语言指令的操作码(助记符),用符号表示操作数或操作数的地址。汇编语言指令实际上是符号化的机器语言。MCS-51汇编语言指令格式由以下几个部分组成:标号:操作码 目的操作数,源操作数;注释其中,中的项表示为可选项。标号:又称为指令地址符号,一般是由16个字符组成,以字母开头的字母数字串,与操作码之间用冒号分开。操作码:是由助记符所表示的指令的操作功能。操作数:是指参加操作的数据或数据的地址。注释:是为该条指令作的说明,以便于阅读
3、。操作码是指令的核心,不可缺少,其他几项根据不同指令为可选项。,3.1.2 指令分类及符号说明1.指令分类MSC-51的指令系统共有111条指令,分为五大类:(1)数据传送指令:片内RAM、片外RAM、程序存储器的传送指令,交换及堆栈指令。(2)算术运算类:加法、带进位加、减、乘、除、加1、减1指令。(3)逻辑运算类:逻辑与、或、异或、测试及移位指令。(4)控制程序转移类:无条件转移与调用、条件转移、空操作指令。(5)布尔变量操作类:分为位数据传送、位与、位或、位转移指令。2.符号说明#data:表示指令中的8位立即数(data),“#”表示后面的数据是立即数。#data16:表示指令中的16
4、位立即数。direct:表示位内部数据存储器单元的地址。,Rn:n=07,表示当前选中的寄存器区的8个工作寄存器R0R7。Ri:i=0或1,表示当前选中的寄存器区中的2个寄存器R0、R1,可作地址指针即间址寄存器。Addr11:表示11位的目的地址。Addr16:表示16位的目的地址。rel:表示一个补码形式的位带符号的偏移量。用于SJMP和所有的条件转移指令中。DPTR:为数据指针,可用作16位的地址寄存器。bit:内部RAM或专用寄存器中的直接寻址位。/:位操作数的前缀,表示对该位操作数取反。A:累加器ACC。B:专用寄存器,用于MUL和DIV指令中。C:进位/借位标志位,也可作为布尔处理
5、机中的累加器。:间址寄存器或基址寄存器的前缀。,$:当前指令的首地址。:表示将箭头右边的内容传送至箭头的左边。3.2 寻址方式所谓寻址方式就是寻找或获得操作数的方式。MCS-51指令系统的寻址方式有以下7种:1.立即寻址在立即寻址方式中,操作数直接出现在指令中。操作数前加“#”号表示,也称立即数。指令的操作数可以是8位或16位数。例如:MOV A,#26H;A26H指令执行结果:(A)=26H,即把立即数26H直接送到A中。2.直接寻址在直接寻址方式中,操作数的单元地址直接出现在指令中,这一寻址方式可进行内部存储单元的访问。它包括:,(1)特殊功能寄存器地址空间。这也是惟一可寻址特殊功能寄存器
6、(SFR)的寻址方式。例如:MOV TCON,A指令执行结果:A的内容传送给寄存器TCON。(2)内部RAM的低128字节例如:MOV A,76H指令执行结果:内部RAM地址为76H单元的内容传送给A。3.寄存器寻址在寄存器寻址方式中,寄存器中的内容就是操作数。例如:MOV A,R1;A(R1)指令执行结果:把寄存器R1中的内容送到累加器A中。,4.寄存器间接寻址在寄存器间接寻址方式中,指定寄存器中的内容是操作数的地址,该地址对应存储单元的内容才是操作数。例如MOV A,R0该指令的功能是将R0所指3FH单元中内容45H送A中,执行结果:(A)=45H。16位数据指针DPTR作为间址寄存器。访
7、问内部数据存储器时,用当前工作寄存器R0和R1作间址,即R0、R1,在堆栈操作中则用堆栈指针SP作间址。例如:MOVX A,R1MOVX DPTR,A,5.变址寻址变址寻址方式是以程序指针PC或数据指针DPTR为基址寄存器,以累加器A作为变址寄存器,两者内容相加(即基地址+偏移量)形成16位的操作数地址,变址寻址方式主要用于访问固化在程序存储器中的某个字节。变址寻址方式有两类:(1)用程序指针PC作基地址,A作变址,形成操作数地址:A+PC。(2)用数据指针DPTR作基地址,A作变址,形成操作数地址:A+DPTR。6.相对寻址相对寻址是以程序计数器PC的当前值作为基地址,与指令中的第二字节给出
8、的相对偏移量rel进行相加,所得和为程序的转移地址。,7.位寻址MCS-51系列单片机中有独立的性能优越的布尔处理器,包括位变量操作运算器、位累加器和位存储器,可对位地址空间的每个位进行位变量传送、状态控制、逻辑运算等操作。位地址包括:内部RAM地址空间的可进行位寻址的128位和SFR地址空间的可位寻址的11个8位寄存器的88位。位寻址给出的是直接地址。3.3 指令系统 3.3.1 数据传送类指令1.数据传送类指令的特点数据传送指令是最常用的一类指令,共有29条,可以通过累加器进行数据传送,还可以在数据存储器之间或工作寄存器与数据存储器之间直接进行数据传送。2.数据传送类指令(1)片内数据传送
9、指令,1)以累加器A为目的操作数的指令有以下形式:MOV A,Rn;A(Rn)源操作数为寄存器寻址MOV A,Ri;A(Ri)源操作数为寄存器间接寻址MOV A,direct;A(direct)源操作数为直接寻址MOV A,#data;Adata 源操作数为立即寻址该组指令的功能是把源操作数传送给累加器A。2)以工作寄存器Rn为目的操作数的指令有以下形式:MOV Rn,A;Rn(A)MOV Rn,direct;Rn(direct)MOV Rn,#data;Rndata,3)以直接地址为目的操作数的指令有以下形式:MOV direct,AMOV direct,RnMOV direct,direc
10、tMOV direct,RiMOV direct,#data 4)以间接地址为目的操作数的指令:MOV Ri,AMOV Ri,directMOV Ri,#data该组指令的功能:把源操作数所指定的内容传送至以R0或R1为地址指针的片内RAM单元中。5)16位数据传送指令有以下惟一形式:MOV DPTR,#data16该指令的功能:把16位立即数传送至16位数据指针寄存器DPTR。,(2)片外数据存储器传送指令片外数据存储器传送指令有以下形式:MOVX A,Ri;A(Ri),为寄存器间接寻址 MOVX A,DPTR;A(DPTR),为寄存器间接寻址 MOVX R,A;(Ri)(A)MOVX DP
11、TR,A;(DPTR)(A)单片机内部与片外数据存储器是通过累加器A进行数据传送的。(3)程序存储器数据传送指令程序存储器数据传送指令有以下两种形式:MOVC A,A+PCMOVC A,A+DPTR,(4)数据交换指令数据交换指令有以下形式:1)字节交换指令:XCH A,Rn;A的内容与Rn的内容交换XCH A,Ri;A的内容与(Ri)的内容交换XCH A,direct;A的内容与(direct)的内容交换2)低半字节交换指令:XCHD A,Ri;A的低四位与(Ri)的低四位交换3)累加器A的高、低半字节交换指令:SWAP A;A的低四位与高四位互换(5)堆栈操作指令堆栈操作指令有以下形式:P
12、USH direct;SP(SP)+1(先指针加1);(SP)(direct)(再压栈),POP direct;(SP)(direct)(先弹出);SP(SP)-1(再指针减1)PUSH指令是入栈(或称压栈或进栈)指令,其功能是先将堆栈指针SP的内容加1,然后将直接寻址direct单元中的数压入到SP所指示的单元中。POP是出栈(或称弹出)指令,其功能是先将堆栈指针SP所指示的单元内容弹出到直接寻址direct单元中,然后将SP的内容减1,SP始终指向栈顶。3.3.2 算术运算类指令1.算术运算类指令特点算术运算类指令共有24条,包括加、减、乘、除4种基本的算术运算指令。该类指令的主要功能:(
13、1)对8位无符号数进行直接的运算。(2)借助溢出标志对有符号的二进制整数进行加减运算。(3)借助进位标志,可以实现多字节的加减运算。,(4)对压缩的BCD数进行运算(压缩BCD数,是指在1个字节中存放2位BCD数)。(5)算术运算指令对程序状态字PSW中的Cy、AC、OV三个标志都有影响,根据运算的结果可将它们置1或清除。但是加1和减1指令不影响这些标志。算术运算类指令用到的助记符有:ADD、ADDC、SUBB、INC、DEC、DA、MUL和DIV八种。2.加法指令(1)不带进位的加法指令不带进位的加法指令有以下形式:ADD A,#data;A(A)+dataADD A,direct;A(A)
14、+(direct)ADD A,Rn;A(A)+(Rn)ADD A,Ri;A(A)+(Ri)这4条指令的功能是完成A中的数与源操作数所确定的内容按二进制运算相加,其和送入目的操作数累加器A中。,(2)带进位加法指令带进位加法指令有以下形式:ADDCA,Rn;A(A)+(Rn)+CyADDCA,Ri;A(A)+(Ri)+CyADDCA,direct;A(A)+(direct)+CyADDCA,#data;A(A)+#data+Cy该组指令的功能:将指令中指出的源操作数与A的内容及进位标志位Cy的值相加,结果送A。此类指令常用于多字节加法算中。(3)加1指令加1指令有以下形式:INCA;A(A)+1
15、INCRn;Rn(Rn)+1INCdirect;(direct)(direct)+1,INCRi;(Ri)(Ri)+1INCDPTR;DPTR(DPTR)+1该组指令的功能:把操作数指定的单元或寄存器的内容加1。(4)十进制调整指令十进制调整指令有以下惟一形式:DAA;A(A)(BCD码调整)指令的功能:将存放于A中的两个BCD码(十进制数)的和进行十进制调整,使A中的结果为正确的BCD码数。3.减法指令(1)带借位减法指令带借位减法指令有以下形式:SUBBA,Rn;A(A)-(Rn)-CySUBBA,Ri;A(A)-(Ri)-CySUBBA,direct;A(A)-(direct)-CySU
16、BBA,#data;A(A)-data-Cy,该组指令的功能:从累加器A中减去源操作数指定的内容和标志位Cy,结果存入累加器A中。(2)减1指令减1指令有以下形式:DEC A;A(A)-1DEC Rn;Rn(Rn)-1DEC Ri;(Ri)(Ri)-1DEC direct;(direct)(direct)-1该组指令的功能:将操作数指定的内容减1。若操作数为00H,则减1后下溢为0FFH,不影响标志位,只有DEC A影响标志位P。4.乘法指令乘法指令有以下惟一形式:MUL AB;AAB低字节,BAB高字节,该指令的功能:把累加器A和寄存器B中的两个8位无符号数相乘,乘积又送回A、B内,A中存放
17、低位字节,B中存放高位字节。除法指令有以下惟一形式:DIVAB;A(A)/(B)(商),B(A)/(B)(余数)该指令的功能:把A中的8位无符号数除以B中的8位无符号数,商存放在A中,余数存放在B中。Cy和OV均清0。若除数为0,执行该指令后结果不定,并将OV置1。3.3.3 逻辑运算类指令逻辑操作指令共24条,所有指令均对8位二进制数按位进行逻辑运算。逻辑运算类指令无进位,一般不影响标志位。1.双操作数逻辑运算指令(1)逻辑“与”指令逻辑“与”指令有以下形式:ANLA,Rn;A(A)(Rn),ANLA,Ri;A(A)(Ri)ANLA,direct;A(A)(direct)ANLA,#data
18、;A(A)dataANLdirect,A;(direct)(direct)(A)ANLdirect,#data;(direct)(direct)data该组指令的功能:将源操作数和目的操作数按对应位进行逻辑“与”运算,并将结果存入目的地址(前4条指令为A,后2条指令为直接寻址的direct单元)中。与运算规则是:与“0”相与,本位为“0”(即屏蔽);与“1”相与,本位不变。逻辑“与”指令常用于屏蔽操作数中的某些位。(2)逻辑“或”指令,逻辑“或”指令有以下形式:ORL A,Rn;A(A)(Rn)ORL A,Ri;A(A)(Ri)ORL A,direct;A(A)(direct)ORL A,#d
19、ata;A(A)dataORL direct,A;(direct)(direct)(A)ORL direct,#data;(direct)(direct)data该组指令的功能:将源操作数和目的操作数按对应位进行逻辑“或”运算,并将结果存入目的地址(前4条指令为A,后2条指令为直接寻址的direct单元)中。或运算规则是:与“1”相或,本位为“1”;与“0”相或,本位不变。,(3)逻辑“异或”指令逻辑“异或”指令有以下形式:XRL A,Rn;A(A)(Rn)XRL A,Ri;A(A)(Ri)XRL A,direct;A(A)(direct)XRL A,#data;A(A)dataXRL dir
20、ect,A;(direct)(direct)(A)XRL direct,#data;(direct)(direct)data该组指令的功能是:将源操作数和目的操作数按对应位进行逻辑“异或”运算,并将结果存入目的地址(前4条指令为A,后2条指令为直接寻址的direct单元)中。异或运算的运算规则是:与“1”异或,本位为非(即求反);与“0”异或,本位不变。,2.单操作数逻辑运算指令单操作数逻辑运算指令有以下形式:(1)累加器A清0指令CLRA;A0(2)累加器A求反指令CPLA;A()3.累加器A循环移位指令(1)累加器A循环移位指令累加器A循环移位指令有以下形式:RL A;A的各位依次左移一位
21、,A.0A.7RR A;A的各位依次右移一位,A.7A.0该组指令不影响标志位。当A的最高位(D7)为0时,执行一次RL指令相当于对A进行一次乘2操作。,当A的最低位(D0)为0时,执行一次RR指令相当于对A进行一次除2操作。(2)带进位位Cy的累加器A循环移位指令带进位位Cy的累加器A循环移位指令有以下形式:RLCA;A的各位依次左移一位,CyA.7,A.0CyRRC A;A的各位依次右移一位,CyA.0,A.7Cy3.3.4 控制转移类指令 控制转移指令共17条,可分为三类:无条件转移指令、条件转移指令及子程序调用与返回指令。1.无条件转移指令不受任何条件限制的转移指令称为无条件转移指令。
22、MCS-51无条件转移指令有以下类型:(1)长转移指令,长转移指令有以下惟一形式:LJMPaddrl6;PC(PC)+2;PCaddr16该指令功能:把16位地址(addr16)送给PC,从而实现程序转移。允许转移的目标地址在整个程序存储器空间。(2)绝对转移指令绝对转移指令有以下惟一形式:AJMPaddr11;PC(PC)+2;PC100addr100,PC1511不变该指令功能:把PC当前值(加2修改后的值)的高5位与指令中的11位地址拼接在一起,共同形成16位目标地址送给PC,从而使程序转移。(3)相对转移指令(亦称短转移指令)相对转移指令有以下惟一形式:SJMPrel;PC(PC)+2
23、+rel,该指令的功能:根据指令中给出的相对偏移量rel(相对于当前PC=(PC)+2),计算出程序将要转移的目标地址(PC)+2+rel,把该目标地址送给PC。(4)间接长转移指令(相对长转移指令)间接长转移指令有以下惟一形式:JMPA+DPTR;PC(A)+(DPTR)该指令也称散转指令,其功能是把累加器A中8位无符号数与数据指针DPTR的16位数相加,结果作为下一条指令地址送入PC,指令执行后不改变A和DPTR中的内容,也不影响标志位。2.条件转移指令所谓条件转移指令是指根据指令中给定的判断条件决定程序是否转移。,当条件满足时,就按指令给定的相对偏移量进行转移;否则,程序顺序执行。MCS
24、-51的条件转移指令有以下类型:(1)累加器判零转移指令累加器判零转移指令有以下形式:JZrelJNZrel这两条指令均为双字节指令,以累加器A的内容是否为0作为转移的条件。本指令执行前,累加器A应有确定的值。(2)比较不相等转移指令比较不相等转移指令有以下形式:1)指令格式为:CJNEA,#data,rel该指令的功能:若Adata,则PC(PC)+3+rel,且Cy=0(满足条件相对转移)。若(A)data,则,PC(PC)+3+rel,且Cy=1(满足条件相对转移)。否则,PC(PC)+3且Cy=0(顺序执行)。2)指令格式为:CJNEA,direct,rel该指令的功能:若(A)(di
25、rect),则PC(PC)+3+rel,且Cy=0(满足条件相对转移)。若(A)data,则PC(PC)+3+rel,且Cy=0(满足条件相对转移)。若(Rn)data,则PC(PC)+3+rel,且Cy=1(满足条件相对转移)。否则,PC(PC)+3且Cy=0(顺序执行)。4)指令格式为:CJNERi,data,rel,该指令的功能:若(Ri)data,则PC(PC)+3+rel,且Cy=0(满足条件相对转移)。若(Ri)data,则PC(PC)+3+rel,且Cy=1(满足条件相对转移)。否则,PC(PC)+3且Cy=0(顺序执行)。(3)减1不为0转移指令减1不为0转移指令有以下形式:D
26、JNZRn,relDJNZdirect,rel该组指令中第一条指令为两字节指令,第二条指令为三字节指令。3.空操作指令空操作指令有以下惟一形式:NOP;PC(PC)+1空操作指令是惟一的一条不使CPU产生任何操作控制的指令,NOP指令的功能是使程序计数器PC加1,在执行时间上消耗12个时钟周期。,3.3.5 位操作类指令 位操作指令共17条,所有的位操作指令均采用位(直接)寻址方式,在进行位操作时,MCS-51汇编语言中的位地址可用以下四种方式表示:(1)直接位地址方式。(2)点操作符表示方式。(3)位名称方式。(4)用户定义名方式。1.位传送指令位传送指令有以下形式:MOVC,bit;Cy(
27、bit)MOVbit,C;(bit)(Cy)指令中其中一个操作数必须是进位标志C,bit可表示任何直接位地址。,2.位置位和复位指令(1)位置位指令位置位指令有以下形式:SETBC;Cy1SETBbit;(bit)1(2)位复位指令位复位指令有以下形式:CLRC;Cy0CLRbit;(bit)0采用这类指令可以对布尔累加器C和指定位置1或清零。3.位逻辑运算指令(1)位逻辑“与”指令位逻辑“与”指令有以下形式:ANLC,bit;C(C)(bit)ANLC,/bit;C(C)(),该组指令的功能是:进位标志Cy与直接寻址位的布尔值进行位逻辑“与”运算,结果送入Cy。(2)位逻辑“或”指令位逻辑“
28、或”指令有以下形式:ORLC,bit;C(C)(bit)ORLC,/bit;C(C)()该组指令的功能是:进位标志Cy与直接寻址位的布尔值进行位逻辑“或”运算,结果送入Cy。(3)位逻辑“非”指令位逻辑“非”指令有以下形式:CPLC;Cy()CPLbit;(bit)()该组指令的功能是:对进位标志Cy或直接寻址位bit的布尔值进行位逻辑“非”运算,结果送入Cy或bit。,4.位条件转移指令(1)位累加器Cy状态判断转移指令位累加器Cy状态判断转移指令有以下形式:JCrelJNCrel该组指令通常与CJNE指令一起使用,可以比较出两个数的大小,从而形成大于、小于、等于三个分支。(2)位状态判断转
29、移指令位状态判断转移指令有以下形式:JBbit,relJNBbit,relJBCbit,rel该组指令为三字节指令。,3.3.6 子程序调用与返回指令 在调用子程序过程中需要解决以下方面的问题:(1)保护断点。所谓断点是指子程序调用指令的下一条指令的第一个字节地址。(2)建立子程序入口。子程序入口是指子程序中第一条指令的第一个字节地址,即子程序调用指令给出的目标地址。(3)保护现场。所谓保护现场是指在执行子程序前,需要保存程序中正在使用的存储单元和寄存器的内容。MCS-51子程序调用与返回指令有以下形式:1)绝对调用指令ACALLaddrl1 其功能是:首先保护断点,将PC的值压栈保护(先压低
30、位,后压高位),接着将指令中的11位目标地址(addr11)送入PC的低11位与PC的高5位合成一个程序要转移的目标地址。,2)长调用指令LCALLaddrl6 其功能是:首先保护断点,将PC的值压栈保护(先压低位,后压高位),接着将指令中的16位目标地址(addr16)送入PC,即子程序入口地址,从而转去执行被调用的子程序。3)一般子程序返回指令RET 当程序执行到本指令时,自动从堆栈中取出断点地址送给PC,程序返回断点的下一条指令处,继续往下执行。4)中断子程序返回指令RETI 该指令除具有RET指令的功能外,RETI在返回断点的同时,还要释放中断逻辑以接受新的中断请求。中断服务程序(中断
31、子程序)必须用RETI返回。,3.4 汇编语言程序设计基础汇编语言是一种采用助记符表示的机器语言。汇编语言与高级语言相比有以下特点:(1)在功能相同的条件下,汇编语言生成的目标程序,所占用的存储单元比较少,而且执行的速度也比较快。(2)由于单片机应用的许多场合主要是输入输出、检测及控制,而汇编语言具有直接针对输入输出端口的操作指令,便于自控系统及检测系统中数据的采集与发送。3.4.1 汇编语言程序的组成汇编语言语句可分为:指令性语句(即汇编指令)和指示性语句(即伪指令)。1.指令性语句指令性语句(可简称指令)是进行汇编语言程序设计的可执行语句,每条指令都产生相应的机器语言的目标代码。,2.指示
32、性语句指示性语句(伪指令)又称汇编控制指令。它是控制汇编(翻译)过程的一些命令,程序员通过伪指令要求汇编程序在进行汇编时的一些操作。因此,伪指令不产生机器语言的目标代码,是汇编语言程序中的不可执行语句。伪指令主要用于指定源程序存放的起始地址、定义符号、指定暂存数据的存储区以及将数据存入存储器、结束汇编等。3.4.2 伪指令MCS-51单片机汇编语言中常用的伪指令如下:1.ORG(汇编起始地址)格式:ORG 16位地址功能:规定紧跟在该伪指令后的源程序经汇编后产生的目标程序在程序存储器中存放的起始地址。2.END(结束汇编)格式:END或END 标号功能:汇编语言源程序的结束标志,即通知汇编程序
33、不再继续往下汇编。,3.EQU(等值)格式:标识符 EQU 数或汇编符号功能:把数或汇编符号赋给标识符,且只能赋值一次。4.DB(定义字节)格式:标号:DB 项或项表功能:将项或项表中的字节(8位)数据依次存入标号所指示的存储单元中。5.DW(定义字)格式:标号:DW 项或项表功能:将项或项表中的字(16位)数据依次存入标号所指示的存储单元中。6.DS(定义存储单元)格式:标号:DS 数字功能:从标号所指示的单元开始,根据数字的值保留一定数量的字节存储单元,留给以后存储数据用。,7.BIT(地址符号命令)格式:标识符 BIT 位地址功能:将位地址赋以标识符(注意,不是标号)。3.4.3 程序设
34、计步骤及技术 1.程序设计步骤汇编语言程序设计一般经过以下几个步骤:(1)分析问题,明确任务要求,对于复杂的问题,还要将要解决的问题抽象成数学模型。(2)确定算法,即根据实际问题和指令系统的特点确定完成这一任务需经历的步骤。(3)根据所选择的算法,确定内存单元的分配;使用哪些存储器单元;使用哪些寄存器;程序运行中的中间数据及结果存放在哪些单元,以利于提高程序的效率和运行速度。(4)根据流程图,编写源程序。(5)上机对源程序进行汇编、调试。,2.程序设计技术 3.5 程序设计实例3.5.1 汇编语言基本程序设计1.简单程序 简单程序是按照程序编写的顺序逐条依次执行的,是程序的最基本的结构。【例3
35、-39】将片内RAM的30H和31H的内容相加,结果存入32H。假设整个程序存放在存储器中以2000H为起始地址的单元。程序1:ORG 2000HMOV A,30H;取第一个操作数ADD A,31H;两个操作数相加MOV 32H,A;存放结果END本程序采用直接寻址方式传送数据进行两个操作数相加运算。,2.分支程序分支程序是根据程序中给定的条件进行判断,然后根据条件的“真”与“假”决定程序是否转移。【例3-41】把片外RAM的首地址为10H开始存放的数据块,传送给片内RAM首地址为20H开始的数据块中去,如果数据为“0”,就停止传送。程序如下:ORG 2000HMOV R0,#10HMOV R
36、1,#20HLOOP:MOVX A,R0;A片外RAM数据HERE:JZ HERE;数据=0终止,程序原地踏步MOV R1,A;片内RAMAINC R0,INC R1SJMP LOOP;循环传送 END3.循环程序在程序执行过程中,当需要多次反复执行某段程序时,可采用循环程序。循环程序一般由三部分组成:(1)初始化。(2)循环体。(3)循环控制。【例3-43】有20个数存放在内部RAM从41H开始的连续单元中,试求其和并将结果存放在40H单元(和数是一个8位二进制数,不考虑进位问题)。程序流程图如图3-3所示。程序如下:ORG2000H,MOV A,#00H;清累加器A MOV R7,#14H
37、;建立循环计数器R7初值MOV R0,#41H;建立内存数据指针LOOP:ADD A,R0;累加INCR0;指向下一个内存单元DJNZ R7,LOOP;修改循环计数器,判循环结束条件MOV 40H,A;存累加结果于40HSJMP$END3.5.2 延时程序设计【例3-45】较长时间的延时子程序,可以采用多重循环来实现。利用CPU中每执行一条指令都有固定的时序这一特征,令其重复执行某些指令从而达到延时的目的。,子程序如下:源程序 机器周期数DELAY:MOV R7,#0FFH 1LOOP1:MOV R6,#0FFH 1LOOP2:NOP 1NOP 1DJNZR6,LOOP2 2DJNZR7,LO
38、OP1 2RET 23.5.3 代码转换程序设计【例3-46】编写一子程序,将8位二进制数转换为BCD码。设要转换的二进制数在累加器A中,子程序的入口地址为BCD1,转换结果存入R0所指示的RAM中。程序如下:,BCD1:MOVB,#100DIVAB;A百位数,B余数MOVR0,A;(R0)百位数INCR0MOVA,#10XCHA,BDIVAB;A十位数,B个位数SWAPAADDA,B;十位数和个位数组合到AMOVR0,A;存入(R0)RET3.5.4 查表程序设计查表是程序设计中使用的基本方法。只要适当地组织表格,就可以十分方便地利用表格进行多种代码转换和算术运算等。【例3-49】利用表格计
39、算内部RAM的40H单元中一位BCD数的平方值,并将结果存入41H单元。首先组织平方表,且把它作为程序的一部分。,程序如下:ORG 2000HMOV A,40HMOV DPTR,#SQTABMOVC A,A+DPTRMOV 41H,ASJMP$SQTAB:DB 0,1,4,9,16,25,36,49,64,813.5.5 运算程序设计【例3-50】编写一子程序,实现多字节加法。两个多字节数分别存放在起始地址为FIRST和SECOND的连续单元中(从低位字节开始存放),两个数的字节数存放在NUMBER单元中,最后求得的和存放在FIRST开始的区域中。使用MCS-51字节加法指令进行多字节的加法运
40、算,可用循环程序来实现。,SUBAD:MOV R0,#FIRSTMOV R1,#SECOND;置起始地址MOV R2,NUMBER;置计数初值CLRC;清CyLOOP:MOV A,R0ADDCA,R1;进行一次加法运算MOV R0,A;存结果INCR0 INC R1;修改地址指针DJNZR2,LOOP;计数及循环控制RET3.5.6 排序程序设计【例3-51】设N个数据依次存放在内部RAM以BLOCK开始的存储单元中,编写程序实现N个数据按升序次序排序,结果仍存放在原存储单元中。,冒泡排序法的基本算法是:N个数排序,从数据存放单元的一端(如起始单元)开始,将相邻二个数依次进行比较,如果相邻两个
41、数的大小次序和排序要求一致,则不改变它们的存放次序,否则相互交换两数位置,使其符合排序要求,这样逐次比较,直至将最小(降序)或最大(升序)的数移至最后。然后,再将n-1个数继续比较,重复上面操作,直至比较完毕。程序如下:ORG0000HBLOCKEQU 20H;设BLOCK为20H单元NEQU 10 MOV R7,#N-1;设置外循环计数器NEXT:MOV A,R7MOV 80H,AMOV R6,A;设置外循环计数器,MOV R0,#20H;设置数据指针COMP:MOV A,R0 MOV R2,A INC R0 CLRC SUBB A,R0 JCLESS MOVA,R2 XCHA,R0 DEC
42、 R0 MOVR0,A INC R0LESS:DJNZR6,COMP;(R6)-1不等于0,转 COMP继续内循环,MOVR0,#20H DEC 80H MOV R6,80h DJNZR7,COMP RET END3.5.7 输入输出程序设计【例3-52】编写一数据输入程序,每当P0.0由高电平变为低电平时,由P1口读入1个数据,连续读入N次。读入数据分别存入内部RAM以BLOCK开始的存储单元中。程序如下:ORG 0000 BLOCK EQU 20H N EQU 10 MOV R2,#8H MOV R0,#BLOCK,LOOP:MOV P1,#0FFH JBP0.0$MOVA,P1 JNB
43、P0.0$MOV R0,A INC R0 DJNZ R2,LOOP RETEND3.5.8 数字滤波程序设计【例3-54】限幅滤波子程序可以有效的抑制尖脉冲干扰。设D1、D2为内部RAM单元,分别存放有某一输入口在相邻时刻采样的两个数据,如果它们的差值过大,超出了允许相邻采样值之差的最大变化范围M,则认为发生了干扰,此次输入数据予以剔除,则用D1单元的数据取代D2。,滤波程序如下:ORG 0000H PT:MOV A,D2 CLR C SUBB A,D1 JNC PT1 CPL A INC A PT1:CJNE A,#M,PT2 AJMP DONE PT2:JC DONE MOV D2,D1 ONE:RET END,本章结束 谢谢使用,