单片机原理及应用PPT教学课件-第3章__MCS-51单片机指令系统和汇编语言程序示例.ppt_第1页
单片机原理及应用PPT教学课件-第3章__MCS-51单片机指令系统和汇编语言程序示例.ppt_第2页
单片机原理及应用PPT教学课件-第3章__MCS-51单片机指令系统和汇编语言程序示例.ppt_第3页
单片机原理及应用PPT教学课件-第3章__MCS-51单片机指令系统和汇编语言程序示例.ppt_第4页
单片机原理及应用PPT教学课件-第3章__MCS-51单片机指令系统和汇编语言程序示例.ppt_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章MCS-51单片机指令系统和汇编语言程序示例,3.1MCS-51单片机指令系统概述3.1.1指令、指令系统概念1.指令:是使计算机内部执行的一种操作,提供用户编成使用的一种命令。2.指令系统:计算机所能执行的指令的集合。3.指令的三种属性:功能、时间、空间。,用于程序设计的语言基本上分为3种:机器语言、汇编语言和高级语言。1.机器语言二进制代码表示的指令、数字和符号简称为机器语言,不易懂,难记忆,易出错。2汇编语言英文助记符表示的指令称为汇编语言。将汇编语言程序转换成为二进制代码表示的机器语言的程序称为汇编程序。,经汇编程序“汇编(翻译)”得到的机器语言程序称为目标程序,原来的汇编语言程序称为源序。汇编语言特点:面向机器的语言,程序设计员须对MCS-51的硬件有相当深入的了解。助记符指令和机器指令一一对应,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,用汇编语言能编写出最优化的程序。,编语言和机器语言都脱离不开具体机器的硬件,均是面向“机器”的语言,缺乏通用性。3高级语言不受具体机器的限制,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。常用的如BASIC、FORTRAN以及C语言等。高级语言优点:通用性强,直观、易懂、易学,可读性好。对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。,3.1.2MCS-51单片机指令系统及指令格式MCS-51的基本指令共111条。按指令的功能来分为五类:(1)数据传送类指令(28条)(2)算术操作类指令(24条)(3)逻辑操作类指令(25条)(4)控制转移类指令(17条)(5)位操作指令(17条),按指令所占的字节(空间属性)来分:(1)单字节指令(49条);(2)双字节指令(45条);(3)三字节指令(17条)。按指令的执行时间(时间属性)来分:(1)1个机器周期指令(64条);(2)2个机器周期指令(45条);(3)4个机器周期指令(只有乘、除两条指令)。,指令在结构上由操作码和操作数两部分组成。操作码用来规定指令进行什么操作。操作数则是指令操作的对象。汇编语言指令的格式:标号:操作码助记符目的操作数,源操作数;注释标号代表该指令所存放的第一个字节存储单元的地址,故标号又称为“符号地址”。例如:ADDA,R0;(A)(A)+(R0),指令中一些符号的约定意义:(1)Rn:表示当前工作寄存器区的8个工作寄存器R0R7(n=07)。(2)Ri:表示当前工作寄存器区中可作间接寻址寄存器的2个寄存器R0、R1(i=0,1)。(3)#data:表示包含在指令中的8位立即数。(4)#data16:表示包含在指令中的16位立即数。(5)direct:表示直接地址,即8位的内部数据存储器单元或特殊功能寄存器的地址,如,60H,P0。,(6)rel:以补码形式表示的8位相对偏移量,范围为:-128127,主要用在相对寻址的指令中。(7)addr16和addr11:分别表示16位直接地址和11位直接地址。(8)bit:表示可位寻址的直接位地址(内部RAM20H2FH单元或SFR中的直接寻址位)。(9)(X):表示X单元中的内容。,(10)(X):表示以X单元的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用(X)。(11):间接寻址寄存器前缀,如Ri,A+DPTR(12):箭尾一方的内容送入箭头一方的单元中去。(13)/:表示对该位操作数取反,但不影响该位的原值。,3.寻址方式寻址方式就是在指令中说明操作数所在地址的方法。在MCS-51单片机有以下7种寻址方式:(1)立即寻址;(2)寄存器间接寻址;(3)寄存器寻址;(4)直接寻址;(5)基址寄存器加变址寄存器间接寻址;(6)相对寻址;(7)位寻址。,1.立即寻址立即寻址方式是指操作数在指令中直接给出,需在操作数前面加前缀标志“#”。即跟在指令操作码后面的数就是参加运算的数,该操作数称为立即数。例如指令:MOVA,3AHMOVDPTR,0DFFFH上述两条指令均为立即寻址方式,第一条指令的功能是将立即数3AH送累加器A中,第二条指令的功能是将立即数0DFFFH送数据指针DPTR中。,2寄存器寻址方式操作数在寄存器中。寄存器包括8个工作寄存器R0R7,累加器A,寄存器B、数据指针DPTR等。例如指令:MOVA,Rn;(Rn)A,n=07指令功能是表示把寄存器Rn的内容传送给累加器A。,3.寄存器间接寻址寄存器中存放的是操作数的地址,即指令中给出间接寻址寄存器,其内容为操作数的地址。在寄存器的名称前面加前缀标志“”。例如指令:,可作为寄存器间接寻址的寄存器只有R0、R1及DPTR。寻址片内RAM区的低128个单元(高128个单元不可以进行寄存器间接寻址)时,可使用寄存器R0、R1作为地址指针;当访问片外RAM时,可使用R0、R1(外部RAM的低256单元)及DPTR(外部RAM的64KB单元)作为地址指针。例如:MOVXA,DPTR,4.直接寻址在指令中直接给出操作数的地址,即指令的操作数部分直接是操作数的地址。例如指令:MOVA,40H在MCS-51单片机指令系统中,直接寻址方式中可以访问2种存储器空间:(1)内部数据存储器的低128个字节单元(00H7FH)。(2)特殊功能寄存器。除了以单元地址的形式外,还可用寄存器符号的形式给出。例如:MOVA,80H与MOVA,P0是等价的。,5.基址寄存器加变址寄存器间接寻址(变址寻址)这种寻址方式用于访问程序存储器中的数据表格,它以DPTR或PC作为基址寄存器,以累加器A变址寄存器,两者的内容相加的和作为操作数的地址。例如指令:MOVCA,A+DPTR其中A的原有内容为05H,DPTR的内容为0400H,该指令执行的结果是把程序存储器0405H单元的内容传送给A。,说明:(1)本寻址方式是专门针对程序存储器的寻址方式,寻址范围可达到64KB。(2)本寻址方式的指令只有3条:MOVCA,A+DPTRMOVCA,A+PCJMPA+DPTR,6.相对寻址在MCS-51指令系统中设有转移指令,分为直接转移和相对转移指令,在相对转移指令中采用相对寻址方式。这种寻址方式是以PC的内容为基本地址,加上指令中给定的偏移量rel作为程序的转移地址(目的地址)。目的地址=当前PC+rel=转移指令所在的地址+转移指令的字节数+rel偏移量rel是一带符号的8位二进制数的码数。,7.位寻址在位操作指令中直接给出位操作数的地址。例如指令:MOVC,40H指令功能是把位地址40H的值送到进位标志位C。又如指令:ORLC,P1.2,3.3数据传送类指令使用最频繁的一类指令,共29条。为便于理解记忆指令,对数据传送类指令再作如下分类:,3.3.1访问片内数据存储器的一般数据传送指令该类指令的功能是实现数据在片内RAM单元之间、寄存器之间、寄存器与RAM单元之间的传递。通用格式:MOV,属“复制”性质,而不是“搬家”。,访问片内RAM的一般传送指令操作关系图,例1设内部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=CAH,分析以下程序执行后各单元及寄存器、P2口的内容。MOVR0,#30HMOVA,R0MOVR1,AMOVB,R1MOVR1,P1MOVP2,P1MOV10H,#20H,;(R0)=30H,;(A)=40H,;(R1)=40H,;(B)=10H,;(40H)=CAH,;(P2)=CAH,;(10H)=20H,3.3.2片内特殊传送指令1.堆栈操作指令该类指令共有以下两条:PUSHdirect该条指令的功能是首先修改指针(SP)(SP)+1,然后将直接地址direct单元的内容压入堆栈指针SP所指单元内。POPdirect该条指令的功能是首先将堆栈指针SP所指单元的内容弹出到直接地址direct单元中去,然后修改指针(SP)(SP)-1。,例2若在外部程序存储器中2000H单元开始依次存放09的平方值,(DPTR)=3A00H,用查表指令取得2003H单元的数据后,要求保持DPTR中的内容不变。完成上述功能的程序如下:MOVA,#03HPUSHDPHPUSHDPLMOVDPTR,#2000HMOVCA,A+DPTRPOPDPLPOPDPH,2.数据交换指令该类指令共有如下5条:XCHA,Rn;(A)(Rn),n=07XCHA,Ri;(A)(Ri),i=0,1XCHA,direct;(A)(direct)XCHDA,Ri;(A30)(Ri)30,i=0,1SWAPA;(A74)(A30)前三条指令是将累加器A的内容和源操作数内容相互交换;后两条指令是半字节交换指令;第四条指令是将累加器A的低4位内容和(Ri)所指出的内部RAM单元的低4位内容相互交换;最后一条指令是将累加器A的高4位与低4位之间进行交换。,3.3.3片外数据存储器数据传送指令该类指令共有以下四条指令:MOVXA,DPTR;(A)(DPTR),读外部RAM/IOMOVXA,Ri;(A)(Ri),读外部RAM/IOMOVXDPTR,A;(DPTR)(A),写外部RAM/IOMOVXRi,A;(Ri)(A),写外部RAM/IO指令功能:读外部RAM存储器或I/O中的一个字节,或把A中一个字节的数据写到外部RAM存储器或I/O中。,注意:RD(P3.7)或WR(P3.6)信号有效。采用DPTR间接寻址,高8位地址(DPH)由P2口输出,低8位地址(DPL)由P0口输出。采用Ri(i=0,1)间接寻址,可寻址片外低256个单元的数据存储器。Ri内容(地址)由P0口输出。,例设片外RAM(0203H)=FFH,分析以下指令执行后的结果。MOVDPTR#0203HMOVXA,DPTRMOV30H,AMOVA,#0FHMOVDPTR,A执行结果为(DPTR)=0203H,(30H)=FF,(0203)=(A)=0FH,3.3.4访问程序存储器的数据传送指令访问程序存储器的数据传送指令又称为查表指令。用于读程序存储器中的数据表格的指令。共两条,均采用基址寄存器加变址寄存器间接寻址方式。(1)MOVCA,A+PC该指令以PC作基址寄存器,A的内容作为无符号整数和PC中的内容(下一条指令的起始地址)相加后得到一个16位的地址,把该地址指出的程序存储单元的内容送到累加器A。注意:PSEN#信号有效。,例如:(A)=30H,执行地址1000H处的指令1000H:MOVCA,A+PC本指令占用一个字节,执行结果将程序存储器中1031H的内容送入A。优点:不改变特殊功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数。缺点:表格只能存放在该条查表指令后面的256个单元之内,表格的大小受到限制,且表格只能被一段程序所利用。,编成时还需要进行偏移量的计算,即MOVCA,A+PC指令所在地址与表格存放首地址间的距离字节数的计算,并需要一条加法指令进行调整。偏移量计算公式为:偏移量=表首地址-(MOVC指令所在地址+1),(2)MOVCA,A+DPTR以DPTR作为基址寄存器,A的内容作为无符号整数和DPTR的内容相加得到一个16位的地址,把由该地址指出的程序存储器单元的内容送到累加器A。例如:(DPTR)=8100H(A)=40H执行指令MOVCA,A+DPTR本指令的执行结果只和指针DPTR及累加器A的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64K程序存储器中任意安排,一个表格可以为各个程序块公用。,例从片外程序存储器2000H单元开始存放09的平方值,以PC作为基址寄存器进行查表得的平方值。设MOVC指令所在地址为1FFOH,则偏移量=2000H-(1FF0H+1)=0FHMOVA,#09HADDA,#0FHMOVCA,A+PC若用以DPTR作为基址寄存器的查表指令,程序如下MOVDPTR,#2000HMOVA,#09HMOVCA,A+DPTR,3.4算术运算类指令算术运算类指令共24条,包括加法,带进位加法、带进位减法、加1、减1、乘除及十进制调整指令。1加法指令共有4条加法运算指令:ADDA,Rn;(A)(A)+(Rn),n=07ADDA,direct;(A)(A)+(direct)ADDA,Ri;(A)(A)+(Ri),i=0,1ADDA,#data;(A)(A)+#data,一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放在A中。使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:(1)如果位7有进位,则置“1”进位标志Cy,否则清“0”Cy(2)如果位3有进位,置“1”辅助进位标志Ac,否则清“0”Ac(Ac为PSW寄存器中的一位)。(3)如果位6有进位,而位7没有进位,或者位7有进位,而位6没有,则溢出标志位OV置“1”,否则清“0”OV。,例(A)=53H,(R0)=FCH,执行指令ADDA,R0结果为:(A)=4FH,Cy=1,Ac=0,OV=0,P=1注意:上面的运算中,由于位6和位7同时有进位,所以标志位OV=0。例(A)=85H,(R0)=20H,(20H)=AFH,执行指令:ADDA,R0结果为:(A)=34H,Cy=1,Ac=1,OV=1,P=1注意:由于位7有进位,而位6无进位,所以标志位OV=1,2带进位加法指令标志位Cy参加运算,因此是三个数相加。共4条:ADDCA,Rn;(A)(A)+(Rn)+Cy,n=07ADDCA,direct;(A)(A)+(direct)+CyADDCA,Ri;(A)(A)+(Ri)+Cy,i=0,1ADDCA,#data;(A)(A)+#data+Cy例:(A)=85H,(20H)=FFH,Cy=1,执行指令:ADDCA,20H结果为:(A)=85H,Cy=1,Ac=1,OV=0,P=1(A中1的位数为奇数),3加1指令5条增1指令:INCAINCRn;n=07INCdirectINCRi;i=0,1INCDPTR不影响PSW中的任何标志。第5条指令INCDPTR,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。,4十进制调整指令DAA这条指令是一条对二十进制的加法进行调整的指令,即对累加器A参与的BCD码加法运算所获得的8位结果进行十进制调整,使累加器A中的内容调整为二位压缩型BCD码。使用时必须注意,它只能跟在加法指令之后,且其结果不影响溢出标志位。,执行该指令时,判断A中的低4位是否大于9和辅助进位标志AC是否为“1”,若两者有一个条件满足,则低4位加6H操作;同样,A中的高4位大于9或进位标志Cy为“1”两者有一个条件满足时,高4位加6H操作;若AC与Cy同时为,或者高位虽等于9,但低位修正后有进位,则A应加66H。,MOVA,36HADDA,45HDAA,例如:有两个BCD数36与45相加,结果应为BCD码81程序如下:,00110110360100010145,011110117B0000011006,+,+,1000000181,得结果7BH;第三条指令对累加器A进行十进制调整,低4位(为0BH)大于9,因此要加6,得调整的BCD码81。,注意,DA指令不能对减法指令的结果进行调整。做减法运算时,可采用十进制补码相加,然后用DAA指令进行调整。机内十进制补码采用:|X|补=9AH-|X|。例11,以下程序实现BCD码70-20=50。MOV30H,#70HMOV31H,#20HCLRCMOVA,#9AHSUBBA,31H;计算-20的补码ADDA,30HMOV32H,A,5带借位的减法指令4条指令:SUBBA,Rn;(A)(A)-(Rn)-Cy,n=07SUBBA,direct;(A)(A)-(direct)-CySUBBA,Ri;(A)(A)-(Ri)-Cy,i=0,1SUBBA,#data;(A)(A)-#data-Cy从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中。若要进行不带借位的减法操作,则必须先将Cy清0。,6减1指令4条指令:DECA;(A)-1ADECRn;(Rn)-1Rn,n=07DECdirect;(direct)-1directDECRi;(Ri)-1(Ri),i=0,1减1指令不影响标志位。,7乘法指令MULAB;BAAB这条指令的功能是:将累加器A的内容与寄存器B的内容相乘,乘积的低8位存放在累加器A中,高8位存放于寄存器B中。如果乘积超过0FFH,则溢出标志OV置“1”,否则清“0”。进位标志Cy总是被清“0”。,8除法指令DIVAB;AA/B(商),B余数这条指令的功能是:将累加器A中的8位无符号数除以寄存器B中的8位无符号整数,所得商的整数部分存放在累加器A中,余数部分存放在寄存器B中,清“0”进位标志Cy和溢出标志OV。若原来B中的内容为0,则执行该指令后A与B中的内容不定,并将溢出标志OV置“1”。在任何情况下,进位标志Cy总是被清“0”。,3.逻辑运算指令及移位指令1.简单逻辑操作指令(1)CLRA功能是累加器A清“0”。不影响Cy、Ac、OV等标志。(2)CPLA功能是将累加器A的内容按位逻辑取反,不影响标志。2不带进位左移指令RLA功能是累加器A的8位向左循环移位,位7循环移入位0,不影响标志。,3带进位左移指令RLCA功能是将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其它标志。4不带进位右移指令RRA功能是累加器A的内容向右环移一位,Acc.0移入Acc.7,不影响其它标志。5带进位右移指令RRCA这条指令的功能是累加器A的内容和进位标志Cy一起向右环移一位,Acc.0进入Cy,Cy移入Acc.7。,逻辑与指令ANLA,Rn;(A)(A)(Rn),n=07ANLA,direct;(A)(A)(direct)ANLA,#data;(A)(A)#dataANLA,Ri;(A)(A)(Ri),i=01ANLdirect,A;(direct)(direct)(A)ANLdirect,#data;(direct)(direct)#data逻辑与指令常用于屏蔽字节中的某些位。若清除某位,则用和该位相与;若保留某位,则用和该位相与。,.逻辑或指令ORLA,Rn;(A)(A)(Rn),n=07ORLA,direct;(A)(A)(direct)ORLA,#data;(A)(A)#dataORLA,Ri;(A)(A)(Ri),i=0,1ORLdirect,A;(direct)(direct)(A)ORLdirect,#data;(direct)(direct)#data逻辑或指令常用于使字节中的某些位置,其它位保持不变。若置位某位,则用和该位相或;若保留某位,则用和该位相或。,逻辑异或指令XRLA,Rn;(A)(A)(Rn)XRLA,direct;(A)(A)(direct)XRLA,Ri;(A)(A)(Ri),i=0,1XRLA,#data;(A)(A)#dataXRLdirect,A;(direct)(direct)(A)XRLdirect,#data;(direct)(direct)#data逻辑异或指令常用于使字节中的某些位进行取反操作,其它位保持不变。若某位取反,则用和该位相异或;若保留某位,则用和该位相异或。,3.控制转移类指令控制转移指令可分为无条件转指令、条件转移指令、子程序调用及返回指令。3.1无条件转移指令长跳转指令LJMPLJMPaddr16执行该指令时,将16位目标地址addr16装入PC,程序无条件转向指定的目标地址。转移的目标地址可以在64KB程序存储器地址空间的任何地方,不影响任何标志。,表控制转移指令,2绝对转移指令AJMPAJMPaddrll2KB范围内的无条件跳转指令。执行该指令时,先将PC(AJMP指令所在位置的地址+该指令字节数2),然后将addr11送入PC10PC0,而PC15PC11保持不变,这样得到转移的目的地址。需要注意的是,转移的目标地址的高5位必须与AJMP后的下一条指令地址的高5位地址码A15A11相同。,3相对短转移指令SJMPrel执行该指令时,先将PC(SJMP指令所在位置的地址+该指令字节数2),再把指令中带符号的偏移量(范围-128+127)加到PC上,得到跳转的目标地址送入PC。实现的程序转移是双向的。在编写程序时,直接写上要转向的目标地址标号就可以。例如:LOOP:MOVA,R6SJMPLOOP程序在汇编时,由汇编程序自动计算和填入偏移量。,美元符号$的使用用于表示该转移指令操作码所在的地址。例如:HERE:SJMPHERE等价为:SJMP$,4间接转移指令(相对长转移指令)JMPA+DPTR执行该指令时,把累加器A中的8位无符号数与数据指针中的16位数相加,结果作为下条指令的地址送入PC,不改变累加器A和数据指针DPTR的内容,也不影响标志。以DPTR内容作为基址,A的内容作变址。给A赋予不同的值,即可实现程序的多分支转移。,例16根据累加器A的值,转不同处理程序的入口。MOVDPTR,#TABLEJMPA+DPTRTABLE:AJMPTAB1;(A)=0时转TAB1执行AJMPTAB1;(A)=2时转TAB2执行AJMPTAB1;(A)=4时转TAB3执行TAB1:TAB2:TAB3:,3.2条件转移指令规定的条件满足,则进行转移,条件不满足则顺序执行下一条指令。共有8条指令,可分为累加器判零条件转移指令、比较条件转移指令、减1条件转移指令。都采用相对寻址,程序可在当前PC值为中心的-128+127范围内转移。,1判零条件转移指令JZrel;(A)=0,则转移JNZrel;(A)0,则转移条件满足时转移,条件不满足时则顺序执行下面一条指令。转移的目标地址在以下一条指令的起始地址为中心的256个字节范围之内(128+127)。当条件满足时,(PC)(PC)+N+rel,其中(PC)为该条件转移指令的第一个字节的地址,N为该转移指令的字节数(长度),本转移指令N=2。,2比较不相等转移指令CJNEA,direct,relCJNEA,#data,relCJNERn,#data,relCJNERi,#data,rel这组指令的功能是:比较前面两个操作数的大小,如果它们的值不相等则转移。转移地址的计算方法与上述两条指令相同。如果第一个操作数(无符号整数)小于第二个操作数(无符号整数),则进位标志Cy置“1”,否则清“0”,但不影响任何操作数的内容。,3减1条件转移指令这是一组把减1与条件转移两种功能结合在一起的指令。共两条指令:DJNZRn,rel;n=07DJNZdirect,rel将源操作数(Rn或direct)减1,结果回送到Rn寄存器或direct中去。如果结果不为0则转移。允许程序员把寄存器Rn或内部RAM的direct单元的内容用作程序循环计数器。主要用于控制程序循环。以减1后是否为“0”作为转移条件,即可实现按次数控制循环。,例19将从内部RAMDATA单元开始的10个无符号数相加,相加结果送SUM单元保存。设相加结果不超过8位二进制数,相应程序如下:MOVR0,#0AH;设置循环次数MOVR1,#DATA;R1作地址指针,指向数据块;首地址CLRALOOP:ADDA,R1INCR1;修改地址指针,指向下一个数DJNZR0,LOOP;R0减1,不为0转移MOVSUM,A,3.7子程序调用及返回指令在程序设计中,通常把具有一定功能的公用程序段编制成子程序,当主程序需要使用子程序时用调用指令调用子程序,而在子程序的最后安排一条子程序返回指令,以便执行完子程序后能返回主程序继续执行。1子程序调用指令,(1)长调用指令LCALLaddr16这条指令无条件调用位于16位地址addr16的子程序。执行该指令时,先将(PC)(PC)+3以获得下一条指令的首地址,并把此时的PC内容压入堆栈(先低字节后高字节)作为返回地址,SP内容随之修改,然后将16位地址放入PC中,转去执行以该地址为入口的程序。LCALL指令可以调用64KB范围内任何地方的子程序。指令执行后不影响任何标志。,(2)绝对调用指令ACALLaddr11这是一条2KB范围内的子程序调用指令。执行该指令时,先将(PC)(PC)+2以获得下一条指令的地址,然后将16位地址压入堆栈(PCL内容先进栈,PCH内容后进栈),SP内容加2,最后把PC的高5位PC15PC11与指令中提供的11位地址addr11相连接(PC15PC11,100)形成子程序的入口地址送入PC,使程序转向子程序执行。所用的子程序的入口地址必须与ACALL指令的下一条指令的第一个字节在同一个2KB存储区内。,2返回指令(1)子程序返回指令RET这条指令的功能是:恢复断点,即将调用子程序时压入堆栈的下一条指令的首地址取出送入PC,使程序返回主程序继续执行。(2)中断返回指令RETI这条指令的功能与RET指令相似。,RET指令与RETI指令的区别:从使用上,RET指令必须作为子程序的最后一条指令;RETI指令必须作为中断服务程序的最后一条指令。RETI指令清除了中断响应时,被置“1”的MCS-51内部中断优先级状态寄存器。3空操作指令NOP;(PC)(PC)+1空操作指令是一条单字节单周期指令。它控制CPU不做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期,不影响任何标志位。,3.8位操作类指令,表3.6位操作指令,在位操作指令中,位地址的表达形式有以下几种:(1)直接地址表式:如0A8H;(2)点表示(寄存器.位):如IE.0;(3)位名称表式:如EX0;(4)用户定义名称表式:如用伪指令BIT定义:WBZD0BITEX0经定义后,允许指令中使用WBZD0代替EX0。,1.数据位传送指令MOVC,bit;(Cy)(bit)MOVbit,C;(bit)(Cy)这组指令的功能是:把源操作数指出的布尔变量送到目的操作数指定的位地址单元中。其中一个操作数必须为进位标志Cy,另一个操作数可以是任何可直接寻址位。例MOVC,06H;(Cy)(20H).6)06H是内部RAM20H单元位6的位地址。MOVP1.0,C;(P1.0)(Cy),2位变量修改指令CLRC;清“0”CyCLRbit;清“0”bit位CPLC;Cy求反CPLbit;bit位求反SETBC;置“1”CySETBbit;置“1”bit位这组指令将操作数指出的位清“0”、求反、置“1”,不影响其它标志。,3位变量逻辑与指令ANLC,bit;(Cy)(bit)(Cy)ANLC,/bit;(Cy)(Cy)(/bit)bit前的斜杠表示对(bit)取反。直接寻址位取反后用作源操作数,但不改变直接寻址位原来的值。例如指令:ANLC,/ACC.0执行前ACC.0为0,C为1,则指令执行后C为1,而ACC.0仍为0。,4位变量逻辑或指令ORLC,bitORLC,/bit5条件转移类指令JCrel;若(Cy)=1,则转移(PC)(PC)+2+relJNCrel;若(Cy)=0,则转移(PC)(PC)+2+relJBbit,rel;若(bit)=1,则转移(PC)(PC)+3+relJNBbit,rel;若(bit)=0,则转移(PC)(PC)+3+relJBCbit,rel;若(bit)=1,则转移(PC)(PC)+3+rel,并(bit)0,例20利用位操作指令,模拟下图所示的硬件逻辑电路的功能。PR2:MOVC,P1.1ORLC,P1.2ANLC,P1.0CPLCMOVF0,CMOVC,P1.3ANLC,/P1.4ORLC,F0MOVP1.5RET,3.9汇编程序格式与伪指令使用汇编语言编程,是单片机程序设计的基本功之一。1.汇编程序格式汇编程序是指令系统的一个子集,只要指令按格式书写就构成了程序的基本格式。指令书写格式:标号:操作码助记符目的操作数,源操作数;注释,十六进制,后缀“H”;二进制,后缀“B”;十进制,后缀“D”,也可省略。若十六进制的操作数以字符AF中的某个开头时,则需在它前面加一个“0”,以便在汇编时把它和字符AF区别开来。,2.伪指令伪指令是对汇编过程起控制作用,是程序员发给汇编程序的命令,指示如何完成汇编工作。伪指令没有对应的机器代码,不产生目标程序。1)设置目标程序起始地址伪指令ORG(ORiGin)指令格式为:标号:ORG地址(十六进制表示)该指令的作用是指明后面的程序或数据块的起始地址,后面的源程序或数据块就依次连续存放,直到遇到另一个ORG指令为止。,例:ORG0100HSTART:MOVSP,60HMOVR0,2FHMOVR2,0FFHORG伪指令说明其后面程序的目标代码在程序存储器中存放的起始地址是0100H,即程序存储器地址目标程序0100H7581600103H782F0105H7AFF,在一个源程序中,可多次使用ORG指令,来规定不同的程序段的起始地址。但是,地址必须由小到大排列,地址不能交叉、重叠。例如:ORG2000HORG2500HORG3000H,2)汇编终止命令END(ENDofassembly)指令格式:标号:END汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于程序的最后。3)定义字节伪指令DB(DefineByte)指令格式:标号:DB项或项表其中项或项表指一个字节数据或用逗号分开的字节数据串,或以单引号括起来的字符串。,ORG2000HTAB:DB30H,7FH,24,DBC,5,AB汇编后:(2000H)=30H(2001H)=7FH(2002H)=18H(十进制数24)(2003H)=43H(字符C的ASCII码)(2004H)=35H(字符5的ASCII码)(2005H)=41H(字符A的ASCII码)(2006H)=42H(字符B的ASCII码)DB功能是从指定单元开始定义(存储)若干个字节,10进制数自然转换成16进制数,字母按ASCII码存储。,4)定义字伪指令DW(DefineWord)指令格式:标号:DW项或项表例,ORG2000HDW1246H,7BH,10汇编后:(2000H)=12H;第1个字(2001H)=46H(2002H)=00H;第2个字(2003H)=7BH(2004H)=00H;第3个字(2005H)=0AH,5)预留存储空间伪指令DS指令格式:标号:DS表达式该伪指令的功能是从标号地址开始,保留若干字节的内存空间以备存放数据。保留的字节单元数由表达式的值决定。例如:ORG1000HDS20HDB30H,8FH汇编后从1000H开始,预留32(20H)个字节的内存单元,然后(1020H)=30H,(1021H)=8FH。,6)等值伪指令EQU指令格式:标号EQU数字或汇编符号该伪指令功能是使标号等价于给定的数字或汇编符号。例:TESTEQU2000H表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。在同一个源程序中,同一个标号只能赋值一次。,使用等值指令可给程序的编制、调试、修改带来方便,如果在程序中要多次使用到某一地址,由EQU指令将其赋值给一个字符名称,一旦需要对其进行变动,只要改变EQU命令后面的数字即可,而不需要对程序中涉及到该地址的所有指令逐句进行修改。但要注意,由EQU等值的字符名称必须先赋值后使用,且在同一个源程序中,同一个标号只能赋值一次。,7)位地址定义伪指令BIT指令格式:标号BIT位地址该伪指令的功能是将位地址赋予前面的标号,经赋值后可用该标号代替BIT前面的位地址。例如:FLGBITF0,3.10汇编程序设计示例汇编语言程序设计步骤:(1)分析问题,确定算法(2)根据算法,画出程序框图(3)分配内存工作区及有关端口地址(4)编写程序养成在程序的适当位置上加上注释的好习惯。,(5)上机调试编写完毕的程序,必须“汇编”成机器代码,才能调试和运行,调试与硬件有关程序还要借助于仿真开发工具并与硬件连接。汇编语言程序的基本结构形式常采用以下几种基本结构:顺序结构、分支结构和循环结构,再加上广泛使用的子程序和中断服务子程序。,一.算术、逻辑处理程序例22多字节无符号数相加。设被加数与加数分别在以ADR1与ADR2为首地址的片内数据存储器区域中,自低字节起,由低到高依次存放,它们的字节数为L,要求加得的和放回被加数的单元。程序流程图如下图所示。,参考程序如下:ORG0000HAJMPMAINORG0050HMAIN:MOVR0,#ADR1MOVR1,#ADR2MOVR2,#LCLRCLOOP:MOVA,R0ADDA,R1MOVR0,AINCR0INCR1DJNZR2,LOOPEND,例26改进统计自P0口输入的字串中正数、负数、零的个数。已知数串的个数为L,送数的速度为每秒1个,计算机取数、处理的速度极快(与1秒比较)可忽略不计。,START:CLRAMOVR0,AMOVR1,AMOVR2,AMOVR3,#LENTER:MOVA,P1JZZEROJBP1.7,NEGINCR0ACALLDELAY1SDJNZR3,ENTERAJMPCOMPLETE,ZERO:INCR2ACALLDELAY1SDJNZR3ENTERAJMPCOMPLETENEG:INCR1ACALLDELAY1SDJNZR3ENTERAJMPCOMPLETECOMPLETE:RETDELAY1S:RET,编写软件延时程序最常见的软件延时程序是由DJNZ指令构成的多重循环结构。延时程序与MCS-51指令执行时间有很大的关系。1.单循环延时程序下面是一个最简单的单循环延时程序:MOVR5,#TIMELOOP:NOPNOPDJNZR5,LOOP;DJNZ指令为2个机器周期如振荡频率为12MHz,则最长延时时间为:255*4=1024微秒,例50ms延时程序。在使用12MHz晶振时,一个机器周期为1s,执行一条DJNZ指令的时间为2s。这时,可用双重循环方法写出如下的延时50ms的程序:DEL:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2;125*2=250sDJNZR7,DEL1;0.25ms*200=50msRET,以上延时程序不太精确,它没有考虑到除“DJNZR6,DEL2”指令外的其它指令的执行时间,如把其它指令的执行时间计算在内,它的延时时间为:(250+1+2)*200+1=50.301ms如果要求比较精确的延时,可按如下修改:DEL:MOVR7,#200DEL1:MOVR6,#123NOPDEL2:DJNZR6,DEL2;2*123=246sDJNZR7,DEL;(246+1+1+2)*200+1=50.001msRET实际延迟时间为50.001ms,注意。软件延时程序,不允许有中断,否则将严重影响延时的准确性。,例710秒延时程序(多重循环)(12MHz晶振)计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。10秒延时程序如下:DELAY:MOVR5,100DEL0:MOVR6,200DEL1:MOVR7,248DEL2:DJNZR7,DEL2;248*2DJNZR6,DEL1;(248*2+1+2)*200s=99.8msDJNZR5,DEL0;(99800+2+1)*100s+19.980201sRET,例29将十六进制数转换为ASCII码。查ASCII码表可知:数字09的ASCII码分别为30H39H;大写英文字母AF的ASCII码分别是41H46H。可见数字的ASCII码值与数字值相差30H;大写字母的ASCII码值与其值相差37H。,ORG0000HAJMPMAINORG0100HMAIN:MOVSP,#60HMOVA,#06HMOVR2,A,ADDA,#0F6HMOVA,R2JNCAD30ADDA,#37HAJMPCOMPLAD30:ADDA,30HCOMPL:END,实现转换的程序如下:,ORG0000HAJMPMAINORG0050HMAIN:MOVSP,#60HMOVA,#03HPUSHDPHPUSHDPL,MOVDPTR,#TABMOVCA,A+DPTRPOPDPLPOPDPHTAB:DB00H,01H,04H,09H,10HDB19H,24H,31H,40H,51H,查表程序设计例,根据累加器A中的内容(09之间)查平方表,求出相应的结果。用MOVCA,A+DPTR查表指令,要求保持DPTR中的内容不变。,完成上述功能的程序如下:,定时器/计数器的编程和应用在设计定时器/计数器应用程序中,应做如下工作:(1)根据定时或计数要求确定适当的定时器/计数器工作方式、计算出初值,并设置TMOD、THX、TLX。(2)根据对定时器/计数器的工作要求设置中断系统,即设置中断允许控制寄存器IE和中断优先级控制寄存器IP。(3)启动定时器/计数器,即置位TCON中的TRX位。,4种工作方式中,方式0与方式1基本相同,由于方式0是为兼容MCS-48而设,初值计算稍微复杂,在实际应用中,一般不用方式0,而采用方式1。定时器/计时器方式1应用例1假设系统的振荡频率为6MHz,要在P1.0上输出一个周期为2ms的方波,如下图所示。,方波的周期用T0来确定,让T0每隔1ms计数溢出1次,即T0每隔1ms产生一次中断,CPU响应中断后,在中断服务程序中对P1.0取反。(1)计算初值X设初值为X,则有:(216-X)210-6=110-3216-X=500X=65036X化为16进制,即X=FE0CH=1111111000001100B。所以,T0的初值为:TH0=0FEHTL0=0CH,(2)初始化程序设计主要是对寄存器IP、IE、TCON、TMOD的相应位进行正确设置。,TMOD,(3)程序设计中断服务程序除了完成要求的产生方波这一工作之外,还要注意将计数初值重新装入定时器中,为下一次产生中断作准备。参考程序:ORG0000HRESET:AJMPMAIN;转主程序ORG000BH;T0的中断入口AJMPIT0P;转T0中断处理程序IT0PORG0050HMAIN:MOVSP,#60H;设堆栈指针MOVTMOD,#01H;设置T0为工作方式1,ACALLPT0M0;调用子程序PT0M0HERE:AJMPHERE;自身跳转,等待溢出中断PT0M0:MOVTL0,#0CH;T0置初值MOVTH0,#0FEHSETBET0;允许T0中断SETBEA;CPU开中断SETBTR0;启动T0RETITOP:MOVTL0,#0CH;T0中断服务子程序,T0重新置初值MOVTH0,#0FEHCPLP1.0;P1.0的状态取反RETIEND,查询方式的参考程序(CPU不作其它工作):ORG0000HRESET:AJMPMAIN;转主程序ORG0050HMAIN:MOVSP,#60H;设堆栈指针MOVTMOD,#01H;设置T0为方式1SETBET0;允许T0中断SETBEA;CPU开中断SETBTR0;启动T0LOOP:MOVTH0,#0FEH;T0置初值MOVTL0,#0CHLOOP1:JNBTF0,LOOP1;查询TF0标志CLRTF0;T0溢出,清TF0CPLP1.0;P1.0的状态求反SJMPLOOPEND,例6-2假设系统时钟为12MHz,编写定时器T0产生1秒定时的程序。(1)T0工作方式的确定因定时时间较长,采用哪一种工作方式?由各种工作方式的特性,可计算出:方式0最长可定时8.192ms;方式1最长可定时65.536ms;方式2最长可定时256s。选方式1,每隔50ms中断一次,中断20次即为1s。(2)计算计数初值因为:(216-X)110-6=5010-3所以:X=15536=3CB0H因此:TH0=3CH,TL0=0B0H,(3)20次计数的实现对于中断20次计数,可使T0工作在计数方式,也可用循环程序的方法实现。本例采用循环程序法。(4)程序设计参考程序:ORG0000HRESET:LJMPMAIN;上电,转主程序入口MAINORG000BH;T0的中断入口LJMPIT0P;转T0中断处理程序IT0PORG0100HMAIN:MOVSP,#60H;设堆栈指针,MOVB,#20;设循环次数20次MOVTMOD,#01H;设T0工作在方式1MOVTL0,#0B0H;给T0设初值MOVTH0,#3CHSETBET0;允许T0中断SETBEA;CPU开放中断SETBTR0;启动T0SJMP$;等待中断ITOP:MOVTL0,#0B0H;T0中断服务子程序,重装初值MOVTH0,#3CH;DJNZB,LOOPCLRTR0;1s定时时间到,停止T0工作LOOP:RETIEND,例33要求用单片机内部的定时器/计数器定时1分钟。设单片机振荡频率fosc=12MHz。分析:单片机内部定时器/计数器,按定时工作方式,最长定时时间只有65.536ms。达到1分钟定时可采用两个定时器串接的方法。如使定时器/计数器T0工作于方式1定时1ms,定时器/计数器T1工作于方式1对定时器/计数器T0的溢出脉冲计数60000次,这样可得:1ms60000=60000ms=60s,即定时1分钟。这样仍存在一个问题:定时器/计数器T1计数是对单片机外部引脚P3.5上的输入脉冲进行的,定时器/计数器T0的溢出对外无脉冲信号。,对此问题的解决,可在程序中用软件方法,当定时器/计数器T0定时溢出时,在P3.5引脚上形成一个计数脉冲。定时器/计数器T0、T1初值计算及设置:初值计算T0:65536-1000=64536=FC18HT1:65536-60000=5536=15A0H,参考程序如下:ORG0000HLJMP0030H;等价于LJMPSTARTORG001BH;定时器/计数器T1的中断服务程序入口地址SETBF0;建立定时1分钟到的用户标志RETIORG0030H;主程序START:MOVTMOD,#51H;设置T0、T1工作方式REPEAT:MOVTH1,#15H;设置T1计数初值MOVTL1,#A0HMOVTH0,#0FCH;设置T0计数初值MOVTL0,#18H,CLRP3.5;以便形成计数脉冲MOVIE,#88H;开T1内部中断SETBTR1;启动定时器/计数器T1SETBTR0;启动定时器/计数器T0LOOP:;此处可写完成监控任务的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论