收藏 分销(赏)

第三章 MCS-51系列单片机指令系统及汇编语言程序设计.ppt

上传人:s4****5z 文档编号:13985687 上传时间:2026-05-22 格式:PPT 页数:52 大小:871.50KB 下载积分:10 金币
下载 相关 举报
第三章 MCS-51系列单片机指令系统及汇编语言程序设计.ppt_第1页
第1页 / 共52页
第三章 MCS-51系列单片机指令系统及汇编语言程序设计.ppt_第2页
第2页 / 共52页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,3,章,MCS-51,系列单片机指令系统及汇编语言程序设计,MCS-51,单片机的寻址方式,MCS-51,单片机分类指令,MCS-51,单片机汇编语言程序设计基础,3.1 MCS-51,单片机的寻址方式,MCS-51,单片机共有,7,种寻址方式:,立即寻址,直接寻址,寄存器寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址,1.,立即寻址,立即寻址就是把操作数直接在指令中给出,即操作数包含在指令中。立即操作数有,8,位和,16,位两种形式,前面加“”来表示。,例如:,MOV A,,,#0FFH,;将立即数,FFH,传送到累加器,A,中,MOV DPTR,,,#2000H,;将,16,位立即数,2000H,传送到数据指针,DPTR,中,MOV 40H,,,#60H,;将立即数,60H,传送到,40H,内部,RAM,单元中,2.,直接寻址,指令中直接给出操作数地址的寻址方式。,例如:,MOV A,,,30H,;内部,RAM,中的,30H,单元中的数据内容传送到累加器,A,中,3.,寄存器寻址,以通用寄存器的内容为操作数的寻址方式。通用寄存器包括:,A,,,B,,,DPTR,,,R0,R7,。其中,,R0,R7,必须在工作寄存器组之中。,例如:,INC R0,;(,R0,),1R0,需要注意的是,,A,和,B,既是通用寄存器,又是具有直接地址的特殊功能寄存器。,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,提供低,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,值称为转移目的地址。,例如:,JC 80H,;,C,1,跳转,表示进位位,C,为,0,,则程序计数器,PC,中的内容不改变,即不转移。若进位位,C,为,1,,则,PC,中的当前值为基地址加上偏移量,80H,后所得到的结果作为该转移指令的目的地址。,7.,位寻址,对位地址中的内容作位操作的寻址方式。单片机中只有内部,RAM,和特殊功能寄存器的部分单元有位地址(两者统一编址,地址空间为,00H,FFH,),因此,位寻址只能对有位地址的这两个空间作寻址操作。,例如,SETB 20H,;,120H,位,MOV 32H,,,C,;进位位,C32H,位,3.2,分类指令,MCS-51,单片机共有,111,条指令,按功能分类,,MCS-51,指令系统可分为,5,大类:,数据传送类指令(共,29,条),算术操作类指令(共,24,条),逻辑操作类指令(共,24,条),控制转移类指令(共,17,条),布尔变量操作类指令(共,17,条),1.,数据传送类指令,(共,29,条),以累加器,A,为目的操作数类指令(,4,条),MOV A,,,dir,MOV A,,,#data,MOV A,,,Rn,MOV A,,,Ri,例:,R1,20H,,(,20H,),55H,,指令,MOV A,,,R1,执行后,,A,55H,。,以寄存器,Rn,为目的操作数的指令(,3,条),MOV,Rn,,,dir,MOV,Rn,,,#data,MOV,Rn,,,A,例:(,40H,),30H,,指令,MOV R7,,,40H,执行后,,R7,30H,。,以直接地址为目的操作数的指令(,5,条),MOV dir,,,dir,MOV dir,,,#data,MOV dir,,,A,MOV dir,,,Rn,MOV dir,,,Ri,例:,R0,50H,,(,50H,),10H,,指令,MOV 35H,,,R0,执行后,,(35H),10H,。,以间接地址为目的操作数的指令(,3,条),MOV,Ri,,,dir,MOV,Ri,,,#data,MOV,Ri,,,A,查表指令(,2,条),MOVC A,,,A+DPTR,MOVC A,,,A+PC,例:,A,20H,,,DPTR,2000H,,指令,MOVC A,,,A+DPTR,执行后,程序存储器,2020H,单元中的内容送入,A,。,累加器,A,与片外数据存储器,RAM,传送指令(,4,条),MOVX DPTR,,,A,MOVX A,,,DPTR,MOVX A,,,Ri,MOVX,Ri,,,A,例:,DPTR,2000H,,外部,RAM,中(,2000H,),18H,,指令,MOVX A,,,DPTR,执行后,,A,18H,。,例:,P2,10H,,,R1,50H,,,A,64H,,指令,MOVX R1,,,A,执行后,外部,RAM,中(,1050H,),64H,。,堆栈操作类指令(,2,条),PUSH dir,POP dir,例:,SP,07H,,(,35H,),55H,,指令,PUSH 35H,执行后,,55H,送入,08H,地址单元,,SP,08H,。,交换指令(,5,条),XCH A,,,Rn,XCH A,,,Ri,XCH A,,,dir,XCHD A,,,Ri,SWAP A,例:,A,80H,,,R0,32H,,(,32H,),FFH,,指令,XCHD A,,,R0,执行后,,A,8FH,,(,32H,),F0H,。,16,位数据传送指令(,1,条),MOV DPTR,,,#data16,2.,算术操作类指令,(共,24,条),算术运算指令共有,24,条,算术运算主要是执行加、减、乘、除、增量、减量和十进制调整等指令。,加法指令(,4,条),ADD A,,,#data,ADD A,,,dir,ADD A,,,Rn,ADD A,,,Ri,带进位加法指令(,4,条),ADDC A,,,dir,ADDC A,,,#data,ADDC A,,,Rn,ADDC A,,,Ri,带借位减法指令(,4,条),SUBB A,,,dir,SUBB A,,,#data,SUBB A,,,Rn,SUBB A,,,Ri,例:,A,38H,,,R1,20H,,(,20H,),23H,,,C,1,,指令,SUBB A,,,R1,执行后,,A,14H,乘法指令(,1,条),MUL A,B,例:,A,50H,,,B,A0H,,指令,MUL A,B,执行后,,A,00H,,,B,32H,除法指令(,1,条),DIV A,B,例:,A,28H,,,B,12H,,指令,DIV A,B,执行后,,A,02H,,,B,04H,加,1,指令(,5,条),INC A,INC dir,INC,Ri,INC,Rn,INC DPTR,减,1,指令(,4,条),DEC A,DEC dir,DEC,Ri,DEC,Rn,十进制调整指令(,1,条),DA A,;把,A,中按二进制相加后的结果调整成按,BCD,数相加的结果,3.,逻辑操作类指令,(共,24,条),逻辑操作类指令共有,24,条,主要包括“与”、“或”、“异或”、求反、清,0,、左右移位等逻辑操作。,“与”操作指令(,6,条),ANL A,,,dir,ANL A,,,#data,ANL A,,,Rn,ANL A,,,Ri,ANL dir,,,A,ANL dir,,,#data,“,或”操作指令(,6,条),ORL A,,,dir,ORL A,,,#data,ORL A,,,Rn,ORL A,,,Ri,ORL dir,,,A,ORL dir,,,#data,例:(,21H,),3AH,,,A,14H,,指令,ORL 21H,,,A,执行后,(,21H,),3EH,。,“异或”操作指令(,6,条),XRL A,,,dir,XRL A,,,#data,XRL A,,,Rn,XRL A,,,Ri,XRL dir,,,A,XRL dir,,,#data,例:,R0,23H,,(,23H,),32H,,,A,53H,,指令,XRL A,,,R0,执行后,,A,61H,求反指令(,1,条),CPL A,;累加器,A,中的内容按位取反,清零指令(,1,条),CLR A,;,0A,,累加器,A,中的内容清零,循环移位指令(,4,条),RL A,;累加器,A,中的内容左移一位,RR A,;累加器,A,中的内容右移一位,RLC A,;累加器,A,中的内容连同进位位,C,左移一位,RRC A,;累加器,A,中的内容连同进位位,C,右移一位例:,A,16H,,指令,RR A,执行后,,A,0BH,。,4.,控制转移类指令,(共,17,条),控制转移类指令共有,17,条,用于控制程序的流向,所控制的范围即为程序存储器区间。,子程序调用指令(,4,条),绝对调用指令,ACALL addr11,绝对调用指令实现在,2K,地址范围内的子程序调用。本指令实现的操作将不改变原,PC,的高,5,位,仅把,11,位地址,addr11,送入,PC,的低,11,位,以此确定子程序的入口地址。由于整个,64K,程序存储器空间被分成,32,个基本,2K,地址范围(见表,3.4,),编程时,必须保证紧接,ACALL,指令后面的那一条指令的第一字节与被调用子程序的入口地址在同一,2K,范围内,否则将不能使用,ACALL,指令实现这种调用。,表,3.4,程序存储器空间中的,32,个基本,2K,地址范围,0000H,07FFH,5800H,5FFFH,B000H,B7FFH,0800H,0FFFH,6000H,67FFH,B800H,BFFFH,1000H,17FFH,6800H,6FFFH,C000H,C7FFH,1800H,1FFFH,7000H,77FFH,C800H,CFFFH,2000H,27FFH,7800H,7FFFH,D000H,D7FFH,2800H,2FFFH,8000H,87FFH,D800H,DFFFH,3000H,37FFH,8800H,8FFFH,E000H,E7FFH,3800H,3FFFH,9000H,97FFH,E800H,EFFFH,4000H,47FFH,9800H,9FFFH,F000H,F7FFH,4800H,4FFFH,A000H,A7FFH,F800H,FFFFH,5000H,57FFH,A800H,AFFFH,长调用指令,LCALL addr16,长调用指令为,64K,程序存储器空间中的全范围子程序调用指令,子程序的入口地址可在,64K,地址空间中的任一处。,子程序返回指令,RET,从被调用子程序返回,与,LCALL,与,ACALL,指令配合使用。,中断返回指令,RETI,从中断服务程序中返回,除具有,RET,功能外,还具有恢复中断逻辑的功能,需注意的是,,RETI,指令不能用,RET,代替。,转移类指令(,12,条),转移类指令分为无条件转移指令和条件转移指令两组。无条件转移指令包括绝对转移、长转移、短转移和间接转移;条件转移指令包括结果为零、结果为非零、减“,1”,后结果为非零以及两数不相等的转移条件等,它们全部采用相对转移的方式。,无条件转移指令(,4,条),【1】,长转移指令,LJMP addr16,长转移指令为,64K,程序存储器空间的全范围转移指令,转移地址可为,16,位地址值中的任一值。,【2】,绝对转移指令,AJMP addr11,绝对转移指令为,2K,地址范围内的转移指令,对转移目的地址的要求与,ACALL,指令中对子程序入口地址的要求相同。,【3】,短转移指令,SJMP,rel,;,PC+2+,relPC,短转移指令为一页地址范围内的相对转移指令。因为,rel,为,1,字节补码偏移量,且,SJMP,rel,指令为,2,字节指令,所以转移范围为,126D,129D,【4】,间接转移指令,JMP A+DPTR,条件转移指令(,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,若,A#data,,则,PC,3,relPC,,程序转移;,若,A,#data,,则程序顺序执行,CJNE,Rn,,,#data,,,rel,若,Rn#data,,则,PC,3,relPC,,程序转移;,若,Rn,#data,,则程序顺序执行,CJNE,Ri,,,#data,,,rel,若,(,Ri)#data,,则,PC,3,relPC,,程序转移;,若,(,Ri,),#data,,则程序顺序执行,【3】,减“,1”,非零转移指令,DJNZ,Rn,,,rel,Rn,1Rn,,若,Rn0,,则,PC,2,relPC,,程序转移;,若,Rn,0,,则程序顺序执行,DJNZ dir,,,rel,(,dir,),1dir,,若(,dir)0,,则,PC,3,relPC,,程序转移;,若(,dir),0,,则程序顺序执行,需要注意的是,,DJNZ,Rn,,,rel,是,2,字节指令,而,DJNZ dir,,,rel,是,3,字节指令,所以在满足转移条件后,前者是,PC,2,relPC,,而后者是,PC,3,relPC,。,例:说明下面一段程序运行后累加器,A,中的结果。,MOV 23H,,,0AH,CLR A,LOOP,:,ADD A,,,23H,DJNZ 23H,,,LOOP,SJMP$,解:根据程序可知,运算结果,A,10,9,8,7,6,5,4,3,2,1,55D,37H,空操作指令(,1,条),NOP,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,,,位传送指令(,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,,程序转移,且该位清零;否则程序顺序执行,3.3 MCS-51,单片机汇编语言程序设计,汇编语言概述,顺序程序,分支程序,循环程序,子程序,1.,汇编语言概述,结构化程序的概念,顺序结构,顺序结构是按照语句实现的先后次序执行一系列的操作,它没有分支、循环和转移。,分支结构,分支结构又叫条件选择结构,根据不同情况做出判断和选择,以便执行不同的程序段。分支的意思是在两个或多个不同的操作中选择其中的一个。,循环结构,循环结构是重复执行一系列操作,直到某个条件出现为止。循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的。按照条件判断的位置,可以把循环分为“当型循环”和“直到型循环”。第一种情况是先作条件判断,第二种情况是先执行一次循环,然后判断是否继续循环。,汇编语言程序设计的一般步骤,分析问题,抽象出描述问题的数学模型;,确定解决问题的算法或解题思想;,绘制流程图和结构图;,分配存储空间和工作单元;,编制程序;,程序静态检查,上机调试;,编写相关说明。,汇编语言的语句格式,MCS-51,汇编语言的语句格式应符合下列结构:,【,标号:,】,操作码,【,操作数,】【,;注释,】,汇编语言语句由标号、操作码、操作数和注释,4,部分组成。其中,标号和注释部分可以没有,甚至某些指令的操作数也可以没有,如,NOP,、,RET,指令等。,标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操作码之间可以有空格。,操作码是指令的助记符。,操作数在操作码之后,二者用空格分开。操作数可以是数据,也可以是地址。有多个操作数时,操作数之间用逗号分开。,注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。,指令中的数据可以是十进制、十六进制、二进制、八进制数和字符串,具体格式如下:,十进制数以,D,结尾,也可以省略,如,55D,或,55,;,十六进制数以,H,结尾,如,55H,。如果数据以,A,F,开头,其前必须加数字,0,,如,0FFH,;,二进制数以,B,结尾,如,00110011B,;,八进制数以,O,或,Q,结尾,如,55O,或,55Q,;,字符串用,或,”,表示,如,M,表示字符,M,的,ASCII,码。,例:,MAIN,:,MOV A,,,00H,;将,A,清零,在这条指令中,,MAIN,为标号,表示该指令的地址;,MOV,为操作码,表示指令的功能为数据传送;,A,和,00H,为操作数;将,A,清零为注释,用于说明这条语句的功能,注释内容不参与程序的汇编。,伪指令,ORG,:汇编程序起始地址,ORG,用来说明其后程序段在存储器中存放的起始地址。,例:,ORG 0030H,MAIN,:,MOV 20H,,,0FFH,MOV 30H,,,0FEH,ORG 0030H,表明从,MAIN,开始的程序从存储器的,0030H,地址单元开始存放,并且,MAIN,0030H,。,EQU,:赋值指令,EQU,用来给变量标号赋予一个确定的数值。,例:,DATA EQU 0AH,MAIN EQU 1000H,这段程序使,DATA,0AH,,,MAIN,1000H,。,DB,:定义数据字节,DB,指令按字节数的形式把数据存放在存储单元中。,例:,TAB:DB 0C0H,,,0F9H,,,0A4H,,,0B0H,,,99H,92H,,,82H,,,0F8H,,,80H,,,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 P1.0,是将位地址,P1.0,赋给变量,LED,。,END,:汇编结束,END,命令表明汇编语言程序结束。,2.,顺序程序,顺序程序是指程序中没有使用转移类指令的程序段,机器执行这类程序时也只需按照先后顺序依次执行,中间不会有任何分支、循环,也不需要调用子程序。,例:将一个单字节十六进制数转换成,BCD,码。,解:算法分析。单字节十六进制数在,0,255,之间,将其除以,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,,要求编制一段查表程序,查出变量的平方值,并放入片内,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.,分支程序,例:将一位十六进制数转换为,ASCII,码。设十六进制数在,A,中(,A,的高,4,位为,0,),转换结果仍存放在,A,中。,解:十六进制数转换为,ASCII,码的原则是:十六进制的,0,9,,加,30H,即转换为,ASCII,码;,0AH,0FH,要加,37H,才能转换为,ASCII,码,具体程序如下:,ORG 0030H,CJNE A,,,#0AH,,,NO10,;判断十六进制数是否为,10,NO10,:,JC LT10,;,C=1,,即十六进制数小于,10,则转移,ADD A,,,#07H,;十六进制数大于或等于,10,,则先加,07H,LT10,:,ADD A,,,#30H,SJMP$,例:设变量,X,以补码的形式存放在片内,RAM 30H,单元,函数,Y,与,X,有如下的关系:,试编制程序,根据,X,的大小求出,Y,,并放回原单元。,解:取出变量后,先对变量,X,作取值范围的判断,再按照函数表达式求出,Y,的值。对符号的判断可以用位操作类指令,也可以用逻辑运算类指令,此处用逻辑运算指令。程序流程图如图,3.1,所示。,程序如下:,ORG 0030H,MAIN,:,MOV A,,,30H,JZ NEXT,;判断,X,是否为零,ANL A,,,80H,;判断符号位,JZ ED,;若,X,大于,0,,,Y,X,MOV A,,,#05H,ADD A,,,30H,MOV 30H,,,A,SJMP ED,NEXT,:,MOV 30H,,,#20H,ED,:,SJMP$,图,3.1,4.,循环程序,例:将内部数据,RAM,中,20H,3FH,单元的内容传送到外部数据存储器,起始单元地址为,2000H,。,解:,20H,3FH,共计,32,个单元,需传送,32,次数据。将,R1,作为循环计数器,程序流程图如图,3.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 30H,39H,单元中的,10,个无符号数逐一比较,按从小到大的顺序依次排列在这片单元中。,解:为了把,10,个单元中的数按从小到大的顺序排列,可以从,30H,单元开始,取前数与后数比较,如果前数小于后数,则顺序继续比较下去;如果前数大于后数,则前数和后数交换后再继续比较下去。第一次循环将在最后单元中得到最大的数,要得到所有数据从小到大的排列需要进行多重循环。程序流程图如图,3.3,所示。具体程序如下:,MAIN,:,CLR 00H,;清除交换标志位,MOV R7,,,#0AH,MOV R0,,,#30H,;数据区首地址,MOV A,,,R0,LOOP,:,INC R0,MOV R2,,,A,;保存前数,SUBB A,,,R0,MOV A,,,R2,;恢复前数,JC NEXT,;判断前后两数大小,SETB 00H,XCH A,,,R0,;前后两数交换,DEC R0,XCH A,,,R0,INC R0,NEXT,:,MOV A,,,R0,;取下一个数,DJNZ R7,,,LOOP,JB 00H,,,MAIN,;交换后重新比较,SJMP$,5.,子程序,在调用子程序时,要注意以下几个问题:,子程序占用的存储单元和寄存器。如果在调用子程序之前,主程序已经使用了这些存储单元或寄存器,在调用后,这些存储单元或寄存器又被子程序使用,就应当先把这些存储单元或寄存器中的内容压入堆栈保护起来,调用完后再从堆栈中弹出,加以恢复。,入口参数和出口参数。调用之前要按照子程序的要求设置好入口参数,只有这样才能在调用后,从出口参数处得到调用后的正确结果。,参数的传递。子程序可以从指定的地址单元或寄存器获得调用程序的数据参数,经过调用后得到的数据可输出到指定的地址单元或寄存器,从而实现两者之间的参数传递。,可递归性与可重入性。可递归性是指子程序可以调用自己,可重入性是指一个子程序可以同时被多个程序调用。这两个特性主要是对大规模复杂系统程序的要求,对一般应用程序可不作要求。,例:通过调用子程序实现延时,100ms,,设单片机晶振频率为,12MHz,。,解:子程序名称为,DELAY,,可实现,1,256ms,的延时功能,具体延时时长可以通过设置入口参数获得,入口参数放在,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,例:将存于,R0,中的一位十六进制数(,R0,的高,4,位为,0,)转换为七段显示码,并将结果送,P1,口显示。设七段显示器为共阴极接法。,解:显示子程序为,DIR,,具体程序如下:,ORG 0000H,LJMP MAIN,ORG 0030H,MAIN,:,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,DELAY,:,MOV R7,,,#0FAH,LOOP,:,MOV R6,,,#0FAH,LOOP1,:,DJNZ R6,,,LOOP1,DJNZ R7,,,LOOP,RET,TABLE,:,DB 40H,,,79H,,,24H,,,30H,DB 19H,,,12H,,,02H,,,78H,DB 00H,,,18H,,,08H,,,03H,DB 46H,,,21H,,,06H,,,0EH,END,习题解答,1.,什么是寻址方式?,MCS-51,单片机有哪几种寻址方式?,答案:指令的一个重要的组成部分是操作数,指令给出参与运算的数据的方式称为寻址方式,换句话说,寻址方式就是寻找确定参与操作的数的真正地址。,MCS-51,系列单片机共有,7,种寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。,2.,什么是指令系统?,MCS-51,单片机共有多少种指令?,答案:,CPU,所能执行的各种指令的集合称为指令系统。,MCS-51,系列单片机的指令系统是一种简明易掌握、效率较高的指令系统。在,MCS-51,系列单片机的指令系统中共使用了,7,种寻址方式、,42,种助记符,这些助记符与寻址方式组合起来,共形成,111,条指令,完成数据传送、算数运算、逻辑运算、控制转移以及位操作等方面的工作。,3.,汇编语言的语句格式是什么?使用标号有什么限制?注释段起什么作用?,答案:,MCS-51,汇编语言的语句格式应符合下列结构:,【,标号:,】,操作码,【,操作数,】【,;注释,】,标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操作码之间可以有空格。,注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。,4.MCS-51,汇编语言有哪几条常用伪指令?各起什么作用?,答案:,ORG,:汇编程序起始地址,用来说明其后程序段在存储器中存放的起始地址;,EQU,:赋值指令,用来给变量标号赋予一个确定的数值;,DB,:定义数据字节,指令按字节数的形式把数据存放在存储单元中;,DW,:定义数据字,按字(双字节)的形式把数据存放在存储单元中;,DS,:定义存储区,从指定的地址单元开始,保留一定数量的存储单元;,BIT,:位定义,其功能是把位地址赋给字符名称;,END,:汇编结束,表明汇编语言程序结束。,5.,汇编语言程序设计分哪几步?各步骤的任务是什么?,答案:分析问题,抽象出描述问题的数学模型;,确定解决问题的算法或解题思想;,绘制流程图和结构图;,分配存储空间和工作单元;,编制程序;,程序静态检查,上机调试;,编写相关说明。,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,单元中各有一个无符号,8,位二进制数,试编程比较它们的大小,并把大数送到,30H,单元。,解:,MOV A,,,20H,CJNE A,,,21H,,,LOOP,LOOP,:,JNC LOOP1,MOV A,,,21H,LOOP1,:,MOV 30H,,,A,RET,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,9.,试编写一段程序,将外部数据,RAM,中从地址,2000H,开始的,100,个补码数逐一取出,若为正数则放回原单元,若为负数则求反后放回原单元。,解:,START,:,MOV DPTR,,,#2000H,MOV R0,,,#64H,LOOP,:,MOVX A,,,DPTR,MOV 20H,,,A,JNB ACC.7,,,NEXT,MOV A,,,20H,CPL A,MOVX DPTR,,,A,NEXT,:,INC DPTR,DJNZ R0,,,LOOP,SJMP$,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服