1、第3章51系列单片机的指令系统和程序设计方法(1) 理解指令的寻址方式及相应的寻址空间。(2) 理解51系列单片机的111条基本指令的含义,熟练掌握其应用方法。(3) 了解机器语言、汇编语言和高级语言的特点、汇编语言程序设计步骤。(4) 掌握汇编语言的基本格式,熟练掌握汇编语言的程序设计思想和设计方法。(5) 理解子程序的特点,掌握子程序的设计方法和设计中应该注意的问题。3.1指令系统概述3.2寻址方式3.3数据传送类指令5.16位数据的传递指令(1条)3.4算术运算类指令第3章51系列单片机的指令系统和程序设计方法3.5逻辑运算类指令3.6位操作类指令3.7控制转移类指令3.8汇编语言程序设
2、计3.1指令系统概述3.1.1指令分类3.1.2指令格式3.1.3指令中常用缩写符号的意义3.1.1指令分类1.按指令功能可分为五类2.按指令执行所需要的时间可分为三类3.按指令所占的字节数可分为三类1.按指令功能可分为五类1)数据传送类指令(29条):内部8位数据传送指令15条,内部16位数据传送指令1条,外部数据传送指令4条,交换、查表和堆栈操作指令9条。2)算术传送类指令(24条):加法指令14条(包括BCD码调整指令1条),减法指令8条,乘/除法指令各1条。3)逻辑运算类指令(24条):逻辑运算指令20条,循环移位指令4条。4)位操作指令(12条):位传送指令2条,位置位、位清“0”和
3、位取反指令6条,位运算指令4条。5)控制转移类指令(22条):无条件转移指令4条,条件转移指令8条,调用和返回指令5条,位测试转移指令3条,判别CY标志转移指令2条。2.按指令执行所需要的时间可分为三类1)单周期指令(64条)。2)双周期指令(45条)。3)四周期指令(2条)。3.按指令所占的字节数可分为三类1)单字节指令(49条)。2)双字节指令(46条)。3)三字节指令(16条)。3.1.2指令格式1.指令格式介绍2.指令中数据的表示1.指令格式介绍1)汇编语言语句由标号、操作码、操作数和注释四部分组成。2)标号位于语句的开始,由18个ASCII字符组成,第一个字符必须是字母。3)操作码是
4、用英文缩写的指令功能助记符。4)操作数在操作码之后,两者用空格分开。5)注释在语句的最后,以分号“;”开始,是说明性的文字,与语句的具体功能无关,但是能增加程序的可阅读性,便于程序的调试与交流。2.指令中数据的表示1)十进制数以D结尾,也可以省略,如55D或55。2)十六进制数以H结尾,如55H。3)二进制数以B结尾,如00110011B。4)八进制数以O或Q结尾,如55O或55Q。5)字符串用“”括起来,如M表示字符M的ASCII码。3.1.3指令中常用缩写符号的意义1)#data:8位立即数。2)#data16:16位立即数。3)Rn:工作寄存器,R0R7,n=07。4)Ri:工作寄存器,
5、i=0或1。5):间接地址符号。6)direct:8位直接地址,可以是特殊功能寄存器(SFR)的地址或片内RAM单元地址。7)addr11:11位目的地址。8)addr16:16位目的地址。9)rel:有符号的8位偏移地址,主要用于所有的条件转移指令和SJMP指令。10)bit:位地址。11)/ : 位操作数的前缀,表示对该位操作数取反,如 /bit。3.1.3指令中常用缩写符号的意义12):当前指令存放的地址。13)(X):表示由X所指定的某寄存器或某单元中的内容。14)(X):表示由X间接寻址单元中的内容。15)B:通用寄存器,常用于乘法MUL和除法DIV的指令。16)C:进位标志位或者布
6、尔处理器中的累加器。17):表示指令的操作结果是将箭头右边的内容传送到左边。3.2寻址方式3.2.1立即寻址3.2.2直接寻址3.2.3寄存器寻址3.2.4寄存器间接寻址3.2.5变址寻址3.2.6相对寻址3.2.7位寻址3.2.1立即寻址立即寻址是指指令中直接给出操作数的寻址方式。立即数用前面加有#号的8位或16位数来表示。立即数是指令代码的一部分,只能作源操作数。这种寻址方式主要用于对特殊功能寄存器和指定的存储单元赋初值。3.2.2直接寻址1) 特殊功能寄存器(SFR):直接寻址是唯一的访问形式。2) 片内RAM低128B单元(地址范围00H7FH)。3) 221个位地址空间。3.2.3寄
7、存器寻址寄存器寻址是指操作数存放于寄存器中(Rn、A、B、DPTR、CY)的寻址方式。例如:MOVA,R7;(A)(R7)其功能是把寄存器R7内的操作数传送到累加器A中。由于操作数在R7中,因此在指令中指定了R7,就能从中取得操作数。3.2.4寄存器间接寻址图3-1寄存器间接寻址示意图3.2.5变址寻址图3-2变址寻址示意图3.2.6相对寻址1)当前PC值是指相对转移指令所在地址(一般称为源地址)加上转移指令字节数,即当前PC值=源地址+转移指令字节数。2)偏移量rel是有符号的单字节数,以补码表示,其相对值的范围是-128+127,负数表示从当前地址向地址减小的方向转移,正数表示从当前地址向
8、地址增大的方向转移。图3-3相对寻址示意图a)指令JZ 08H寻址示意图b)指令JZ 0F4H寻址示意图3.2.7位寻址1)直接使用位地址。2)位名称表示方法。3)单元地址加位数的表示方法。4)专用寄存器符号加位数的表示方法。表3-17种寻址方式及寻址空间序号寻址方式寻址空间范围1寄存器寻址R0R7,A,B,CY,DPTR寄存器2立即寻址程序存储器3寄存器间址片内RAM的00H0FFH,片外RAM4直接寻址片内RAM的00H7FH,SFR5变址寻址程序存储器6相对寻址程序存储器7位寻址片内RAM的20H2FH的128位,SFR中的93位3.3数据传送类指令3.3.1片内RAM数据传送类指令3.
9、3.1片内RAM数据传送类指令1.以累加器为目的操作数的指令(4条)2.以寄存器Rn为目的操作数的指令(3条)3.以直接地址为目的操作数的指令(5条)4.以间接地址为目的操作数的指令(3条)3.3.1片内RAM数据传送类指令图3-4片内RAM间数据传递关系1.以累加器为目的操作数的指令(4条)MOVA,Rn;(A)(Rn),(n=07)MOVA,direct ;(A)(direct)MOVA,Ri ;(A)(Ri)(i=0、1)MOVA,data ;(A) data 这组指令的目的操作数都是累加器A,源操作数的寻址方式采用寄存器寻址、直接寻址、寄存器间接寻址和立即寻址。2.以寄存器Rn为目的操
10、作数的指令(3条)MOVRn,A;(Rn) (A),(n=07)MOVRn,direct ;(Rn) (direct),(n=07)MOVRn,data ;(Rn) data,(n=07)这组指令都是以工作寄存器为目的操作数,源操作数的寻址方式采用寄存器寻址、直接寻址和立即寻址。 3.以直接地址为目的操作数的指令(5条)MOVdirect,A ;(direct)(A) MOVdirect,Rn ;(direct)(Rn),(n=07)MOVdirectl,direct2 ;(direct1)(direct2)MOVdirect,Ri ;(direct) (Ri),(i=0、1)MOVdirec
11、t,data ;(direct)data这组指令的目的操作数都是直接寻址单元,源操作数采用寄存器寻址、直接寻址、寄存器间接寻址和立即寻址。 4.以间接地址为目的操作数的指令(3条)MOVRi,A ;(Ri)(A)MOVRi,direct ;(Ri)(direct)MOVRi,data ;(Ri)data 这组指令的目的操作数都是间接寻址单元,源操作数可采用寄存器寻址、直接寻址和立即寻址方式。5.16位数据的传递指令(1条)(1) MOVA,R0和MOVA,R0(2) MOVA, #40H和MOVA,40H3.3.2片外RAM数据传送类指令3.3.3程序存储器向累加器A传送数据类指令3.3.4数
12、据交换类指令3.3.5堆栈操作类指令(2) MOVA, #40H和MOVA,40H解:它们的执行结果为解:运行结果为解:上述指令均是错误的。解法一: MOV55H,15H解法二: MOVR6,15H解法三: MOVR1,15H解法四:MOVA,15H解:30H和40H单元中都装有数据,要想把其中的内容相交换必须寻求第三个存储单元对其中的一个数进行缓冲,这个存储单元若选为累加器A,则相应程序如下:3.3.2片外RAM数据传送类指令1)要访问片外RAM,必须知道片外RAM单元的地址,在后两条指令中,地址是被直接放在DPTR中,可寻址片外RAM的64KB空间。2)使用访问片外RAM数据传送指令时,应
13、当首先将要读或写的地址送入DPTR或Ri中,然后再用读或者写命令。3)也可以由P2与R0或P2与R1组成16位地址指针,寻址片外RAM的64KB空间。3.3.3程序存储器向累加器A传送数据类指令1)MOVC A,A+DPTR:这条指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址无关。2)MOVC A, A+PC:这条指令的优点是不改变SFR和PC的状态,只要根据A的内容就可以取出表格中的常数。3.3.3程序存储器向累加器A传送数据类指令图3-5查表指令图3-609二次方值表3.3.4数据交换类指令1.字节交换指令(Exchange,XCH2.半字节交换指令(1条)3.累加
14、器A高低半字节交换指令(1条)1.字节交换指令(Exchange,XCHXCHA,Rn ;(A)(Rn)XCHA,Ri ;(A)(Ri)XCHA,direct ;(A)(direct) 指令功能:将累加器A的内容与源操作数(Rn、direct或Ri)所指定单元的内容相互交换。2.半字节交换指令(1条)XCHD A,Ri ;(A)30 (Ri)30指令功能:将累加器A中的内容的低4位与Ri所指的片内RAM单元中的低4位互换,但它们的高4位均不变。例如,设(A)=0ABH,(R0)=30H,(30H)=12H,执行指令“XCHD A,R0”后,(A)=0A2H,(30H)=1BH。3.累加器A高低
15、半字节交换指令(1条)解:本题是一个字节交换问题,故可以采用3条字节交换指令中的任何一条。若采用第三条字节交换指令,则相应程序为解:09的ASCII码为30H39H。进行比较后发现,两者之间仅相差30H,故可以利用半字节指令把09的数装配成相应的ASCII码。程序如下:3.3.5堆栈操作类指令1)PUSH称为压栈指令,将指定的直接寻址单元的内容压入堆栈。2)POP称为出栈指令,它是将当前堆栈指针SP所指示的单元内容弹出到指定的片内RAM单元中,然后再将SP减1。图3-7堆栈指令执行过程a)指令“PUSH 40H”操作示意图b)指令“POP 30H”操作示意图3.4算术运算类指令3.4.1加法指
16、令3.4.2减法指令3.4.3乘法指令3.4.4除法指令3.4.1加法指令1.不带进位位的加法指令(Addition,ADD1 001101002.带进位加法指令(Addition3.增量指令(Increase,INC 4.十进制调整指令(Decimal1.不带进位位的加法指令(Addition,ADD解:100001012.带进位加法指令(Addition解:参考程序如下:3.增量指令(Increase,INC 解:4.十进制调整指令(Decimal1)这条指令必须紧跟在ADD或ADDC指令之后,对加法指令的结果进行调整,且这里的ADD或ADDC的操作是对压缩的BCD码表示的数进行运算。2)
17、DA指令不影响溢出标志。1W4.TIF3.4.2减法指令1.带借位减法指令(Subtract2.减1指令(Decrease,DEC1.带借位减法指令(Subtract图3-8例题3-19程序流程图2.减1指令(Decrease,DEC解:首先要考虑到“DA A”指令只能对加法调整,故必须先化BCD减法为加法,关键是求两位十进制减数的补码(9AH减数),如图3-8所示。1W5.TIF1W6.TIF3.4.3乘法指令1)若乘积大于255,(OV)=1;否则(OV)=0。2)CY总是为“0”。3)P受累加器A中的内容影响。图3-9例题3-20程序流程图1W7.TIF3.4.4除法指令1)CY、OV,
18、清“0” 。2)若(B)=0,(OV)=1。3)P受累加器A 中的内容影响。1)将要转换的二进制数除以100,商即为百位数,余数再除以10,商和余数分别为十位和个位数。2)通过SWAP、ADD指令组成一个压缩的BCD数,其中十位数放在A74,个位数放在A30。1)乘法指令和除法指令需要4个机器周期,是指令系统中执行时间最长的指令。2)在进行8位数乘除法运算时,必须将相应的被乘数和乘数、被除数和除数分别放入累加器A和寄存器B中,才能进行计算。3)在51单片机中,乘法和除法指令仅适用于8位数乘法和除法运算。3.4.4除法指令图3-10例3-21流程图3.5逻辑运算类指令3.5.1累加器A的逻辑运算
19、指令3.5.2两个操作数的逻辑操作运算指令3.5.1累加器A的逻辑运算指令1.累加器清“0” 2.累加器按位取反指令3.循环移位指令(4条)1W8.TIF1W10.TIF3.循环移位指令(4条)1W11.TIF1W9.TIF3.5.2两个操作数的逻辑操作运算指令1.逻辑“与”操作指令(And2.逻辑“或”操作指令(Or3.逻辑“异或”指令(6条)1.逻辑“与”操作指令ANLA,Rn ;(A)(A)(Rn) ANLA,direct ;(A)(A)(direct) ANLA,Ri ;(A)(A)(Ri) ANLA,#data ;(A)(A) data ANLdirect,A ;(direct)(d
20、irect)(A) ANLdirect,#data ;(direct)(direct) data 指令功能:将两个操作数的内容按位进行逻辑“与”操作,并将结果送回目的操作数的单元中。利用“与”操作可屏蔽一些位或影响标志位。例如,要将一个字节中的高4位清“0”,可用0FH进行“与”操作。2.逻辑“或”操作指令ORLA,Rn ;(A)(A)(Rn) ORLA,direct ;(A)(A)(direct) ORLA,Ri ;(A)(A)(Ri) ORLA,#data ;(A)(A)data ORLdirect,A ;(direct)(direct)(A) ORLdirect,#data ;(dire
21、ct)(direct) data 指令功能:将两个操作数的内容按位进行逻辑“或”操作,并将结果送回目的操作数的单元中。利用“或”操作可进行数位的组合。例如,要把数字转换成ASCII码,可用30H进行或操作。3.逻辑“异或”指令(6条)解:完成本题有多种求解方法,现介绍其中两种。(1)利用MOVX(2)利用MOVX(1)利用MOVX1W12.TIF(2)利用MOVX1)选用工作寄存器组中0区为工作区。2)利用移位指令实现累加器A的内容乘6。1) ANLPSW,#11100111B ;PSW的D4、D3位为002) CLRC3.6位操作类指令3.6.1位变量传送指令3.6.2位变量修改指令3.6.
22、3位变量逻辑操作指令3.6.1位变量传送指令位变量传送指令有互逆的2条,可实现进位位C与某直接寻址位bit间内容的传送。MOVC,bit ;(CY)(bit) MOVbit,C ;(bit)(CY) 指令功能:把源操作数的布尔变量送到目的操作数指定的位地址单元,其中一个操作数必须为进位标志CY,另一个操作数可以是任何可直接寻址位。3.6.2位变量修改指令位变量修改指令共有6条,分别是对位进行清“0”、置“1”和取反指令,不影响其他标志。CLRC ;(CY)0 CLRbit ;(bit)0 CPLC ;(CY)(/CY) CPLbit ;(bit)(/bit) SETBC ;(CY)1 SETB
23、bit ;(bit)1 3.6.3位变量逻辑操作指令位变量逻辑操作指令包括位变量逻辑“与”和逻辑“或”,共有4条指令。 ANLC,bit ;(CY)(CY)(bit)ANLC,/bit ;(CY)(CY)(/bit)ORLC,bit ;(CY)(CY)(bit)ORLC,/bit ;(CY)(CY)(/bit)【注意】位变量逻辑运算指令中无逻辑“异或”(XRL)。3.6.3位变量逻辑操作指令图3-11例3-29硬件逻辑电路3.7控制转移类指令3.7.1无条件转移指令3.7.2条件转移指令3.7.3调用与返回指令3.7.1无条件转移指令1.绝对转移指令(Absolute2.相对转移指令(Shor
24、t3.长转移指令(Long4.间接转移指令(散转指令)1.绝对转移指令(Absolute1W13.TIF1.绝对转移指令(Absolute1W14.TIF2.相对转移指令SJMPrel;(PC)(PC)+2+rel转移范围为当前PC值的128+127范围内,共256个单元。 若偏移量rel取值为0FEH(2的补码),则目标地址等于源地址,相当于动态停机,程序终止在这条指令上,停机指令在调试程序时很有用。51系列单片机没有专用的停机指令,若要求动态停机可用SJMP指令来实现: HERE:SJMPHERE;动态停机 3.长转移指令LJMPaddr16;(PC)addr16 执行该指令时,将16位目
25、标地址addr16装入PC,程序无条件转向指定的目标地址。转移指令的目标地址可在64KB程序存储器地址空间的任何地方,不影响任何标志。4.间接转移指令(散转指令) JMPA+DPTR;(PC)(A)(DPTR)4.间接转移指令(散转指令)JMPA+DPTR;(PC)(A)(DPTR)指令功能:把累加器A中的8位无符号数与数据指针DPTR的16位数相加,其和作为下一条指令的地址送入PC,不影响标志位。间接转移指令采用变址方式实现无条件转移,其特点是转移地址可以在程序运行中加以改变。例如,把DPTR作为基地址时,根据A的不同值就可以实现多分支转移,故一条指令可完成多条条件判断转移指令功能。这种功能
26、称为散转功能,所以间接指令又称为散转指令。 3.7.2条件转移指令1.进位/无进位转移指令2.累加器内容为零/非零转移指令3.比较不相等转移指令4.减1不为零转移指令5.位测试指令1.进位/无进位转移指令JCrel ;(CY)=1,则(PC)(PC)+2+rel ;(CY)=0,则(PC)(PC)+2JNCrel ;(CY)=0,则(PC)(PC)+2+rel ;(CY)=1,则(PC)(PC)+2指令功能:第一条指令执行时,先判断CY中的值。若CY1,则程序发生转移;若(CY)0,则程序不转移,继续执行原程序。第二条指令执行时的情况与第一条指令恰好相反:若(CY)0,则程序发生转移;若(CY
27、)1,则程序不转移,继续执行原程序。2.累加器内容为零/非零转移指令图3-12JZ和JNZ指令执行示意图a)JZ rel指令b)JNZ rel指令3.比较不相等转移指令1) 这4条指令都是三字节指令,指令执行时PC3次加1,然后再加地址偏移量rel。2) 指令执行过程中的比较操作实际上是减法操作,但不保存两数之差,产生CY标志。3) 若参加比较的两个操作数X和Y是无符号数,则可以直接根据指令执行后产生的CY来判断两个操作数的大小。4) 若参加比较的两个操作数X和Y是有符号数补码。图3-13带符号数的比较方法4.减1不为零转移指令DJNZRn,rel ;两字节指令DJNZdirect,rel;三
28、字节指令,direct可以是片内RAM任意字节地址指令功能:把源操作数减1,结果回送到源操作数中去,如果结果不为0则转移。【注意】这两条指令均可以构成循环结构程序。5.位测试指令JBbit,rel ;(bit)=1,则(PC)(PC)+3+rel ;(bit)=0,则(PC)(PC)+3JNBbit,rel ;(bit)=0,则(PC)(PC)+3+rel ;(bit)=1,则(PC)(PC)+3JBCbit,rel ;(bit)=1,则(PC)(PC)+3+rel且(bit)0 ;(bit)=0,则(PC)(PC)+3指令功能:当某一特定条件满足时,执行转移操作指令(相当于一条相对转移指令)
29、;条件不满足时,顺序执行下面的一条指令。解:程序如下:图3-14按键连接图及流程图解:程序如下。图3-15主程序与子程序结构a)二次调用b)二级子程序嵌套3.7.3调用与返回指令1.绝对调用指令(Absolute2.长调用指令(Long3.返回指令(2条)4.空操作指令(1条)3.7.3调用与返回指令图3-16二级子程序嵌套及断点地址存放a)二级子程序嵌套示意图b)转入子程序2时的堆栈1.绝对调用指令(Absolute1)(PC)+ 2 (PC),并压入堆栈,先压入PC低8位,后压入PC高8位。2)PC1511 a100 PC,获得子程序起始地址。图3-17例3-36图2.长调用指令(Long
30、1)(PC)+ 3 (PC),并压入堆栈,先压入PC的低8位,后压入PC的高8位。2)addr16 PC,获得子程序起始地址。3)可调用64KB地址范围内的任意子程序。1) 转移指令不保存返回地址,而子程序调用指令在转向目的地址的同时,必须保留返回地址(也称为断点地址),以便执行返回指令时回到主程序断点的位置。2) 堆栈是片内RAM中一片存储区,采用先进后出的原则存取数据,调用时保护断点的工作由调用指令完成,调用后恢复断点的工作由返回指令完成。3.返回指令(2条)(1) 子程序的返回(2) 中断返回指令(1) 子程序的返回RET;PC15PC8(SP),(SP)(SP)1 ;PC7PC0(SP
31、),(SP)(SP)1指令功能:RET (Return)指令从堆栈中取出16位断点地址送回PC,使子程序返回主程序。 (2) 中断返回指令RETI;PC15PC8(SP),(SP)(SP)1 ;PC7PC0(SP),(SP)(SP)-1指令功能:RETI (Return for Interrupt) 将堆栈顶部2字节的内容送到PC中,该指令用于中断服务程序的末尾。与RET指令不同之处:RETI指令还具有清除中断优先级触发器状态、恢复中断逻辑等功能。(2) 中断返回指令图3-18红绿灯和P1口连接图4.空操作指令(1条)1) 该指令不执行任何操作,仅仅将PC加1,使程序继续向下执行。2) 该指令
32、为单周期指令,所以在时间上占用一个机器周期,常用于程序的等待或时间的延迟。3.8汇编语言程序设计3.8.1汇编语言程序设计概述3.8.2常用伪指令3.8.3顺序结构程序设计3.8.4分支结构程序设计3.8.5循环结构程序设计3.8.6子程序设计3.8.7综合编程举例3.8.1汇编语言程序设计概述1.程序设计的三种语言2.汇编语言程序设计思路1.程序设计的三种语言(1) 机器语言(2) 汇编语言(3) 高级语言(1) 机器语言在计算机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。但是用机器语言编制的程序不易看懂,难于编写、难于查错和难于交流,容易
33、出错。(2) 汇编语言汇编语言是一种面向机器的程序设计语言,它用英文字符来代替对应的机器语言。例如,用ADD代替机器语言中的加法运算,这些英文字符被称为助记符。(3) 高级语言计算机高级语言是一种面向算法、过程和对象的程序设计语言,它采用更接近人们习惯的自然语言和数学语言描述算法、过程和对象,如BASIC、C、Java等都是常用的高级语言。 2.汇编语言程序设计思路(1) 分析问题,确定算法(2) 画程序流程图(3) 编写源程序(4) 汇编和调试(1) 分析问题,确定算法先对所需解决的问题进行分析,明确目的和任务,了解现有条件和目标要求后再确定解决该问题的方法和步骤,即通常所说的算法。对于一个
34、问题,一般有多种不同的解决方案,通过比较从中挑选最优方案。(2) 画程序流程图 把算法用流程图描述出来,即用流程图中的各种图形、符号、流向线等来描述程序设计的过程,它可以清晰表达程序的设计思路。起止框:开始和结束框,在程序的开始和结束时使用。判断框:进行条件判断,以决定程序的流向。处理框:表示各种处理和运算。流向线:表示程序执行的流向。连接点:圈中标注相同数字或符号的,表示连接在一起。(3) 编写源程序根据流程图中各部分的功能,选取合适的指令和结构编写出具体程序。(4) 汇编和调试对已编写好的程序,先进行汇编。在汇编过程中,若还有语法错误,需要对源程序进行修改。汇编工作完成后,上机调试运行。先
35、输入给定的数据,运行程序,检查运行结果是否正确,若发现错误,通过分析,再对源程序进行修改。3.8.2常用伪指令1.汇编起始地址伪指令2.汇编结束伪指令3.定义字节数据伪指令4.定义字数据伪指令5.赋值伪指令6.数据地址赋值伪指令7.位地址符号定义伪指令1.汇编起始地址伪指令对已编写好的程序,先进行汇编。在汇编过程中,若还有语法错误,需要对源程序进行修改。汇编工作完成后,上机调试运行。先输入给定的数据,运行程序,检查运行结果是否正确,若发现错误,通过分析,再对源程序进行修改。2.汇编结束伪指令格式:END 指令功能:END是汇编源程序的结束标志,在整个源程序中只能有一条END命令,且位于程序的最
36、后。如果END命令出现在中间,则其后的源程序汇编时将不予处理。3.定义字节数据伪指令格式:标号:DB8位字数据表指令功能:DB (Definition Byte)命令用于定义从指定的地址开始,在程序存储器的连续单元中定义字数据。常用于存放数据表格。说明:字节数据可以是一字节常数或字符,或用逗号分开的字符串,或用引号括起来的字符串。4.定义字数据伪指令格式:标号:DW16位字数据表指令功能:DW (Definition Word)命令用于定义从指定地址开始,在程序存储器的连续单元中定义16位的字数据。说明:存放时,数据的高8位在前(低地址),低8位在后(高地址)。5.赋值伪指令格式:字符名称EQ
37、U赋值项指令功能:EQU (Equate) 用于给字符名称赋值。赋值后,其符号值在整个程序中有效。说明:赋值项可以是常数、地址、标号或表达式。其值为8位或16位二进制数。赋值以后的字符名称既可以作立即数使用,也可以作地址使用。必须先定义后使用,放在程序开头。6.数据地址赋值伪指令1) EQU指令可以把一个汇编符号赋给一个字符名称,而DATA指令不能。) EQU指令应先定义后使用,而DATA指令可以先使用后定义。7.位地址符号定义伪指令格式:字符名称BIT位地址指令功能:用于给字符名称赋以位地址。说明:位地址可以是绝对地址,也可以是符号地址(即位符号名称)。例如:KEY0BITP1.0表示把P1
38、.0的位地址赋给变量KEY0,在其后的编程过程中, KEY0就可以作为位地址(P1.0)使用。3.8.3顺序结构程序设计解:两位压缩BCD码转换成二进制数的算法为:(a1a0)BCD=10a1+a0,程序流程图如图3-19所示。3.8.3顺序结构程序设计图3-19例3-38流程图3.8.4分支结构程序设计1) 建立测试条件。2) 选用合适的条件转移指令。3) 在转移的目的地址处设定标号。1.单分支程序2.多分支程序3.8.4分支结构程序设计图3-20分支结构图图3-21分支程序结构图a)单分支结构图b)双分支结构图c)多支结构图1.单分支程序单分支程序是通过条件转移指令实现的,即根据条件对程序
39、的执行结果进行判断,条件满足则进行程序转移,条件不满足则程序顺序执行。在51系列单片机指令系统中,可利用JZ、JNZ、CJNE、DJNZ、JC、JNC、JB、JNB、JBC等指令,完成为0、为1、为正、为负以及相等、不相等各种条件判断。解:根据题意,程序流程如图3-22所示。图3-22例3-39流程图2.多分支程序1) 使用多条CJNE指令,通过逐次比较,实现多分支程序转移。2) 使用查地址表方法实现多分支程序转移。图3-23例题3-41程序流程图3.8.5循环结构程序设计1) 循环初始化。2) 循环体。3) 循环控制。4) 循环结束。1.单重循环程序2.多重循环程序图3-24循环程序结构a)
40、先处理后控制b)先控制后处理图3-25例3-42流程图图3-26例3-43流程图图3-27例3-44图a)硬件连线图b)程序流程图3.8.6子程序设计1.子程序的调用与返回2.保存与恢复寄存器内容3.子程序的参数传递4.子程序的嵌套5.典型子程序设计0123 4 5 6 7 8 9 A B C D E F1.子程序的调用与返回(1) 子程序的调用(2) 子程序的返回2.保存与恢复寄存器内容(1) 保护现场(2) 恢复现场3.子程序的参数传递1) 应用工作寄存器或累加器传递参数。2) 应用内存单元。3) 应用堆栈传递参数。4) 利用位地址传送子程序参数。图3-28子程序嵌套示意图4.子程序的嵌套
41、在子程序中若再调用子程序,称为子程序的嵌套,如图3-28所示。51系列单片机也允许多重嵌套。5.典型子程序设计(1) 延时程序(2) 查表程序(3) 代码转换程序(1) 延时程序解:根据题意,延时子程序的时限可以有以下几种方法。1) 单循环延时,延时时间t=(210+1+2)s=23s2) 双重循环延时,延时时间t=(2100+2+1)10+1+2s=2033s3) 三重循环延时,程序流程如图3-29所示。(1) 延时程序图3-29延时子程序流程图(2) 查表程序解:计算某数的二次方可采用查表的方法实现,并编写成子程序。只要两次调用子程序,并求和就可得运算结果。图3-30例3-46流程图(3)
42、 代码转换程序解:在单片机汇编程序设计中,主要涉及十六进制的16个符号“0F”的ASCII码及其数值的转换。ASCII码是有一定规律的,数字09的ASCII码为该数值加上30H,而对于字母“AF”的ASCII码为该数值加上37H。“0F”对应的ASCII码如下:1) 入口参数。2) 出口参数。(4) 算术运算子程序1W20.TIF3.8.7综合编程举例1) 输入信号。2) 输出信号。(1) 将累加器内容送工作寄存器R0。(2) 将累加器内容送片内RAM的7BH单元。(3) 将累加器内容送片外RAM的7BH单元。(4) 将累加器内容送片外RAM的007BH单元。(5) 将片外ROM中007BH单
43、元内容送累加器。(1) MOVA,#24H 与MOVA,24H(2) MOVA,R0 与 MOVA,R0(3) MOVA,R0 与 MOVXA,R0(1) MOVR0,#30H(2) MOVA,R0(3) MOVR1,A3.8.7综合编程举例(4) MOVB,Rl(5) MOVR0,P1(6) MOVP3,P1(7) MOV10H,#20H(8) MOV30H,10H(1) MOVR6,A(2) MOVR0,A(3) MOVA,#90H(4) MOVA,90H(5) MOV80H,#81H(6) MOVXR0,A(7) PUSHA(8) SWAPA3.8.7综合编程举例(9) XCHA,R0(1) MOVA,R1(2) MOVXDPTR,A(3) MOVCA,A+DPTR(4) XCHDA,R1(1) ADDA,R1(2) ADDCA,78H(3) SUBBA,#77H(4) INCR1(5) DEC78H(6) MULAB(7) DIVAB(8) ANL78H,#78H3.8.7综合编程举例(9) ORLA,#0FH(10) XRL80H,A图3-31例3-49图图3-32例3-50图图3-33例题3-51程序流程图(10) XRL80H,A图3-34习题3-27图