上海大学单片机_第1页
上海大学单片机_第2页
上海大学单片机_第3页
上海大学单片机_第4页
上海大学单片机_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

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

文档简介

第三章MCS-51的指令系统提纲3.1指令系统简介3.2寻址方式3.3数据传送类指令3.4算术运算类指令3.5逻辑运算类指令3.6控制转移类指令3.7位操作类指令3.1指令系统简介1、简要介绍2、指令格式3.1指令系统简介1、简要介绍MCS-51单片机共有111条指令:单字节指令有49条,双字节指令有45条,三字节指令有17条。其中有64条是单机器周期指令,45条双机器周期指令,有2条是4机器周期指令(乘法和除法,单字节)。当系统时钟为12M时,机器周期为1微秒,则指令执行时间仅需1-4微秒。MCS-51指令系统根据功能可分为5类:数据传输指令,有29条算术运算类指令,有24条逻辑操作类指令,有24条位操作指令,有17条控制转移指令,是17条。3.1指令系统简介3.1指令系统简介2、指令格式指令格式:[标号]:<操作码>[目的操作数],[源操作数][;注释]标号:指令的符号地址操作码:规定了指令的操作功能操作数:参加操作的数据、数据地址或符号地址注释:该条指令的说明,便于阅读3.1指令系统简介MCS-51指令系统根据指令字节长度可分为单字节、双字节和三字节:单字节指令:RETI目标码:32H双字节指令:MOVA,#0FFH目标码:74HFFH三字节指令:MOV74H,#0FFH目标码:75H74HFFH指令字节越长,占用的内存单元越长,但执行时间的长短只取决于执行这条指令所需要机器周期的个数(指令周期)。3.2寻址方式1、寻址方式定义2、寻址方式中的常用符号3、寻址方式3.2寻址方式1、寻址方式定义将寻找指令中的操作数或操作数所在地址,称为寻址。把如何找到操作数或操作数所在的地址,称为寻址方式。寻址方式越多,计算机的功能就越强,灵活性就越大,更能有效的处理各种数据。3.2寻址方式2、寻址方式中的常用符号Rn:n等于0—7。R0-R7代表当前所选定的工作寄存器组。Ri:i取值为0或1。可作为地址指针的两个工作寄存器,既可存放数据,又可存放地址。#data:表示8位的立即数,出现在指令中的8位常数。#data16:表示16位的立即数,出现在指令当中的16位常数。direct:直接地址,表示8位片内数据存储器单元,SFR也是直接地址。3.2寻址方式addr11:表示一个11位的目的地址,主要用在ACALL和AJMP指令,其目的地址是在下一条指令地址所在的2K字节分区内。addr16:表示一个16位的目的地址,主要用在于LCALL和LJMP指令中,可在整个64K地址空间内转移。rel:表示一个补码形式的8位地址偏移量,以下一条指令的第一字节地址为基值,偏移的范围是-128到+127。bit:表示片内数据存储器中或特殊寄存器中的可直接寻址的位地址。@:间址寄存器前面的前缀符号,用在寄存器间接寻址方式中。/:取反符号,在位操作指令中,先求反再进行操作。(x):表示指定的寄存器或地址中的内容。((x)):表示由x所指的地址单元中的内容,适合间址寻址使用。箭头←:表示指令的操作流程,将箭头右边内容送给左边的单元。$:表示本条指令的起始地址。3.2寻址方式3.2寻址方式3、寻址方式1)立即寻址2)直接寻址3)寄存器寻址4)间接寻址5)变址寻址6)相对寻址7)位寻址3.2寻址方式1)立即寻址立即寻址指令大多是双字节:第一个字节是操作码第二个字节是操作数。真接参与运算的操作数,称为立即数,数的前面面用“#”来表示。例:MOVA,#31H3.2寻址方式51指令系统中,只有一条指令的源操作数是16位,功能是向DPTR传送16位的立即数,立即数的高8位送到DPH里,而低8位送到DPL中。例:MOVDPTR,#3FA6H指令代码:90H,3FH,A6H3.2寻址方式2)直接寻址在指令当中,直接给出操作数所在的存储地址,包括片内RAM128个单元,以及所有特殊功能寄存器SFR。对于特殊功能寄存器,直接寻址时,可以用其地址,也可以使用其名字。(P1或90H)例:MOVA,69H指令代码:E5H,69H3.2寻址方式3)寄存器寻址对工作寄存器R0——R7、累加器A、寄存器B、数据指针DPTR中的数进行寻址。R0到R7是由操作码的低三位来表示。其它寄存器隐含在操作码当中。3.2寻址方式例:MOVA,R5;A(R5)指令代码:EDH(11101101)注:操作码的低三位101表示操作数是R5。RS1和RS0为01,R5(0DH)中存放4AH,执行指令之后,4AH被送到累加器中。3.2寻址方式4)寄存器间接寻址方式寄存器间接寻址中,操作数所指定的寄存器存放的不是操作数本身,而是操作数的地址。可用作间接寄存器的有R0、R1和DPTR。间址寄存器使用时,前面一定要加@来标识。在执行压栈和出栈操作时:堆栈指针SP作为间址寄存器,自动进行。注意压入的是直接地址。当访问片内RAM,或片外RAM低256个字节时:可用R0或R1来作为间址寄存器。操作码的最低位指明具体使用哪个寄存器。3.2寻址方式例:MOVA,@R1指令代码:E7H(最低位是1,表明使用的工作寄存器是R1)

假设工作寄存器为0组,R1中存放的数是50H,而片内数据存储器50H单元中存放的数是30H,执行指令之后,实际上就是把30H送入累加器。3.2寻址方式5)变址寻址变址寻址是通过“基址寄存器+变址寄存器”来进行间接寻址。以DPTR(数据指针)或PC(程序计数器)为基址寄存器以A作为变址寄存器。变址寻址时,把基址寄存器的内容和变址寄存器的内容,两者相加,所得到的结果来作为操作数的地址。主要是用在查表操作。3.2寻址方式例:MOVCA,@A+DPTR指令代码:93HACC中原来存放的数值为E0H3.2寻址方式6)相对寻址相对寻址:PC中的当前值+指令的第二字节给出的偏移量,相加的结果作为相对跳转指令的目的地址。当前值:正运行指令之后的字节地址,即下一条指令起始地址。偏移量是带符号是数,有正负之分,以补码的形式给出,转移范围是-128到+127。3.2寻址方式例:JC06H指令代码:40H,06H3.2寻址方式7)位寻址位寻址:对片内RAM的可位寻址区域和某些可位寻址的特殊功能寄存器进行位操作。在进行位操作的时候,进位位C作为位累加器使用。操作数是指令中直接给出的位的地址。根据操作码的性质对它进行位操作。位地址与直接地址中的字节地址,形式是完全一样,主要由操作码来区分。3.2寻址方式例:SETB3DH指令代码:D2H,3DH功能:3DH是片内数据存储器27H字节单元的D5位。假设27H中原来的内容是00,执行这条指令后,就会变成20。3DH是27H单元中的D5。3.2寻址方式3.2寻址方式总结:寻址方式和寻址空间关系序号方式使用的变量寻址空间1立即寻址立即数程序存储器2直接寻址直接地址内部RAM和特殊功能寄存器SFR3寄存器寻址R0~R7、A、B、DPTRR0~R7、A、B、DPTR4寄存器间址@R0、@R1、SP内部RAM@R0、@R1、@DPTR外部RAM5变址寻址@A+DPTR、@A+PC程序存储器6相对寻址PC当前值+偏移量rel程序存储器7位寻址位地址、位名称内部RAM和特殊功能寄存器的位地址空间3.3数据传送类指令传送类指令是指令系统当中,最基本、使用最多的一类指令,主要用于数据的传送,保存和交换等。具体分为以下几类: 1、以累加器A为目的操作数的指令 2、以寄存器Rn为目的操作数的指令 3、以直接地址为目的操作数的指令 4、以间接地址为目的操作数的指令 5、16位的数据传送指令 6、累加器A与片外数据存储器传送指令 7、查表指令 8、交换指令 9、堆栈指令3.3数据传送类指令1、以累加器A为目的操作数的指令汇编格式机器码操作机器周期振荡周期字节MOVA,Rn11101rrrA←(Rn)1121MOVA,direct11100101directA←(direct)1122MOVA,@Ri1110011iA←((Ri))1121MOVA,#data01110100dataA←data11223.3数据传送类指令2、以寄存器Rn为目的操作数的指令注意:工作寄存器间不能直接传送;没有“MOVRn,Rn”指令;没有“MOVRn,@Ri”指令。汇编格式机器码操作机器周期振荡周期字节MOVRn,A11111rrrRn←(A)1121MOVRn,direct10101rrrdirectRn←(direct)2242MOVRn,#data01111rrrdataRn←data11223.3数据传送类指令3、以直接地址为目的操作数的指令注意:直接地址之间可直接进行传送;MOVdirect2,direct1;三字节汇编格式机器码操作机器周期振荡周期字节MOVdirect,A11110101directdirect←(A)1122MOVdirect,Rn10001rrrdirectdirect←(Rn)2242MOVdirect2,direct110000101direct1direct2direct2←(direct1)2243MOVdirect,@Ri1000011idirectdirect←((Ri))2242MOVdirect,#data01110101directdatadirect←data22433.3数据传送类指令4、以间接地址为目的操作数的指令注意:没有“MOV@Ri,Rn”指令。汇编格式机器码操作机器周期振荡周期字节MOV@Ri,A1111011i(Ri)←(A)1121MOV@Ri,direct1010011idirect(Ri)←(direct)1122MOV@Ri,#data0111011idata(Ri)←data22423.3数据传送类指令5、16位的数据传送指令汇编格式机器码操作机器周期振荡周期字节MOVDPTR,#data1610010000data15~8data7~0DPH←data15~8DPL←data7~022433.3数据传送类指令6、累加器A与片外数据存储器传送指令在单片机里面没有专门的输入输出指令,输入输出操作都是通过累加器A与片外数据存储器(包含I/O接口)四条数据传送指令来实现。汇编格式机器码操作机器周期振荡周期字节MOVXA,@DPTR11100000A←((DPTR))2241MOVX@DPTR,A11110000(DPTR)←(A)2241MOVXA,@Ri1110001iA←((Ri))2241MOVX@Ri,A1111001i(Ri)←(A)22413.3数据传送类指令第一条和第三条在功能上是一样的,作为输入指令使用,片外存储器送到片内累加器,或将片外I/O口的内容送给累加器。第二条和第四条功能上是一样的,作为输出指令使用,把累加器的内容送到片外数据存储器中,也可以把累加器的内容送到片外的I/O口上。汇编格式机器码操作机器周期振荡周期字节MOVXA,@DPTR11100000A←((DPTR))2241MOVX@DPTR,A11110000(DPTR)←(A)2241MOVXA,@Ri1110001iA←((Ri))2241MOVX@Ri,A1111001i(Ri)←(A)2241总结:片外访问时,在输入时目的操作数是累加器,输出时源操作数是累加器,均与累加器有关,不能用其他寄存器。@DPTR和@Ri区别:DPTR是16位寄存器,寻址范围是整个64K,包括低256字节;Ri是8位寄存器,寻址范围是256字节。3.3数据传送类指令3.3数据传送类指令7、查表指令第一条的基址寄存器是PC。而正在执行当前指令,PC值被固定,只能通过累加器A的内容作为偏移量进行查找。第二条基址寄存器是DPTR,除A外,DPTR可以随意赋值,实际上可以在整个64K范围内,随意进行查表。汇编格式机器码操作机器周期振荡周期字节MOVCA,@A+PC10000011PC←(PC)+1A←((A)+(PC))2241MOVCA,@A+DPTR10010011A←((A)+(DPTR))2241注意:第一条指令受到PC的限制,PC值已被锁定。只能在当前地址基础上,通过累加器里的8位数进行偏移,偏移地址限定在256个字节内。第二条指令中DPTR可以随意放一个数,累加器也可随意地放数,所以可在整个64K范围内进行偏移。3.3数据传送类指令8、交换指令3.3数据传送类指令SWAPA相当于循环移位了4位!!

高4位

低4位汇编格式机器码操作机器周期振荡周期字节XCHA,Rn11001rrr1121XCHA,direct11000101direct1122XCHA,@Ri1100011i1121XCHDA,@Ri1101011i1121SWAPA110001001121(A)(Rn)(A)(direct)(A)((Ri))(A)0~3((Ri))0~33.3数据传送类指令9、堆栈指令压栈或出栈通常是在中断子程序中使用。压栈:机器代码是C0,第二字节是直接地址(R0-R7,A是寄存器,不能直接进行压栈操作)。入栈时,SP始终指向栈顶,向上生长.出栈:机器代码是D0,SP向下始终跟踪栈顶。遵循先进后出。汇编格式机器码操作机器周期振荡周期字节PUSHdirect11000000directSP←(SP)+1(SP)←(direct)2242POPdirect11010000directdirect←((SP))SP←(SP)-12242总结:1)对不同的存储器空间采用不同指令来访问,注意MOV(内部RAM),MOVX(外部RAM),MOVC(ROM)的区别。2)除位P会随A内容变化而变化外,数据传送类指令不影响状态字PSW的其它位。3)89C51指令系统没有专用的输入输出指令,通过数据传送指令来进行I/O操作。3.3数据传送类指令例1.把累加器A中的内容传送到片外RAM3500HMOVDPTR,#3500HMOVX@DPTR,A例2.把片内7AH的内容传送到片外数据存储器3000H单元MOVA,7AHMOVDPTR,#3000HMOVX@DPTR,A3.3数据传送类指令例3.根据累加器A中内容(0-9),查它的平方表的子程序square:PUSHDPHPUSHDPLMOVDPTR,#TABMOVCA,@A+DPTR;A作为入口/出口POPDPLPOPDPHRETTAB:DB0,1,4,9,16,25,36,49,64,813.3数据传送类指令算术运算类指令主要是对8位数进行算术操作,包括加法、减法、加1、减1、乘法和除法,以及十进制调整指令。算术运算类操作大多要影响到PSW中的相关位:通过溢出标志OV,可以对带符号数进行补码运算;借助进位标志C,可以进行多精度的加减运算;借助辅助进位位AC对压缩BCD码进行运算。BCD码:一个BCD码需要4位表示,把两个BCD码放在一个字节里,称为压缩的BCD码。3.4算术运算类指令3.4算术运算类指令1、加法2、带进位加法3、减法4、加一5、减一6、乘除法7、十进制调整指令3.4算术运算类指令1、加法加法指令目的操作数必定是累加器。汇编格式机器码操作机器周期振荡周期字节ADDA,Rn00101rrrA←(A)+(Rn)1121ADDA,direct00100101directA←(A)+(direct)1122ADDA,@Ri0010011iA←(A)+((Ri))1121ADDA,#data00100100dataA←(A)+data11223.4算术运算类指令与加法相关的标志位 C:加法运算中,最高位第7位有进位,进位位C=1,否则C=0。

AC:加法运算中,如果低半字节向高半字节有进 位,AC=1,否则AC=0。

OV:带符号位数相加,要考虑溢出位OV。如果OV=1,表示运算产生溢出。判断准则:OV=(D7进位位)⊕(D6进位位)例1、A=AEH,R1=81H,执行ADDA,R110101110

+C10000001100101111结果: (A)=2FH (C)=1 (AC)=0 (P)=1

(OV)=13.4算术运算类指令把A,R1内容当作补码理解,正数的补码是它本身,负数的补码是取反加1。3.4算术运算类指令关于OV位总结:实际上决定两个相加数是带符号还是不带符号是由用户来确定的,而不是由电脑确定的。如果是无符号数运算,不考虑溢出标志。如果带符号运算需考察OV位,判断是否产生溢出。OV取决于带符号位运算时D6和D7的进位情况,如果D6和D7有一个产生进位,另一个不产生进位,OV等于1。OV=(D6进位位)⊕(D7进位位)例2:A=-24,R0=-27,执行ADDA,R1。 -24=10011000B,-27=10011011B(A)补=11101000B,(R0)补=11100101B11101000

+C11100101111001101

恢复原码等于10110011B(-33H),等于-51。

OV=0表明是正确的结果!

3.4算术运算类指令3.4算术运算类指令2、带进位的加法利用ADDC指令可以进行多字节加法的运算!运算结果对PSW标志位的影响与ADD指令相同。说明:所加的进位标志CY的值是在该指令执行之前已经存在的进位标志值,而不是执行该指令过程中产生的进位标志值。汇编格式机器码操作机器周期振荡周期字节ADDCA,Rn00111rrrA←(A)+(Rn)+(Cy)1121ADDCA,direct00110101directA←(A)+(direct)+(Cy)1122ADDCA,@Ri0011011iA←(A)+((Ri))+(Cy)1121ADDCA,#data00110100dataA←(A)+data+(Cy)11223.4算术运算类指令3、减法指令减法指令只有带借位的减法,没有不带借位的减法。C被称为借位位,C=1,表示有借位;C=0,表示没有借位。汇编格式机器码操作机器周期振荡周期字节SUBBA,Rn10011rrrA←(A)-(Rn)-(Cy)1121SUBBA,direct10010101directA←(A)-(direct)-(Cy)1122SUBBA,@Ri1001011iA←(A)-((Ri))-(Cy)1121SUBBA,#data10010100dataA←(A)-data-(Cy)1122OV位情况:OV=1:带符号的数相减时,如果一个正数减去一个负数结果为负,或者一个负数减去一个正数结果为正数,出现错误情况,实际上产生溢出。溢出标志由运算时第6位和第7位的借位位的“异或”计算得到。如果第六位向第七位有借位位,第七位向高位没有借位位,OV=1;第6位没有借位,而第7位向高位有借位,OV=1。3.4算术运算类指令例1.A=C9H,R3=54H,C=1,执行SUBBA,R3。 11001001

-00000001 11001000

-0101010001110100结果:A=74H;C=0;AC=0;OV=1;P=0。注意:如果运算不需要C参与,要对C进行清0处理!

注意:减法在计算机中实际上变成补码相加。3.4算术运算类指令例2.被减数存放在20H和21H,减数存在30H和31H,差存放在40H和41H。SUB:MOVA,20H;取低字节到A

CLRC;清借位位SUBBA,30H;低字节相减MOV40H,A;把减的结果送到40HMOVA,21H;取高字节

SUBBA,31H;高字节相减,减CMOV41H,A;把高字节相减结果缓存3.4算术运算类指令3.4算术运算类指令4、加1指令INC@Ri:Ri寄存器所指向的地址单元的内容加1。除INCA,导致P发生变化外,其他指令不会影响到PSW的标志位。INC指令主要应用于寄存器间接寻址,用来改变操作数的地址。汇编格式机器码操作机器周期振荡周期字节INCA00000100/A←(A)+11121INCRn00001rrrRn←(Rn)+11121INCdirect00000101directdirect←(direct)+11122INC@Ri0000011i(Ri)←((Ri))+11121INCDPTR10100011DPTR←(DPTR)+122413.4算术运算类指令5、减1指令减一指令中没有DECDPTR,与加一指令是有区别。汇编格式机器码操作机器周期振荡周期字节DECA00010100/A←(A)-11121DECRn00011rrrRn←(Rn)-11121DECdirect00010101directdirect←(direct)-11122DEC@Ri0001011i(Ri)←((Ri))-111213.4算术运算类指令6、乘除法八位无符号数乘法,乘积的低8位放在A中,高8位放在B中。如果乘积大于FFH,OV被置1,表示乘积大于FFH。乘法运算会将C硬件清0。在编程的时候,一定要注意C的变化。

汇编格式机器码操作机器周期振荡周期字节MULAB10100100BA←(A)×(B)44813.4算术运算类指令累加器A除以B寄存器的内容,把商送到累加器A,把余数存放在B寄存器。如果除数为0,OV被置1,表示除法没有意义。否则OV被清0。除法运算将C清零。汇编格式机器码操作机器周期振荡周期字节DIVAB100001004481B(余数)(B)A(商)(A)7、十进制调整指令DAA功能:对A中刚进行的两个BCD码的加法结果自动进行修正。该指令只影响进位标志CY。BCD码加法:如果两个BCD码数相加,结果也是BCD码。在单片机中没有专门的BCD码加法指令,要进行BCD码加法运算,同样要使用加法指令ADD或ADDC。3.4算术运算类指令单片机在执行ADD或ADDC指令时,是按照二进制规则进行,对于4位二进制数是按逢16进位。而BCD码是逢十进位,二者存在进位差,中间差了6。因此单纯用ADD或ADDC指令进行BCD码相加时,会出现错误。例:3+5=8;//和小于10,满足BCD码5+7=13;//和大于10,出现错误,需要调整

8+9=17;//和大于16,出现错误,需要调整3.4算术运算类指令3.4算术运算类指令DA指令定义[10,15][16,18]例3-14实现95+59的BCD码加法,并将结果存入30H、31H单元。MOVA,#95H;95的BCD码数送A中ADDA,#59H;两个BCD码相加,结果在A中

DAA;对相加结果进行十进制调整;执行DAA指令结果:A=54H,CY=1MOV30H,A;十位个位的BCD码之和送30HMOVA,#00H;A清0ADDCA,#00H;加进位(百位的BCD码)

DAA;BCD码相加后,用调整指令MOV31H,A;存进位;最终结果:(31H)=01H,(30H)=54H3.4算术运算类指令注意:DAA指令只能紧跟在加法指令后面。在51单片机中,遇到十进制调整情况,中间结果的修正是由硬件自动进行,用户不用考虑加6,只要在加法指令后紧跟一条“DAA”指令既可。若要进行BCD码减法运算,也应该进行调整,但不存在十进制减法调整指令,因此可将减法改为加法,加减数的补数。可参加书上例3-15。3.4算术运算类指令3.5逻辑运算及移位类指令1、逻辑与2、逻辑或3、逻辑异或4、累加器清零、取反5、循环移位3.5逻辑运算及移位类指令1、逻辑与前四条指令是将累加器A的内容和操作数所指的内容按位进行逻辑“与”,结果存放在A中。后两条指令是将直接地址单元中的内容和操作数所指的内容按位进行逻辑“与”,结果存入直接地址单元中。若直接地址正好是I/O端口,则为“读——改——写”操作。如ANLP1,A。逻辑与可用于将某些位屏蔽,将要屏蔽的位和“0”相与,保留不变的位同“1”相与。汇编格式机器码操作机器周期振荡周期字节ANLA,Rn01011rrrA←(A)∧(Rn)1121ANLA,direct01010101directA←(A)∧(direct)1122ANLA,@Ri0101011iA←(A)∧(Ri)1121ANLA,#data01010100dataA←(A)∧data1122ANLdirect,A01010010directdirect←(direct)∧(A)1122ANLdirect,#data01010011directdatadirect←(direct)∧data22433.5逻辑运算及移位类指令2、逻辑或功能:将两个指定的操作数按位进行逻辑“或”。前四条指令的操作结果存放在累加器A中,后两条指令的操作结果存放在直接地址单元中。逻辑或可将某些位置位,将要置位的位和“1”相或,要保留不变的位同“0”相或。汇编格式机器码操作机器周期振荡周期字节ORLA,Rn01001rrrA←(A)∨(Rn)1121ORLA,direct01000101directA←(A)∨(direct)1122ORLA,@Ri0100011iA←(A)∨((Ri))1121ORLA,#data01000100dataA←(A)∨data1122ORLdirect,A01000010directdirect←(direct)∨(A)1122ORLdirect,#data01000011directdatadirect←(direct)∨data2243例3-16:将累加器A的低4位送到P1口的低4位输出,而P1的高4位保持不变。 解:这种操作不能简单地用MOV指令实现,可以借助与、或逻辑运算。

编程如下:ANLA,#0FH;屏蔽A高4位ANLP1,#0F0H;屏蔽P1的低4位 ORLP1,A;通过或运算,完成操作3.5逻辑运算及移位类指令3、逻辑异或将两个指定的操作数按位进行“异或”,前四条指令的结果存放在累加器A中,后两条指令的操作结果存放在直接地址单元中应用:用于将某些位取反,将需求反的位同“1”相异或,要保留的位同“0”相异或。3.5逻辑运算及移位类指令汇编格式机器码操作机器周期振荡周期字节XRLA,Rn01101rrr1121XRLA,direct01100101direct1122XRLA,@Ri0110011i1121XRLA,#data01100100data1122XRLdirect,A01100010direct1122XRLdirect,#data01100011directdata2243A←(A)(Rn)A←(A)(direct)A←(A)(Ri)A←(A)datadirect←(direct)(A)direct←(direct)data4、累加器清零、取反清零和取反指令只针对累加器A,单字节。只有对A的取反指令,没有求补指令。若要进行求补操作,可按“求反加1”来进行。以上所有的逻辑运算指令,对CY、AC和OV标志都没有影响,只在涉及到累加器A时,才会影响奇偶标志P。3.5逻辑运算及移位类指令汇编格式机器码操作机器周期振荡周期字节CLRA11100100A←01121CPLA111101001121A←(A)5、循环移位3.5逻辑运算及移位类指令例3-18设(A)=08H,分析下面程序执行结果:

(1)RLA;A的内容左移一位,结果(A)=10H

RLA;A的内容左移一位,结果(A)=20H

RLA;A的内容左移一位,结果(A)=40H

即左移一位,相当于原数乘2(原数小于80H时)。

(2)RRA;A的内容右移一位,结果(A)=04H

RRA;A的内容右移一位,结果(A)=02H

RRA;A的内容右移一位,结果(A)=01H

即右移一位,相当于原数除2(原数为偶数时)。3.5逻辑运算及移位类指令3.6控制转移类指令51系列单片机有比较丰富的控制转移指令,能改变PC的内容,使程序发生转移。具体分类: 1、无条件转移指令(4条) 2、条件转移指令(8条) 3、调用子程序和返回指令(4条) 4、空操作指令(1条)3.6控制转移类指令1、无条件转移指令有4条无条件转移指令,提供不同的转移范围和方式,可使程序无条件转到指令所提供的地址上。具体:汇编格式机器码操作机器周期振荡周期字节LJMPaddr1600000010a15~a8a7~a0PC←addr15~02243AJMPaddr11a10a9a800001a7~a0PC←(PC)+2PC10~0←addr10~0PC15~11不变2242SJMPrel10000000relPC←(PC)+2PC←(PC)+rel2242JMP@A+DPTR01110011/PC←(A)+(DPTR)22413.6控制转移类指令1)长转移指令把指令中给出的16位目的地址addr16送入程序计数器PC,使程序无条件转移到addr16处执行。16位地址可寻址64KBROM,可转向64K程序存储器地址空间的任何单元。长转移指令是由三字节指令组成:操作码、高8位地址、低8位地址。LJMPaddr1600000010a15~a8a7~a0PC←addr15~022433.6控制转移类指令2)绝对转移指令指令格式:包括2字节,具体为:a10a9a800001a7a6a5a4a3a2a1a0

a10~a8占据第一字节的高3位,a7~a0占满第二字节,而00001是这条指令特有的操作码,占据第一字节的低5位。操作数出现在操作码中。AJMPaddr11a10a9a800001a7~a0PC←(PC)+2PC10~0←addr10~0PC15~11不变2242程序执行过程:第一步取指令,PC自身加2指向下一条指令的起始地址(称为PC当前值)。第二步用指令中给出的11位地址替换PC当前值的低11位,PC高5位保持不变,构成新的PC值,实现转移,跳转到目的地址。3.6控制转移类指令绝对跳转的地址空间分布:低11位地址,范围为00000000000~11111111111,可转移的范围是2KB,相对于当前地址可以向前也可向后转移。注意:转移的目的位置与PC+2的地址必须在同一个2K段内。3.6控制转移类指令3.6控制转移类指令高5位地址,范围为00000~11111,共32,作为段地址。整个64K程序存储器空间可被分成32个段,每段包含2K地址范围。0000H~07FFH5800H~5FFFHB000H~B7FFH0800H~0FFFH6000H~67FFHB800H~BFFFH1000H~17FFH6800H~6FFFHC000H~C7FFH1800H~1FFFH7000H~77FFHC800H~CFFFH2000H~27FFH7800H~7FFFHD000H~D7FFH2800H~2FFFH8000H~87FFHD800H~DFFFH3000H~37FFH8800H~8FFFHE000H~E7FFH3800H~3FFFH9000H~97FFHE800H~EFFFH4000H~47FFH9800H~9FFFHF000H~F7FFH4800H~4FFFHA000H~A7FFHF800H~FFFFH5000H~57FFHA800H~AFFFH注意:相对当前地址,目标地址的段地址是不变的,执行绝对跳转指令能实现在同一个段地址内程序转移,也就是2K地址范围内。编程时要注意ROM的分配,必须保证紧接AJMP指令后面的那一条指令的第一字节,也就是所谓的PC当前地址,与转移目标地址在同一2K范围内。3.6控制转移类指令3.6控制转移类指令3)短转移指令无条件相对转移指令,双字节,相对寻址,rel是8位偏移量,范围为-128~+127。目的地址=(PC)+2+relSJMPrel10000000relPC←(PC)+2PC←(PC)+rel22423.6控制转移类指令4)变址寻址转移指令(散转指令/间接转移指令)将累加器A中的8位无符号数与基址寄存器DPTR中的16位地址相加,得到的和作为目的地址送入PC,实现转移。转移地址可以在程序运行中加以改变。将多分支转移指令表的首地址装入DPTR,对应每个分支的索引装入累加器A,根据A中内容动态选择转向哪一条分支,实现多分支转移的功能。JMP@A+DPTR01110011/PC←(A)+(DPTR)2241例3-20根据用户输入的键值,转入相应的键处理程序。假设累加器A中存有用户从键盘输入的键值0~3,键处理程序分别存放在KPRG0、KPRG1、KPRG2、KPRG3位置。3.6控制转移类指令具体程序:MOVDPTR,#JPTAB;转移指令表首地址送DPTRRLA;键值×2,AJMP指令占2个字节JMP@A+DPTR;JPTAB+2×键值,和送PC中,则程序转移到表中某一位置去执行AJMP指令JPTAB:AJMPKPRG0//0;响应的子程序的入口AJMPKPRG1//2AJMPKPRG2//4AJMPKPRG3//6KPRG0://子程序┇KPRG1:┇KPRG2:┇KPRG3:┇3.6控制转移类指令LJMP、AJMP、SJMP、JMP四条无条件转移指令的区别:转移范围和方式不同:LJMP转移范围是64KB,直接跳转;AJMP转移范围是2KB段内,通过改变地址低11位实现跳转;SJMP转移范围是当前PC(-128B~+127B,256B),相对寻址实现转移。JMP转移范围是64KB,通过变址寻址实现转移。使用AJMP和SJMP指令应注意转移目标地址是否在转移范围内,若超出范围,程序将出错。指令字节不同:LJMP是3字节指令;AJMP、SJMP是2字节指令;JMP是单字节指令。3.6控制转移类指令2、条件转移指令有条件限制,当满足某种条件时,才进行转移;不满足条件时,程序按顺序执行。具有共同特点:所有的条件转移指令都属于相对转移指令,转移范围相同,以PC当前值为基准的256B范围内(-128~+127)。计算转移地址的方法相同:转移地址=PC当前值+rel3.6控制转移类指令条件转移分类: 1)累加器判零转移指令 2)比较判断转移指令 3)减1条件转移指令3.6控制转移类指令1)累加器判零转移指令分别对累加器A的内容为零或不为零进行检测,当满足各自条件时,程序转向指定的目标地址;当不满足各自的条件时,程序顺序向下执行。目标地址:下一条指令第一个字节的地址+相对偏移量。3.6控制转移类指令汇编格式机器码操作机器周期振荡周期字节JZrel01100000relPC←(PC)+2若A=0,则2242PC←(PC)+rel若A≠0,顺序执行JNZrel01110000relPC←(PC)+2若A≠0,则2242PC←(PC)+rel若A=0,顺序执行3.6控制转移类指令2)比较判断转移指令汇编格式机器码操作机器周期振荡周期字节CJNEA,direct,rel10110101directrelPC←(PC)+3若(direct)<(A),则2243PC←(PC)+rel且Cy←0若(direct)>(A),则PC←(PC)+rel且Cy←1若(direct)=(A),则顺序执行,且Cy←0CJNEA,#data,rel10110100datarelPC←(PC)+3若data<(A),则2243PC←(PC)+rel且Cy←0若data>(A),则PC←(PC)+rel且Cy←1若data=(A),则顺序执行,且Cy←0CJNERn,#data,rel10111rrrdatarelPC←(PC)+3若data<(Rn),则2243PC←(PC)+rel且Cy←0若data>(Rn),则PC←(PC)+rel且Cy←1若data=(Rn),则顺序执行,且Cy←0CJNE@Ri,#data,rel1011011idatarelPC←(PC)+3若data<(Ri),则2243PC←(PC)+rel且Cy←0若data>(Ri),则PC←(PC)+rel且Cy←1若data=(Ri),则顺序执行,且Cy←03.6控制转移类指令比较判断转移指令的特点:三字节指令,因此PC当前值=PC+3;比较时实际上做的是减法操作,不保存差值,具体结果反映在C上;注意在大于和小于(不等于)的时候,都会实现跳转,跳转到目标地址位置后,如果要做进一步的操作,需要通过判断C是0还是1,可根据这个标志来做下一步的操作。参与比较的两个操作数当作无符号数看待;如果进行两个有符号数大小的比较,需要依据符号位、CY和OV来进行判决。3.6控制转移类指令3)减1条件转移指令减1条件转移指令通常在循环程序中作为计数器使用。赋初值后,每执行一次程序,计数器减1,直到为零结束循环。汇编格式机器码操作机器周期振荡周期字节DJNZRn,rel11011rrrrelPC←(PC)+2Rn←(Rn)-12242当(Rn)≠0,则PC←(PC)+rel当(Rn)=0,则结束循环,程序往下执行DJNZdirect,rel11010101directrelPC←(PC)+3direct←(direct)-12243当(direct)≠0,则PC←(PC)+rel当(direct)=0,则结束循环,程序往下执行3.6控制转移类指令3、调用子程序和返回指令汇编格式机器码操作机器周期振荡周期字节ACALLaddr11a10a9a810001addr7~0PC←(PC)+2SP←(SP)+12242(SP)←PC7~0SP←(SP)+1(SP)←PC15~8PC10~0←addr10~0PC15~11不变LCALLaddr1600010010addr15~8addr7~0PC←(PC)+3SP←(SP)+12243(SP)←PC7~0SP←(SP)+1(SP)←PC15~8PC10~0←addr15~0RET00100010/PC15~8←(SP)SP←(SP)-12241PC7~0←((SP))SP←(SP)-1RETI00110010/PC15~8←((SP))SP←(SP)-12241PC7~0←((SP))SP←(SP)-13.6控制转移类指令1)长调用指令长调用是16位目的地址,可以在整个64位的地址范围内进行调用。相对于LJMP,有压栈操作。汇编格式机器码操作机器周期振荡周期字节LCALLaddr1600010010addr15~8addr7~0PC←(PC)+3SP←(SP)+12243(SP)←PC7~0SP←(SP)+1(SP)←PC15~8PC10~0←addr15~03.6控制转移类指令2)绝对调用在使用ACALL时,单片机会根据具体指令会自动汇编成目标地址。只要保证调用子程序的入口地址与PC当前值在2K字节段范围内。相对于AJMP,ACALL有压栈操作。汇编格式机器码操作机器周期振荡周期字节ACALLaddr11a10a9a810001addr7~0PC←(PC)+2SP←(SP)+1(SP)←PC7~02242SP←(SP)+1(SP)←PC15~8PC10~0←addr10~0PC15~11不变3.6控制转移类指令3)调用返回指令子程序返回中断返回汇编格式机器码操作机器周期振荡周期字节RET00100010/PC15~8←((SP))SP←(SP)-12241PC7~0←((SP))SP←(SP)-1汇编格式机器码操作机器周期振荡周期字节RETI00110010/PC15~8←((SP))SP←(SP)-12241PC7~0←((SP))SP←(SP)-1前者是子程序的返回指令,后者是中断子程序的返回,二者完成的操作是一样的,通过返回指令弹出之前压栈的PC高八位和低八位。RET与RETI的区别:RETI返回中断断点,同时清除中断响应时被置位的优先级状态触发器。二者不能互换使用。在子程序或中断服务子程序中,PUSH和POP成对使用。3.6控制转移类指令3.6控制转移类指令4、空操作指令空操作常常用来产生一个机器周期的精确延时。汇编格式机器码操作机器周期振荡周期字节NOP00000000/PC←(PC)+111213.7位操作指令51单片机具有丰富的位操作功能,共17条指令.位操作指令以“可寻址位”为

温馨提示

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

评论

0/150

提交评论