1、第第3章章 MCS-51系列单片机指令系统及系列单片机指令系统及汇编语言程序设计汇编语言程序设计uMCS-51单片机的寻址方式单片机的寻址方式uMCS-51单片机分类指令单片机分类指令 uMCS-51单片机汇编语言程序设计基础单片机汇编语言程序设计基础 第1页,共52页。3.1 MCS-51单片机的寻址方式单片机的寻址方式MCS-51单片机共有7种寻址方式:立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址第2页,共52页。1.立即寻址 立即寻址就是把操作数直接在指令中给出,即操作数包含在指令中。立即操作数有8位和16位两种形式,前面加“”来表示。例如:MOV A,#0
2、FFH ;将立即数FFH传送到累加器A中 MOV DPTR,#2000H ;将16位立即数2000H传送到数据指针DPTR中 MOV 40H,#60H ;将立即数60H传送到40H内部RAM单元中第3页,共52页。2.直接寻址 指令中直接给出操作数地址的寻址方式。例如:MOV A,30H ;内部RAM中的30H单元中的数据内容传送到累加器A中第4页,共52页。3.寄存器寻址 以通用寄存器的内容为操作数的寻址方式。通用寄存器包括:A,B,DPTR,R0R7。其中,R0R7必须在工作寄存器组之中。例如:INC R0 ;(R0)1R0 需要注意的是,A和B既是通用寄存器,又是具有直接地址的特殊功能寄
3、存器。第5页,共52页。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系列单片机指令中,对外部数
4、据RAM作间接寻址有两种方法:第一种由P2口提供高8位外部数据RAM地址,由R0或R1提供低8位地址,由此共同寻址64K空间;第二种是用16位的DPTR作寄存器间接寻址。第6页,共52页。5.变址寻址 由程序计数器PC或DPTR加上偏移量寄存器A中内容之和形成操作数地址的寻址方式。变址寻址只能对程序存储器中的数据作寻址操作。由于程序存储器是只读存储器,因此变址寻址操作只有读操作而无写操作。例如:MOVC A,A+DPTR ;A+DPTR为地址的存储器单元内容A MOVC A,A+PC ;A+PC为地址的存储器单元内容A第7页,共52页。6.相对寻址 以当前程序计数器PC的内容为基址,加上指令给
5、出的一字节补码数形成新的PC值的寻址方式。PC中的当前值称为基地址,一字节补码数称为偏移量,新的PC值称为转移目的地址。例如:JC 80H ;C1跳转 表示进位位C为0,则程序计数器PC中的内容不改变,即不转移。若进位位C为1,则PC中的当前值为基地址加上偏移量80H后所得到的结果作为该转移指令的目的地址。第8页,共52页。7.位寻址 对位地址中的内容作位操作的寻址方式。单片机中只有内部RAM和特殊功能寄存器的部分单元有位地址(两者统一编址,地址空间为00HFFH),因此,位寻址只能对有位地址的这两个空间作寻址操作。例如 SETB 20H ;120H位 MOV 32H,C ;进位位C32H位第
6、9页,共52页。3.2 分类指令分类指令 MCS-51单片机共有111条指令,按功能分类,MCS-51指令系统可分为5大类:数据传送类指令(共29条)算术操作类指令(共24条)逻辑操作类指令(共24条)控制转移类指令(共17条)布尔变量操作类指令(共17条)第10页,共52页。1.数据传送类指令数据传送类指令(共29条)l 以累加器A为目的操作数类指令(4条)MOV A,dir MOV A,#data MOV A,Rn MOV A,Ri 例:R120H,(20H)55H,指令MOV A,R1执行后,A55H。l 以寄存器Rn为目的操作数的指令(3条)MOV Rn,dir MOV Rn,#dat
7、a MOV Rn,A 例:(40H)30H,指令MOV R7,40H执行后,R730H。第11页,共52页。l 以直接地址为目的操作数的指令(5条)MOV dir,dir MOV dir,#data MOV dir,A MOV dir,Rn MOV dir,Ri 例:R050H,(50H)10H,指令MOV 35H,R0执行后,(35H)10H。l 以间接地址为目的操作数的指令(3条)MOV Ri,dir MOV Ri,#data MOV Ri,A l 查表指令(2条)MOVC A,A+DPTR MOVC A,A+PC 例:A20H,DPTR2000H,指令MOVC A,A+DPTR执行后,程
8、序存储器2020H单元中的内容送入A。第12页,共52页。l 累加器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。l 堆栈操作类指令(2条)PUSH dir POP dir 例:SP07H,(35H)55H,指令PUSH 35H执行后,55H送入08H地址单元,SP08H。第13页,共52页。l 交换指令(5条
9、)XCH A,Rn XCH A,Ri XCH A,dir XCHD A,Ri SWAP A 例:A80H,R032H,(32H)FFH,指令XCHD A,R0执行后,A8FH,(32H)F0H。l 16位数据传送指令(1条)MOV DPTR,#data16 第14页,共52页。2.算术操作类指令算术操作类指令(共24条)算术运算指令共有24条,算术运算主要是执行加、减、乘、除、增量、减量和十进制调整等指令。l加法指令(4条)ADD A,#data ADD A,dir ADD A,Rn ADD A,Ri l带进位加法指令(4条)ADDC A,dir ADDC A,#data ADDC A,Rn
10、ADDC A,Ri l带借位减法指令(4条)SUBB A,dir SUBB A,#data SUBB A,Rn SUBB A,Ri 例:A38H,R120H,(20H)23H,C1,指令SUBB A,R1执行后,A14H 第15页,共52页。l乘法指令(1条)MUL A,B 例:A50H,BA0H,指令MUL A,B执行后,A00H,B32H l 除法指令(1条)DIV A,B 例:A28H,B12H,指令DIV A,B执行后,A02H,B04H l 加1指令(5条)INC A INC dir INC Ri INC Rn INC DPTR 第16页,共52页。l减1指令(4条)DEC A DE
11、C dir DEC Ri DEC Rn l 十进制调整指令(1条)DA A ;把A中按二进制相加后的结果调整成按BCD数相加的结果 第17页,共52页。3.逻辑操作类指令逻辑操作类指令(共24条)逻辑操作类指令共有24条,主要包括“与”、“或”、“异或”、求反、清0、左右移位等逻辑操作。l“与”操作指令(6条)ANL A,dir ANL A,#data ANL A,Rn ANL A,Ri ANL dir,A ANL dir,#data l “或”操作指令(6条)ORL A,dir ORL A,#data ORL A,Rn ORL A,Ri ORL dir,A ORL dir,#data 例:(
12、21H)3AH,A14H,指令ORL 21H,A执行后,(21H)3EH。第18页,共52页。l“异或”操作指令(6条)XRL A,dir XRL A,#data XRL A,Rn XRL A,Ri XRL dir,A XRL dir,#data 例:R023H,(23H)32H,A53H,指令XRL A,R0执行后,A61Hl求反指令(1条)CPL A ;累加器A中的内容按位取反 l清零指令(1条)CLR A ;0A,累加器A中的内容清零 l 循环移位指令(4条)RL A ;累加器A中的内容左移一位 RR A ;累加器A中的内容右移一位 RLC A ;累加器A中的内容连同进位位C左移一位 R
13、RC A ;累加器A中的内容连同进位位C右移一位例:A16H,指令RR A执行后,A0BH。第19页,共52页。4.控制转移类指令控制转移类指令(共17条)控制转移类指令共有17条,用于控制程序的流向,所控制的范围即为程序存储器区间。l子程序调用指令(4条)绝对调用指令 ACALL addr11 绝对调用指令实现在2K地址范围内的子程序调用。本指令实现的操作将不改变原PC的高5位,仅把11位地址addr11送入PC的低11位,以此确定子程序的入口地址。由于整个64K程序存储器空间被分成32个基本2K地址范围(见表3.4),编程时,必须保证紧接ACALL指令后面的那一条指令的第一字节与被调用子程
14、序的入口地址在同一2K范围内,否则将不能使用ACALL指令实现这种调用。第20页,共52页。表3.4 程序存储器空间中的32个基本2K地址范围0000H07FFH5800H5FFFHB000HB7FFH0800H0FFFH6000H67FFHB800HBFFFH1000H17FFH6800H6FFFHC000HC7FFH1800H1FFFH7000H77FFHC800HCFFFH2000H27FFH7800H7FFFHD000HD7FFH2800H2FFFH8000H87FFHD800HDFFFH3000H37FFH8800H8FFFHE000HE7FFH3800H3FFFH9000H97FF
15、HE800HEFFFH4000H47FFH9800H9FFFHF000HF7FFH4800H4FFFHA000HA7FFHF800HFFFFH5000H57FFHA800HAFFFH第21页,共52页。长调用指令 LCALL addr16 长调用指令为64K程序存储器空间中的全范围子程序调用指令,子程序的入口地址可在64K地址空间中的任一处。子程序返回指令 RET 从被调用子程序返回,与LCALL与ACALL指令配合使用。中断返回指令 RETI 从中断服务程序中返回,除具有RET功能外,还具有恢复中断逻辑的功能,需注意的是,RETI指令不能用RET代替。第22页,共52页。l 转移类指令(12
16、条)转移类指令分为无条件转移指令和条件转移指令两组。无条件转移指令包括绝对转移、长转移、短转移和间接转移;条件转移指令包括结果为零、结果为非零、减“1”后结果为非零以及两数不相等的转移条件等,它们全部采用相对转移的方式。无条件转移指令(4条)【1】长转移指令 LJMP addr16 长转移指令为64K程序存储器空间的全范围转移指令,转移地址可为16位地址值中的任一值。【2】绝对转移指令 AJMP addr11 绝对转移指令为2K地址范围内的转移指令,对转移目的地址的要求与ACALL指令中对子程序入口地址的要求相同。【3】短转移指令 SJMP rel ;PC+2+relPC 短转移指令为一页地址
17、范围内的相对转移指令。因为rel为1字节补码偏移量,且SJMP rel指令为2字节指令,所以转移范围为126D129D【4】间接转移指令 JMP A+DPTR 第23页,共52页。条件转移指令(8条)【1】累加器为零/非零转移指令 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
18、 若A#data,则PC 3 relPC,程序转移;若A#data,则程序顺序执行 CJNE Rn,#data,rel 若Rn#data,则PC3 relPC,程序转移;若Rn#data,则程序顺序执行 CJNE Ri,#data,rel 若(Ri)#data,则PC 3 relPC,程序转移;若(Ri)#data,则程序顺序执行第24页,共52页。【3】减“1”非零转移指令 DJNZ Rn,rel Rn1Rn,若Rn0,则PC2relPC,程序转移;若Rn0,则程序顺序执行 DJNZ dir,rel (dir)1dir,若(dir)0,则PC3relPC,程序转移;若(dir)0,则程序顺序
19、执行 需要注意的是,DJNZ Rn,rel是2字节指令,而DJNZ dir,rel 是3字节指令,所以在满足转移条件后,前者是PC2relPC,而后者是PC3relPC。例:说明下面一段程序运行后累加器A中的结果。MOV 23H,0AH CLR ALOOP:ADD A,23H DJNZ 23H,LOOP SJMP$解:根据程序可知,运算结果A1098765432155D37Hl空操作指令(1条)NOP 第25页,共52页。5.布尔变量操作类指令布尔变量操作类指令(共17条)布尔变量操作类指令共有17条,其共同特点是对进位位C和直接位地址bit的操作,包括清零、置位、求反、逻辑与、逻辑或、位传送
20、以及判断转移指令。l 清位指令(2条)CLR C ;0C CLR bit ;0bitl置位指令(2条)SETB C ;1C SETB bit ;1bitl 位求反指令(2条)CPL C CPL bit l位逻辑“与”指令(2条)ANL C,bit ANL C,bitbit第26页,共52页。l 位逻辑“或”指令(2条)ORL C,bit ORL C,l位传送指令(2条)MOV C,bit ;(bit)C MOV bit,C ;Cbit l位控制转移指令(5条)位控制转移指令是以位的状态作为实现程序转移的判断条件,介绍如下:JC rel 若C=1,则PC+2+relPC,程序转移;否则程序顺序执
21、行 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,程序转移,且该位清零;否则程序顺序执行bit第27页,共52页。3.3 MCS-51单片机汇编语言程序设计单片机汇编语言程序设计l汇编语言概述l顺序程序 l分支程序 l循环程序 l子程序 第28页,共52页。1.汇编语言概述 结构化程序的概念 顺序结构 顺序结构是按
22、照语句实现的先后次序执行一系列的操作,它没有分支、循环和转移。分支结构 分支结构又叫条件选择结构,根据不同情况做出判断和选择,以便执行不同的程序段。分支的意思是在两个或多个不同的操作中选择其中的一个。循环结构 循环结构是重复执行一系列操作,直到某个条件出现为止。循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的。按照条件判断的位置,可以把循环分为“当型循环”和“直到型循环”。第一种情况是先作条件判断,第二种情况是先执行一次循环,然后判断是否继续循环。第29页,共52页。汇编语言程序设计的一般步骤 分析问题,抽象出描述问题的数学模型;确定解决问题的算法或解题思想;绘制流程图和
23、结构图;分配存储空间和工作单元;编制程序;程序静态检查,上机调试;编写相关说明。第30页,共52页。汇编语言的语句格式 MCS-51汇编语言的语句格式应符合下列结构:【标号:】操作码 【操作数】【;注释】汇编语言语句由标号、操作码、操作数和注释4部分组成。其中,标号和注释部分可以没有,甚至某些指令的操作数也可以没有,如NOP、RET指令等。标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操作码之间可以有空格。操作码是指令的助记符。操作数在操作码之后,二者用空格分开。操作数可以是数据,也可以是地址。有多个操
24、作数时,操作数之间用逗号分开。注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。指令中的数据可以是十进制、十六进制、二进制、八进制数和字符串,具体格式如下:十进制数以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清零为注释
25、,用于说明这条语句的功能,注释内容不参与程序的汇编。第31页,共52页。伪指令 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 0C0
26、H,0F9H,0A4H,0B0H,99H 92H,82H,0F8H,80H,90H 这段程序从表头TAB起,连续存放了十个字节的数值:0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H。第32页,共52页。DW:定义数据字 DW指令按字(双字节)的形式把数据存放在存储单元中。例:ORG 1020H DW 30H,31H,1020H这段程序把数据30H,31H,1020H以字(双字节)的形式存放在从1020H开始的一片存储单元中。DS:定义存储区 DS从指定的地址单元开始,保留一定数量的存储单元。例:ORG 0100H DS 5从0100H地址开始,空出5个
27、字节的存储单元来,为程序所用。BIT:位定义 其功能是把位地址赋给字符名称。例:LED BIT P1.0 是将位地址P1.0赋给变量LED。END:汇编结束 END命令表明汇编语言程序结束。第33页,共52页。2.顺序程序 顺序程序是指程序中没有使用转移类指令的程序段,机器执行这类程序时也只需按照先后顺序依次执行,中间不会有任何分支、循环,也不需要调用子程序。例:将一个单字节十六进制数转换成BCD码。解:算法分析。单字节十六进制数在0255之间,将其除以100后,商为百位数;余数除以10,商为十位数,余数为个位数。设单字节数存放在40H,转换后,百位数存放在R0中,十位数存放在R1中,个位数存
28、放在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$第34页,共52页。例:设变量放在片内RAM 20H单元,其取值范围为00H,01H,02H,03H,04H,05H,要求编制一段查表程序,查出变量的平方值,并放入片内RAM 21H单元。解:在程序存储器的一片指定的地址单元中,建立各个变量的平方值表,用数据指
29、针指向表的首地址,则变量与数据指针之和的地址单元中的内容就是变量的平方值,程序如下;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第35页,共52页。3.分支程序 例:将一位十六进制数转换为ASCII码。设十六进制数在A中(A的高4位为0),转换结果仍存放在A中。解:十六进制数
30、转换为ASCII码的原则是:十六进制的09,加30H即转换为ASCII码;0AH0FH要加37H才能转换为ASCII码,具体程序如下:ORG 0030H CJNE A,#0AH,NO10 ;判断十六进制数是否为10NO10:JC LT10 ;C=1,即十六进制数小于10则转移 ADD A,#07H ;十六进制数大于或等于10,则先加07H LT10:ADD A,#30H SJMP$第36页,共52页。例:设变量X以补码的形式存放在片内RAM 30H单元,函数Y与X有如下的关系:试编制程序,根据X的大小求出Y,并放回原单元。解:取出变量后,先对变量X作取值范围的判断,再按照函数表达式求出Y的值。
31、对符号的判断可以用位操作类指令,也可以用逻辑运算类指令,此处用逻辑运算指令。程序流程图如图3.1所示。X X0Y=#20HX=0X+5X0,;,;,;第37页,共52页。程序如下:ORG 0030HMAIN:MOV A,30H JZ NEXT ;判断X是否为零 ANL A,80H ;判断符号位 JZ ED ;若X大于0,YX MOV A,#05H ADD A,30H MOV 30H,A SJMP EDNEXT:MOV 30H,#20HED:SJMP$图3.1第38页,共52页。4.循环程序 例:将内部数据RAM中20H3FH单元的内容传送到外部数据存储器,起始单元地址为2000H。解:20H3
32、FH共计32个单元,需传送32次数据。将R1作为循环计数器,程序流程图如图3.2所示。具体程序如下:所谓循环程序是指单片机反复执行某一段程序,这个程序段通常称为循环体。循环是在一定条件控制下进行的,以决定是继续循环执行或是结束循环。程序循环是通过条件转移指令进行控制的。第39页,共52页。MAIN:MOV R0,#20H ;将数据首地址赋给R0 MOV DPTR,#2000H ;设置外部RAM首地址 MOV R1,#20H ;设置循环计数器LOOP:MOV A,R0 ;取内部RAM数据 MOVX DPTR,A ;将数据送往外部RAM INC R0 ;调整内部数据RAM ;指针,指向下一个数据
33、INC DPTR ;调整外部RAM指针 DJNZ R1,LOOP SJMP$第40页,共52页。例:把片内数据RAM 30H39H单元中的10个无符号数逐一比较,按从小到大的顺序依次排列在这片单元中。解:为了把10个单元中的数按从小到大的顺序排列,可以从30H单元开始,取前数与后数比较,如果前数小于后数,则顺序继续比较下去;如果前数大于后数,则前数和后数交换后再继续比较下去。第一次循环将在最后单元中得到最大的数,要得到所有数据从小到大的排列需要进行多重循环。程序流程图如图3.3所示。具体程序如下:第41页,共52页。MAIN:CLR 00H ;清除交换标志位 MOV R7,#0AH MOV R
34、0,#30H ;数据区首地址 MOV A,R0LOOP:INC R0 MOV R2,A ;保存前数 SUBB A,R0 MOV A,R2 ;恢复前数 JC NEXT ;判断前后两数大小 SETB 00H XCH A,R0 ;前后两数交换 DEC R0 XCH A,R0 INC R0NEXT:MOV A,R0 ;取下一个数 DJNZ R7,LOOP JB 00H,MAIN ;交换后重新比较 SJMP$第42页,共52页。5.子程序 在调用子程序时,要注意以下几个问题:子程序占用的存储单元和寄存器。如果在调用子程序之前,主程序已经使用了这些存储单元或寄存器,在调用后,这些存储单元或寄存器又被子程序
35、使用,就应当先把这些存储单元或寄存器中的内容压入堆栈保护起来,调用完后再从堆栈中弹出,加以恢复。入口参数和出口参数。调用之前要按照子程序的要求设置好入口参数,只有这样才能在调用后,从出口参数处得到调用后的正确结果。参数的传递。子程序可以从指定的地址单元或寄存器获得调用程序的数据参数,经过调用后得到的数据可输出到指定的地址单元或寄存器,从而实现两者之间的参数传递。可递归性与可重入性。可递归性是指子程序可以调用自己,可重入性是指一个子程序可以同时被多个程序调用。这两个特性主要是对大规模复杂系统程序的要求,对一般应用程序可不作要求。第43页,共52页。例:通过调用子程序实现延时100ms,设单片机晶
36、振频率为12MHz。解:子程序名称为DELAY,可实现1256ms的延时功能,具体延时时长可以通过设置入口参数获得,入口参数放在R3中,具体程序如下:MAIN:PUSH PSW MOV PSW,#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第44页,共52页。例:将存于R0中的一位十六进制数(R0的高4位为0)转换为七段显示码,并将结果送P1口显示。设七段显示器为共阴极接法。解:显
37、示子程序为DIR,具体程序如下:ORG 0000H LJMP MAINORG 0030HMAIN:LCALL DELAY MOV P1,#00H LCALL DIR DIR:PUSH ACC MOV A,R0 ;取R0中的数 MOV DPTR,#TABLE MOVC A,A+DPTR ;查表,取出七段显示码 MOV P1,A POP ACC RET第45页,共52页。DELAY:MOV R7,#0FAHLOOP:MOV R6,#0FAHLOOP1:DJNZ R6,LOOP1 DJNZ R7,LOOP RETTABLE:DB 40H,79H,24H,30H DB 19H,12H,02H,78H
38、DB 00H,18H,08H,03H DB 46H,21H,06H,0EH END第46页,共52页。习题解答1.什么是寻址方式?MCS-51单片机有哪几种寻址方式?答案:指令的一个重要的组成部分是操作数,指令给出参与运算的数据的方式称为寻址方式,换句话说,寻址方式就是寻找确定参与操作的数的真正地址。MCS-51系列单片机共有7种寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。2.什么是指令系统?MCS-51单片机共有多少种指令?答案:CPU所能执行的各种指令的集合称为指令系统。MCS-51系列单片机的指令系统是一种简明易掌握、效率较高的指令系统。在MCS
39、-51系列单片机的指令系统中共使用了7种寻址方式、42种助记符,这些助记符与寻址方式组合起来,共形成111条指令,完成数据传送、算数运算、逻辑运算、控制转移以及位操作等方面的工作。第47页,共52页。3.汇编语言的语句格式是什么?使用标号有什么限制?注释段起什么作用?答案:MCS-51汇编语言的语句格式应符合下列结构:【标号:】操作码 【操作数】【;注释】标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操作码之间可以有空格。注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。4.MCS-
40、51汇编语言有哪几条常用伪指令?各起什么作用?答案:ORG:汇编程序起始地址,用来说明其后程序段在存储器中存放的起始地址;EQU:赋值指令,用来给变量标号赋予一个确定的数值;DB:定义数据字节,指令按字节数的形式把数据存放在存储单元中;DW:定义数据字,按字(双字节)的形式把数据存放在存储单元中;DS:定义存储区,从指定的地址单元开始,保留一定数量的存储单元;BIT:位定义,其功能是把位地址赋给字符名称;END:汇编结束,表明汇编语言程序结束。第48页,共52页。5.汇编语言程序设计分哪几步?各步骤的任务是什么?答案:分析问题,抽象出描述问题的数学模型;确定解决问题的算法或解题思想;绘制流程图
41、和结构图;分配存储空间和工作单元;编制程序;程序静态检查,上机调试;编写相关说明。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第49页,共52页。7.已知内部RAM的20H和21H单元中各有一个无符号8位二进制数,试编程比较它们的大小,并把大数送到30H单元。解:MOV A,20H
42、CJNE A,21H,LOOPLOOP:JNC LOOP1 MOV A,21HLOOP1:MOV 30H,A RET第50页,共52页。8.编制一段程序,要求在端口线P1.0和P1.1上分别产生周期为200us和400us的方波。设单片机的晶振频率为12MHz。解:ORG 0000H AJMP START ORG 000BH AJMP IT0 ORG 001BH AJMP IT1 ORG 0100H START:MOV TMOD,#03H MOV TL0,#9CH MOV TH0,#38H MOV TCON,#50H MOV IE,#8AH SJMP$ORG 0130H IT0:MOV TL0,#9CH CPL P1.0 RETI IT1:MOV TH0,#38H CPL P1.1 RETI END第51页,共52页。9.试编写一段程序,将外部数据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$第52页,共52页。