《MCS-51系列单片机指令系统及汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《MCS-51系列单片机指令系统及汇编语言程序设计.ppt(70页珍藏版)》请在三一办公上搜索。
1、第三章 MCS-51系列单片机指令系统,3-1 概述指令:使计算机执行某种操作的命令。33种功能,42种助记符,111条指令。MCS-51指令系统可分为5大类:数据传送类指令(共29条)算术操作类指令(共24条)逻辑操作类指令(共24条)控制转移类指令(共17条)布尔变量(位)操作类指令(共17条),一、指令系统中常用符号,1、Rn:工作寄存器,R0-R7,n=0-7;2、Ri:间址寄存器,R0,R1,i=0,13、direct:直接地址,8位内部数据存储单元地址。它可以是一个内部数据RAM单元(0127)或特殊功能寄存器地址或地址符号;4、Ri:通过寄存器R1或R0间接寻址的8位内部数据RA
2、M单元(0255),i=0,1。DPTR:通过16位数据指针间接寻址。5、#data指令中的8位立即数。#data16指令中的16位立即数。,6、rel:偏移量,补码形式的8位偏移量,用于相对转移和所有条件转移指令。偏移量相对于当前PC计算,在-128+127范围内取值。7、bit:位地址,二、MCS-51单片机的寻址方式,MCS-51单片机共有7种寻址方式:立即寻址直接寻址寄存器寻址寄存器间接寻址变址寻址相对寻址位寻址,1.立即寻址,立即寻址就是把操作数直接在指令中给出,即操作数包含在指令中。立即操作数有8位和16位两种形式,前面加“”来表示。例如:MOV A,#0FFH;将立即数FFH传送
3、到累加器A中 MOV DPTR,#2000H;将16位立即数2000H传送到数据指针DPTR中 MOV 40H,#60H;将立即数60H传送到40H内部RAM单元中,2.直接寻址,指令中直接给出操作数地址的寻址方式。例如:MOV A,30H;内部RAM中的30H单元中的数据内容传送到累加器A中,3.寄存器寻址,以通用寄存器的内容为操作数的寻址方式。通用寄存器包括:A,B,DPTR,R0R7。其中,R0R7必须在工作寄存器组之中。例如:INC R0;(R0)1R0 需要注意的是,A和B既是通用寄存器,又是具有直接地址的特殊功能寄存器。,4.寄存器间接寻址,以寄存器中的内容为地址,该地址中的内容为
4、操作数的寻址方式。能够用于寄存器间接寻址的寄存器有:R0,R1,DPTR,SP。其中,R0,R1必须在工作寄存器组之中,SP仅用于堆栈操作。例如:MOVX A,R1;外部数据RAM中地址为P2R1的单元内容A MOVX DPTR,A;A外部数据RAM中DPTR为地址的单元 寄存器间接寻址的存储器空间包括:内部数据RAM和外部数据RAM。内部数据RAM共用128字节,用一个字节的R0或R1可寻址整个空间。外部数据RAM最大可达64K字节,仅用R0或R1无法寻址整个空间。在MCS-51系列单片机指令中,对外部数据RAM作间接寻址有两种方法:第一种由P2口提供高8位外部数据RAM地址,由R0或R1提
5、供低8位地址,由此共同寻址64K空间;第二种是用16位的DPTR作寄存器间接寻址。,5.变址寻址,由程序计数器PC或DPTR加上偏移量寄存器A中内容之和形成操作数地址的寻址方式。变址寻址只能对程序存储器中的数据作寻址操作。由于程序存储器是只读存储器,因此变址寻址操作只有读操作而无写操作。例如:MOVC A,A+DPTR;A+DPTR为地址的存储器单元内容A MOVC A,A+PC;A+PC为地址的存储器单元内容A,6.相对寻址,以当前程序计数器PC的内容为基址,加上指令给出的一字节补码数形成新的PC值的寻址方式。PC中的当前值称为基地址,一字节补码数称为偏移量,新的PC值称为转移目的地址。例如
6、:JC 80H;C1跳转 表示进位位C为0,则程序计数器PC中的内容不改变,即不转移。若进位位C为1,则PC中的当前值为基地址加上偏移量80H后所得到的结果作为该转移指令的目的地址。,7.位寻址,对位地址中的内容作位操作的寻址方式。单片机中只有内部RAM和特殊功能寄存器的部分单元有位地址(两者统一编址,地址空间为00HFFH),因此,位寻址只能对有位地址的这两个空间作寻址操作。例如 SETB 20H;120H位 MOV 32H,C;进位位C32H位,3-2 数据传送类指令(共29条),以累加器A为目的操作数类指令(4条)MOV A,dir MOV A,#data MOV A,Rn MOV A,
7、Ri 例:R120H,(20H)55H,指令MOV A,R1执行后,A55H。以寄存器Rn为目的操作数的指令(3条)MOV Rn,dir MOV Rn,#data MOV Rn,A 例:(40H)30H,指令MOV R7,40H执行后,R730H。,以直接地址为目的操作数的指令(5条)MOV dir,dir MOV dir,#data MOV dir,A MOV dir,Rn MOV dir,Ri 例:R050H,(50H)10H,指令MOV 35H,R0执行后,(35H)10H。以间接地址为目的操作数的指令(3条)MOV Ri,dir MOV Ri,#data MOV Ri,A 查表指令(2
8、条)MOVC A,A+DPTR MOVC A,A+PC 例:A20H,DPTR2000H,指令MOVC A,A+DPTR执行后,程序存储器2020H单元中的内容送入A。,累加器A与片外数据存储器RAM传送指令(4条)MOVX DPTR,A MOVX A,DPTR MOVX A,,Ri MOVX Ri,A 例:DPTR2000H,外部RAM中(2000H)18H,指令MOVX A,DPTR执行后,A18H。例:P210H,R150H,A64H,指令MOVX R1,A执行后,外部RAM中(1050H)64H。堆栈操作类指令(2条)PUSH direct POP direct 例:SP07H,(35
9、H)55H,指令PUSH 35H执行后,55H送入08H地址单元,SP08H。,交换指令(5条)XCH A,Rn XCH A,Ri XCH A,directXCHD A,Ri SWAP A 例:A80H,R032H,(32H)FFH,指令XCHD A,R0执行后,A8FH,(32H)F0H。16位数据传送指令(1条)MOV DPTR,#data16,2.算术操作类指令(共24条),算术运算指令共有24条,算术运算主要是执行加、减、乘、除、增量、减量和十进制调整等指令。加法指令(4条)ADD A,#data ADD A,direct ADD A,Rn ADD A,Ri 带进位加法指令(4条)AD
10、DC A,direct ADDC A,#data ADDC A,Rn ADDC A,Ri带借位减法指令(4条)SUBB A,direct SUBB A,#data SUBB A,Rn SUBB A,Ri例:A38H,R120H,(20H)23H,C1,指令SUBB A,R1执行后,A14H,乘法指令(1条),影响标志位,C=0 MUL A,B,乘法结果高8位放B,低8位放A例:A50H,BA0H,指令MUL A,B执行后,A00H,B32H 除法指令(1条)影响标志位,C=0,OV=0 DIV A,B 除数放A,被除数放B,结果 商放 A。余数放B例:A28H,B12H,指令DIV A,B执行
11、后,A02H,B04H 加1指令(5条)INC A INC direct INC Ri INC Rn INC DPTR,减1指令(4条)DEC A DEC direct DEC Ri DEC Rn 十进制调整指令(1条)DA A;DA指令只能放在加法指令后应用,把A中按二进制相加后的结果调整成按BCD数相加的结果。,这条指令对累加器参与的BCD码加法运算所获得的8位结果(在累加器中)进行十进制调整,使累加器中的内容调整为二位BCD码。计算机进行相应的调整规则是:BCD码相加后,当低4位大于9或D3位向前有进位时,在低4位上加06H;当高4位大于9或D7位向前有进位时,在高4位上加6H。例(A)
12、=58H,(R5)=26H,执行指令:ADD A,R5DA A运算过程如图所示。,图 DA A指令执行示意图,结果:(A)=84H。,例1:多字节乘法:16位 乘 8位设16位被乘数放在寄存器R4R3中,8位乘数放R2中,求:(R4)(R3)*(R2),乘积放在R7R6R5中,其中R5放最低位。分析:乘法指令只有一条,所以必须把多字节相乘的计算过程转换成单字节相乘的表达方式。程序如下:,CHENG:MOV A,R2 MOV B,R3 MUL AB MOV R5,A MOV R6,B MOV A,R2 MOV B,R4 MUL AB ADD A,R6 MOV R6,A MOV A,B ADDC
13、A,#00H MOV R7,A RET,作业:计算 2B46H*8AH,将计算结果放在片内RAM 4FH、4EH、4DH单元,4DH放最低位。,3.逻辑操作类指令(共24条),逻辑操作类指令共有24条,主要包括“与”、“或”、“异或”、求反、清0、左右移位等逻辑操作。“与”操作指令(6条)ANL A,direct ANL A,#data ANL A,Rn ANL A,Ri ANL direct,A ANL direct,#data“或”操作指令(6条)ORL A,direct ORL A,#data ORL A,Rn ORL A,Ri ORL direct,A ORL direct,#data
14、例:(21H)3AH,A14H,指令ORL 21H,A执行后,(21H)3EH。,“异或”操作指令(6条)XRL A,direct XRL A,#data XRL A,Rn XRL A,Ri XRL direct,A XRL direct,#data例:R023H,(23H)32H,A53H,指令XRL A,R0执行后,A61H求反指令(1条)CPL A;累加器A中的内容按位取反 清零指令(1条)CLR A;0A,累加器A中的内容清零 循环移位指令(4条)RL A;累加器A中的内容左移一位RR A;累加器A中的内容右移一位RLC A;累加器A中的内容连同进位位C左移一位RRC A;累加器A中的
15、内容连同进位位C右移一位例:A16H,指令RR A执行后,A0BH。,4.控制转移类指令(共17条),控制转移类指令共有17条,用于控制程序的流向,所控制的范围即为程序存储器区间。程序转移的三种方式:注意转移的范围 无条件转移 条件转移 中断条件转移用到的标志:状态标志:PSW中的四位;用户设定标志:所有位地址;零标志Z:隐含的标志(A)=0,Z=1,否则 Z=0,转移类指令(12条)注意转移的范围 转移类指令分为无条件转移指令和条件转移指令两组。无条件转移指令包括绝对转移、长转移、短转移和间接转移;条件转移指令包括结果为零、结果为非零、减“1”后结果为非零以及两数不相等的转移条件等,它们全部
16、采用相对转移的方式。无条件转移指令(4条)【1】长转移指令 LJMP addr16 长转移指令为64K程序存储器空间的全范围转移指令,转移地址可为16位地址值中的任一值。【2】绝对转移指令 AJMP addr11 绝对转移指令为2K地址范围内的转移指令,对转移目的地址的要求与ACALL指令中对子程序入口地址的要求相同。【3】短转移指令 SJMP rel;PC+2+relPC 短转移指令为一页地址范围内的相对转移指令。因为rel为1字节补码偏移量,且SJMP rel指令为2字节指令,所以转移范围为126D129D【4】间接转移指令(散转指令)JMP A+DPTR,条件转移指令(8条)【1】累加器
17、为零/非零转移指令 JZ rel 若A=0,则PC+2+relPC,程序转移到偏移量所指向的地址 若A0,程序顺序执行 JNZ rel 若A0,则PC+2+relPC,程序转移到偏移量所指向的地址 若A=0,程序顺序执行【2】两数不等转移指令 CJNE A,dir,rel 若A(dir),则PC 3 relPC,程序转移;若A(dir),则程序顺序执行 CJNE A,#data,rel 若A#data,则PC 3 relPC,程序转移;若A#data,则程序顺序执行 CJNE Rn,#data,rel 若Rn#data,则PC3 relPC,程序转移;若Rn#data,则程序顺序执行 CJNE
18、 Ri,#data,rel 若(Ri)#data,则PC 3 relPC,程序转移;若(Ri)#data,则程序顺序执行,【3】减“1”非零转移指令DJNZ Rn,rel Rn1Rn,若Rn0,则PC2relPC,程序转移;若Rn0,则程序顺序执行DJNZ direct,rel(dir)1dir,若(dir)0,则PC3relPC,程序转移;若(dir)0,则程序顺序执行 需要注意的是,DJNZ Rn,rel是2字节指令,而DJNZ dir,rel是3字节指令,所以在满足转移条件后,前者是PC2relPC,而后者是PC3relPC。例:说明下面一段程序运行后累加器A中的结果。MOV 23H,0
19、AH CLR ALOOP:ADD A,23H DJNZ 23H,LOOP SJMP$解:根据程序可知,运算结果A1098765432155D37H空操作指令(1条)NOP,例:软件延时程序:根据指令执行时间实现。1,单循环 MOV R2,#DATASELF:DJNZ R2,SELF 当晶振为 6 M 时 一个机器周期 2 微秒,上程序延时时间取决于#DATA的大小。2,多重循环:可以用于长时间延时,例如 15ms 延时可以采用二重循环。,子程序调用指令(4条)绝对调用指令 ACALL addr11 绝对调用指令实现在2K地址范围内的子程序调用。本指令实现的操作将不改变原PC的高5位,仅把11位
20、地址addr11送入PC的低11位,以此确定子程序的入口地址。由于整个64K程序存储器空间被分成32个基本2K地址范围(见下页表),编程时,必须保证紧接ACALL指令后面的那一条指令的第一字节与被调用子程序的入口地址在同一2K范围内,否则将不能使用ACALL指令实现这种调用。,长调用指令 LCALL addr16 长调用指令为64K程序存储器空间中的全范围子程序调用指令,子程序的入口地址可在64K地址空间中的任一处。子程序返回指令 RET 从被调用子程序返回,与LCALL与ACALL指令配合使用。中断返回指令 RETI 从中断服务程序中返回,除具有RET功能外,还具有恢复中断逻辑的功能,需注意
21、的是,RETI指令不能用RET代替。,使用子程序的优点在一个应用程序设计中,在程序的不同地方往往需要执行同样的一段程序。这时可以把这段程序单独编制成一个子程序,在原来程序(主程序或子程序)中需要执行这段程序的地方执行一条调用指令,转到子程序完成规定的操作以后,又返回到原来的程序(主程序或子程序)继续执行下去。这样处理的好处是:(1)避免在几个不同的地方对同样一段程序进行重复编程;(2)简化了程序的逻辑结构;(3)缩短了程序长度,从而节省了程序存储单元;(4)便于调试。通常把具有一定功能的公用程序段作为子程序,在子程序的末尾安排一条返回主程序的指令RET。主程序调用子程序以及从子程序返回主程序的
22、过程如图所示。,图 主程序调用子程序示意图,2000H:LCALL 1000H,20H03H,程序存储器空间中的32个基本2K地址范围,5.布尔变量操作类指令(共17条),布尔变量操作类指令共有17条,其共同特点是对进位位C和直接位地址bit的操作,包括清零、置位、求反、逻辑与、逻辑或、位传送以及判断转移指令。清位指令(2条)CLR C;0C CLR bit;0bit置位指令(2条)SETB C;1C SETB bit;1bit位求反指令(2条)CPL C CPL bit位逻辑“与”指令(2条)ANL C,bit ANL C,,位逻辑“或”指令(2条)ORL C,bit ORL C,位传送指令
23、(2条)MOV C,bit;(bit)C MOV bit,C;Cbit位控制转移指令(5条)位控制转移指令是以位的状态作为实现程序转移的判断条件,介绍如下:JC rel 若C=1,则PC+2+relPC,程序转移;否则程序顺序执行 JNC rel 若C=0,则PC+2+relPC,程序转移;否则程序顺序执行 JB bit,rel 若(bit)=1,则PC+3+relPC,程序转移;否则程序顺序执行 JNB bit,rel 若(bit)=0,则PC+3+relPC,程序转移;否则程序顺序执行 JBC bit,rel 若(bit)=1,则PC+3+relPC,程序转移,且该位清零;否则程序顺序执行
24、,例:设有一个逻辑表达式:Y=(D+/E).(B+C).A./F试用单片机 I/O 口与指令完成此逻辑功能。解:将逻辑变量 AF 接到单片机 P1口的P1.0P1.5,P1.6 作为输出 Y,利用位操作指令完成上述操作。程序如下:,MOV C,P1.1 ORL C,P1.2 ANL C,P1.0 MOV 20H,C MOV C,P1.3 ORL C,/P1.4 ANL C,20H ANL C,/P1.5 MOV P1.6,C,3.3 MCS-51单片机汇编语言程序设计,汇编语言概述顺序程序 分支程序 循环程序 子程序,1.汇编语言概述,结构化程序的概念 顺序结构 顺序结构是按照语句实现的先后次
25、序执行一系列的操作,它没有分支、循环和转移。分支结构 分支结构又叫条件选择结构,根据不同情况做出判断和选择,以便执行不同的程序段。分支的意思是在两个或多个不同的操作中选择其中的一个。循环结构 循环结构是重复执行一系列操作,直到某个条件出现为止。循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的。按照条件判断的位置,可以把循环分为“当型循环”和“直到型循环”。第一种情况是先作条件判断,第二种情况是先执行一次循环,然后判断是否继续循环。,汇编语言程序设计的一般步骤 分析问题,抽象出描述问题的数学模型;确定解决问题的算法或解题思想;绘制流程图和结构图;分配存储空间和工作单元;编制
26、程序;程序静态检查,上机调试;编写相关说明。,汇编语言的语句格式 MCS-51汇编语言的语句格式应符合下列结构:【标号:】操作码【操作数】【;注释】汇编语言语句由标号、操作码、操作数和注释4部分组成。其中,标号和注释部分可以没有,甚至某些指令的操作数也可以没有,如NOP、RET指令等。标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操作码之间可以有空格。操作码是指令的助记符。操作数在操作码之后,二者用空格分开。操作数可以是数据,也可以是地址。有多个操作数时,操作数之间用逗号分开。注释在语句的最后,以“;”
27、开始,是说明性的文字,与语句的具体功能无关。指令中的数据可以是十进制、十六进制、二进制、八进制数和字符串,具体格式如下:十进制数以D结尾,也可以省略,如55D或55;十六进制数以H结尾,如55H。如果数据以AF开头,其前必须加数字0,如0FFH;二进制数以B结尾,如00110011B;八进制数以O或Q结尾,如55O或55Q;字符串用或”表示,如M表示字符M的ASCII码。例:MAIN:MOV A,00H;将A清零 在这条指令中,MAIN为标号,表示该指令的地址;MOV为操作码,表示指令的功能为数据传送;A和00H为操作数;将A清零为注释,用于说明这条语句的功能,注释内容不参与程序的汇编。,伪指
28、令 ORG:汇编程序起始地址 ORG用来说明其后程序段在存储器中存放的起始地址。例:ORG 0030H MAIN:MOV 20H,0FFH MOV 30H,0FEH ORG 0030H表明从MAIN开始的程序从存储器的0030H地址单元开始存放,并且MAIN0030H。EQU:赋值指令 EQU用来给变量标号赋予一个确定的数值。例:DATA EQU 0AH MAIN EQU 1000H 这段程序使DATA0AH,MAIN1000H。DB:定义数据字节 DB指令按字节数的形式把数据存放在存储单元中。例:TAB:DB 0C0H,0F9H,0A4H,0B0H,99H 92H,82H,0F8H,80H,
29、90H 这段程序从表头TAB起,连续存放了十个字节的数值:0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H。,DW:定义数据字 DW指令按字(双字节)的形式把数据存放在存储单元中。例:ORG 1020H DW 30H,31H,1020H这段程序把数据30H,31H,1020H以字(双字节)的形式存放在从1020H开始的一片存储单元中。DS:定义存储区 DS从指定的地址单元开始,保留一定数量的存储单元。例:ORG 0100H DS 5从0100H地址开始,空出5个字节的存储单元来,为程序所用。BIT:位定义 其功能是把位地址赋给字符名称。例:LED BIT
30、 P1.0 是将位地址P1.0赋给变量LED。END:汇编结束 END命令表明汇编语言程序结束。,采用BIT伪指令的优点:汇编程序中可能有多处用到“MOV C,50H”,可能会出现个别50H误写成30H的情况,采用BIT伪指令可以有效避免这类低级错误;还有,当我们想把发光二极管闪烁缓冲位50H位地址改为51H位地址时,只要修改伪指令“OUTSHAN BIT 50H”为“OUTSHAN BIT 51H”一处即可,不必将程序中的多处“MOV C,50H”都一一改为“MOV C,51H”,可以大大节省编程时间。,例 分析下列程序。ORG 2000H DS 08H DB 30H,8AH,10,B DW
31、 54H,1F80H,00H,54H,(2000H)=_H(2008H)=_H(200AH)=_H(200BH)=_H(200CH)=_H(200DH)=_H(200EH)=1FH(200FH)=80H,不定,30H,0AH,42H,汇编语言源程序的编辑与汇编(1)源程序的编辑MCS-51系列单片机汇编语言源程序的编辑可以使用任何文本编辑器,如微软Windows操作系统提供的“记事本”、“写字板”,微软Office软件中的“Word”软件等。也可使用其他公司的文本编辑软件,如UltraEdit就是一款专业的程序编辑软件,不仅可以编辑文本文件,而且可以编辑二进制文件,为广大程序员所喜爱。仿真调试
32、软件一般也会附带有编辑功能,例如南京伟福公司的仿真调试软件就具有编辑录入源程序的功能。对于汇编语言源程序的录入,不论采用何种编辑录入软件,都要将文件保存为文本格式;而且文本文件的后缀名必须是asm或ASM(大小写均可)。文件名“*.asm”的“*”对于不同公司的汇编软件可能有限制,如有的不允许超过8个字符,有的不允许用汉字命名。,(2)源程序的人工汇编所谓人工汇编就是将汇编语言源程序逐条查表,人工翻译成机器码、人工计算出偏移量、人工确定出目标地址的过程,也称为手工汇编。这里所说的“查表”是指查阅附录的MCS-51指令表。,【例4】将以下汇编语言源程序手工翻译成机器码。ORG 0000H LJM
33、P START ORG 0100HSTART:MOV SP,#60HLOOP:MOV A,#10H MOV B,#0A0H LJMP LOOP END手工汇编对应的机器码如表4-4所示。,人工汇编的过程如下:(1)在源程序的左边留有足够的空白,一列填写机器码,另一列填写程序存储器地址。(2)逐条查阅指令表,获得操作码。(3)将操作码和操作数写在“机器码”列,部分操作数当时不能确定的先空着。(4)填写程序存储器地址。(5)人工计算出偏移量;人工确定出目标地址。(6)填写第(3)条当时空着的操作数。目前单片机开发过程中很少使用人工汇编,一般由计算机完成汇编。,(3)源程序的自动汇编所谓自动汇编就是
34、将汇编语言源程序由计算机翻译成机器码的过程。自动汇编过程分为两个步骤:首先是汇编预处理过程,该过程是识别伪指令,将其转化为不含伪指令的纯指令汇编程序;然后将纯指令汇编程序,逐条查表将其翻译成机器码。这些分步骤都是计算机完成的,不需要人工干预,所以称为自动汇编,也称为计算机汇编。在仿真器厂家提供的仿真软件中就具有汇编功能,我们只需点击菜单或工具栏的图标即可自动完成汇编(翻译成机器码)工作。,循环结构的程序举例 例 有一组数据,存放在30H为首地址的内存单元,数据长度为32个。试将每一个数分别取出加1,再存人以40H为首地址的内存单元。,PC值 机器码指令代码 ORG 0000H0000 0201
35、00 LJMP0100H0100 ORG0100H0100 784FMOVR0,#4FH0102 795FMOVR1,#5FH0104 7F20MOVR7,#20H0106 E6LOOP:MOVA,R00107 04INCA0108 F7MOVR1,A0109 18DECR0010A 19DECR1010B DFF9DJNZR7,LOOP010D 80FESJMP$END,2.顺序程序,顺序程序是指程序中没有使用转移类指令的程序段,机器执行这类程序时也只需按照先后顺序依次执行,中间不会有任何分支、循环,也不需要调用子程序。例:将一个单字节十六进制数转换成BCD码。解:算法分析:单字节十六进制数
36、在0255之间,将其除以100后,商为百位数;余数除以10,商为十位数,余数为个位数。设单字节数存放在40H,转换后,百位数存放在R0中,十位数存放在R1中,个位数存放在R2中,具体程序如下:ORG 0030H MOV A,40H;将单字节十六进制数送入A中 MOV B,#64H;将100送入B中 DIV AB MOV R0,A;百位数送R0,余数在B中 XCH A,B;余数送入A中 MOV B,#0AH DIV AB;商为十位数,余数为个位数 MOV R1,A MOV R2,B SJMP$,例:设变量放在片内RAM 20H单元,其取值范围为00H,01H,02H,03H,04H,05H,要求
37、编制一段查表程序,查出变量的平方值,并放入片内RAM 21H单元。解:在程序存储器的一片指定的地址单元中,建立各个变量的平方值表,用数据指针指向表的首地址,则变量与数据指针之和的地址单元中的内容就是变量的平方值,程序如下;ORG 0030H MAIN:MOV DPTR,#0500H;将表的首地址送给数据指针 MOV A,20H;将变量送入A中 MOVC A,DPTR+A;查表得到变量的平方值 MOV 21H,A;将平方值送到指定的地址单元 SJMP$TAB EQU 0500H;给表赋首地址 TAB:DB 00H,01H,04H,09H,10H,19H;建立平方值表 END,3.分支程序,例:将
38、一位十六进制数转换为ASCII码。设十六进制数在A中(A的高4位为0),转换结果仍存放在A中。解:十六进制数转换为ASCII码的原则是:十六进制的09,加30H即转换为ASCII码;0AH0FH要加37H才能转换为ASCII码,具体程序如下:ORG 0030H CJNE A,#0AH,NO10;判断十六进制数是否为10NO10:JC LT10;C=1,即十六进制数小于10则转移 ADD A,#07H;十六进制数大于或等于10,则先加07H sjmp$LT10:ADD A,#30H SJMP$;相当于踏步指令,散转程序 散转程序实际是一种并行分支程序,可根据某个输入值或运算结果,转到不同的分支处
39、理。例 设程序中有四个功能子程序入口,分别为1000H、1200H、1400H、1600H。要求根据运行后21H的数值0、1、2、3转相应子程序。ANYCHEN:MOV DPTR,#TABLE;取入口地址表头 MOV A,21H;取输入值 RL A ADD A,21H;输入值乘3 JMPA,A+DPTR TABLE:LJMP 1000H LJMP 1200H LJMP 1400H LJMP 1600H,4.循环程序,例:将内部数据RAM中20H3FH单元的内容传送到外部数据存储器,起始单元地址为2000H。解:20H3FH共计32个单元,需传送32次数据。将R1作为循环计数器,程序流程图如图3
40、.2所示。具体程序如下:,所谓循环程序是指单片机反复执行某一段程序,这个程序段通常称为循环体。循环是在一定条件控制下进行的,以决定是继续循环执行或是结束循环。程序循环是通过条件转移指令进行控制的。,MAIN:MOV R0,#20H;将数据首地址赋给R0 MOV DPTR,#2000H;设置外部RAM首地址 MOV R1,#20H;设置循环计数器LOOP:MOV A,R0;取内部RAM数据 MOVX DPTR,A;将数据送往外部RAM INC R0;调整内部数据RAM;指针,指向下一个数据 INC DPTR;调整外部RAM指针 DJNZ R1,LOOP SJMP$,例:把片内数据RAM 30H3
41、9H单元中的10个无符号数逐一比较,按从小到大的顺序依次排列在这片单元中。解:为了把10个单元中的数按从小到大的顺序排列,可以从30H单元开始,取前数与后数比较,如果前数小于后数,则顺序继续比较下去;如果前数大于后数,则前数和后数交换后再继续比较下去。第一次循环将在最后单元中得到最大的数,要得到所有数据从小到大的排列需要进行多重循环。程序流程图如图3.3所示。具体程序如下:,MAIN:CLR 00H;清除交换标志位 MOV R7,#0AH MOV R0,#30H;数据区首地址 MOV A,R0LOOP:INC R0 MOV R2,A;保存前数 SUBB A,R0 MOV A,R2;恢复前数 J
42、C NEXT;判断前后两数大小 SETB 00H XCH A,R0;前后两数交换 DEC R0 XCH A,R0 INC R0NEXT:MOV A,R0;取下一个数 DJNZ R7,LOOP JB 00H,MAIN;交换后重新比较 SJMP$,5.子程序,在调用子程序时,要注意以下几个问题:子程序占用的存储单元和寄存器。如果在调用子程序之前,主程序已经使用了这些存储单元或寄存器,在调用后,这些存储单元或寄存器又被子程序使用,就应当先把这些存储单元或寄存器中的内容压入堆栈保护起来,调用完后再从堆栈中弹出,加以恢复。入口参数和出口参数。调用之前要按照子程序的要求设置好入口参数,只有这样才能在调用后
43、,从出口参数处得到调用后的正确结果。参数的传递。子程序可以从指定的地址单元或寄存器获得调用程序的数据参数,经过调用后得到的数据可输出到指定的地址单元或寄存器,从而实现两者之间的参数传递。可递归性与可重入性。可递归性是指子程序可以调用自己,可重入性是指一个子程序可以同时被多个程序调用。这两个特性主要是对大规模复杂系统程序的要求,对一般应用程序可不作要求。,例:通过调用子程序实现延时100ms,设单片机晶振频率为12MHz。解:子程序名称为DELAY,可实现1256ms的延时功能,具体延时时长可以通过设置入口参数获得,入口参数放在R3中,具体程序如下:MAIN:PUSH PSW MOV PSW,#
44、08H MOV R3,#64H;入口参数为100 LCALL DELAY;调用子程序 POP PSW SJMP$DELAY:MOV R2,#0FAH LOOP:NOP;内层循环为1ms NOP DJNZ R2,LOOP DJNZ R3,DELAY RET,习题解答,1.什么是寻址方式?MCS-51单片机有哪几种寻址方式?答案:指令的一个重要的组成部分是操作数,指令给出参与运算的数据的方式称为寻址方式,换句话说,寻址方式就是寻找确定参与操作的数的真正地址。MCS-51系列单片机共有7种寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。2.什么是指令系统?MCS
45、-51单片机共有多少种指令?答案:CPU所能执行的各种指令的集合称为指令系统。MCS-51系列单片机的指令系统是一种简明易掌握、效率较高的指令系统。在MCS-51系列单片机的指令系统中共使用了7种寻址方式、42种助记符,这些助记符与寻址方式组合起来,共形成111条指令,完成数据传送、算数运算、逻辑运算、控制转移以及位操作等方面的工作。,3.汇编语言的语句格式是什么?使用标号有什么限制?注释段起什么作用?答案:MCS-51汇编语言的语句格式应符合下列结构:【标号:】操作码【操作数】【;注释】标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。标号与操作码之间要用“:”隔开,标号
46、与“:”之间不能有空格,“:”与操作码之间可以有空格。注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。4.MCS-51汇编语言有哪几条常用伪指令?各起什么作用?答案:ORG:汇编程序起始地址,用来说明其后程序段在存储器中存放的起始地址;EQU:赋值指令,用来给变量标号赋予一个确定的数值;DB:定义数据字节,指令按字节数的形式把数据存放在存储单元中;DW:定义数据字,按字(双字节)的形式把数据存放在存储单元中;DS:定义存储区,从指定的地址单元开始,保留一定数量的存储单元;BIT:位定义,其功能是把位地址赋给字符名称;END:汇编结束,表明汇编语言程序结束。,5.汇编语言程
47、序设计分哪几步?各步骤的任务是什么?答案:分析问题,抽象出描述问题的数学模型;确定解决问题的算法或解题思想;绘制流程图和结构图;分配存储空间和工作单元;编制程序;程序静态检查,上机调试;编写相关说明。6.将累加器A中的压缩BCD码分为两个字节,形成非压缩BCD码,放入20H和21H单元中,写出源程序。解:由题意,将累加器A中的低4位保留,高4位清零放入20H;高4位保留,低4位清零,半字节交换后存入21H单元中。程序如下。MOV R0,A ANL A,#0FH MOV 20H,A MOV A,R0 ANL A,#0F0H SWAP A MOV 21H,A,7.已知内部RAM的20H和21H单元
48、中各有一个无符号8位二进制数,试编程比较它们的大小,并把大数送到30H单元。解:MOV A,20H CJNE A,21H,LOOPLOOP:JNC LOOP1 MOV A,21HLOOP1:MOV 30H,A RET,8.试编写一段程序,将外部数据RAM中从地址2000H开始的100个补码数逐一取出,若为正数则放回原单元,若为负数则求反后放回原单元。解:START:MOV DPTR,#2000H MOV R0,#64HLOOP:MOVX A,DPTR MOV 20H,A JNB ACC.7,NEXT MOV A,20H CPL A MOVX DPTR,ANEXT:INC DPTR DJNZ R0,LOOP SJMP$,