单片机系统指令

单片机系统指令

中文名 单片机系统指令
包括 单字节指令
解释 MCS-51共111条指令
目录导航

处理指令

MCS-51共111条指令,

指令分类

1、按指令所占的字节来分:

(1)单字节指令(49条) 如MOV A,R2,(机器码11101010)

(2)双字节指令(46条) 如MOV A,#0BH,(机器码74H,

0BH)

(3)三字节指令(16条) 如MOV 0BH, #0BH ,(机器码75H,

0BH,0BH)

2、按指令的执行时间来分:(1个机器周期为12个时钟周期)

(1) 1个机器周期(64条) ,如MOV A,R2 MOV A,#0BH,

(2) 2个机器周期(45条) ,如MOV 0BH, #0BH

(3) 4个机器周期(2条) ,乘、除指令。

指令格式

一、按操作码和操作数分

1、操作码:用来规定指令进行什么操作

如MOV A,#0BH,(机器码74H,0BH)

其中74H为操作码,指明“将立即数送入ACC”这种操作;

2、操作数:则是指令操作的对象,有可能是数据,也可能是地址

如MOV A,#0BH,其中#0BH为操作数。

有单字节指令、双字节指令、三字节不同长度的指令,格式不同: (1)单字节指令:操作码、操作数同在一个字节中。

(2)双字节指令:操作码+操作数。

(3)三字节指令:操作码+操作数+操作数。

mcs-51指令小结mcs-51指令小结(5)二、按助记符和操作数分

操作助记符[目的操作数,源操作数]

如MOV A,#0BH,(机器码74H,0BH),其中:

(1)MOV为操作助记符, 指明“内部数据传送”这种操作;

(2)A为目的操作数,指明“数据传送的目的寄存器”是A;

(3) #0BH为源操作数。

寻址方式

访问指令

一、操作数在寄存器中;

如MOV A,Rn ;(Rn)→A,n=0~7

1、4组工作寄存区,共32个工作寄存器。

2、部分特殊功能寄存器,例如A、B 及DPTR等。

二、访问片外数据存储器

(1)用R0或R1作为间址寄存器,寻址范围为片外低256个字节;

(2)用DPTR作为间址寄存器,寻址范围为片外64K。

a) MOVX A,@Ri ;i=0或1

若(Ri)=70H,把外部RAM中70H单元的内容送到A

b) MOVX A,@DPTR

若(DPTR)=2000H,把外部RAM中2000H单元的内容送到A

3、堆栈操作指令访问堆栈区

堆栈专用操作指令PUSH(压栈)和POP(出栈)使用堆栈

指针(SP)作间址寄存器

指令PUSH(压栈)和POP(出栈),无前缀标志“@”

四、立即(数)寻址方式

操作数在指令中直接给出,需在操作数前面加前缀标志“#”。

如MOV A,#40H,此时立即数在程序存储单元中。

五、基址寄存器加变址寄存器间址寻址方式

1、以DPTR或PC作基址寄存器,以累加器A作为变址寄存器;

2、基址寄存器+变址寄存器形成操作数地址;

3、本寻址方式专门针对程序存储器,寻址范围可达到64KB。

4、本寻址方式的指令只有3条:

MOVC A,@A+DPTR

MOVC A,@A+PC

JMP @A+DPTR

前2条又称查表指令,将程序存储器单元内容给ACC;

后1条为散转指令,属于转移类指令。

(注)

(1)本寻址方式是专门针对程序存储器的寻址方式,寻址范围可达到64KB。

(2)本寻址方式的指令只有3条:

MOVC A,@A+DPTR

MOVC A,@A+PC

JMP @A+DPTR

六、位寻址方式

89C51有位处理功能,可以对数据位进行操作,

如MOV C,40H是把位40H的值送到进位位C。

寻址范围:

1、内部RAM中的位寻址区(20H—2FH),有2种表示方法。

(1) 直接给出位地址,如MOV C,40H;

(2)单元地址加位数,如MOV C,(28H).0,指的是28H单元中的最低位。

2、SFR中的可寻址位(70H—FFH,共83位),有4种表示方法。

(1) 直接给出位地址,如MOV C,0D5H(PSW.5的位地址);

(2) 直接写位名称,如MOV C,F0;

(3)单元地址加位数,如MOV C, (0D0H).5;

(4) SFR符号加位数,如MOV C, PSW.5。

七、相对寻址方式

在相对寻址的转移指令中,给出了地址偏移量“rel”,即

把PC的当前值+ rel 就构成了程序转移的目的地址。即

目的地址=转移指令所在的地址+ 转移指令的字节数+ rel

偏移量rel是带符号的8位二进制补码数,范围是:–128 ~ +127 ;

注意:PC的当前值是紧接在转移指令后的下一条指令的PC值。

分类介绍

指令中符号意义:

DPTR数据指针,可用作16位的数据地址寄存器。

bit内部RAM或特殊功能寄存器中的直接寻址位。

C(或Cy)进位标志位或位处理机中的累加器。

addr11 11位目的地址

addr16 16位目的地址

@间接寻址寄存器前缀,如@Ri,@A+DPTR

(X)X中的内容。

((X))由X寻址的单元中的内容。

→箭头右边的内容被箭头左边的内容所取代。

Rn 当前寄存器区的8个工作寄存器R0~R7(n=0~7)。

Ri 当前寄存器区中可作间接寻址寄存器的2个寄存器R0、R1

(i=0,1)。

Direct直接地址,即8位的内部RAM或特殊功能寄存器的字节

地址。

#data 包含在指令中的8位立即数。

#data16 包含在指令中的16位立即数。

rel相对转移指令中的偏移量,为8位的带符号补码数。

数据传送类

格式:MOV或MOVX或MOVC <目的操作数>,<源操作数>

将源操作数复制给目的操作数,源操作数不变,而不是“

搬家”。数据传送类指令不影响标志位Cy、Ac和OV,影响奇偶标志位P。

一、以累加器为目的操作数的指令

MOV A, Rn ; (Rn)→A,n=0~7

MOV A, @Ri ; ((Ri))→A,i=0,1

MOV A, direct ;(direct)→A

MOV A, #data ; #data→A

二、以Rn为目的操作数的指令

MOV Rn, A ; (A)→Rn, n=0~7

MOV Rn, direct ;(direct)→Rn, n=0~7

MOV Rn, #data ; #data→Rn, n=0~7

三、以直接地址direct为目的操作数的指令

MOV direct, A ; (A)→direct

MOV direct, Rn ;(Rn)→direct, n=0~7

MOV direct1, direct2;

MOV direct, @Ri ;((Ri))→direct

MOV direct, #data ; #data→direct

注意:寄存器之间不可相互传送数据;

直接地址之间可相互传送数据。

直接寻址方式(直接给出操作数的单元地址)

寻址范围:

1、内部RAM的128个单元(00-7FH)

2、特殊功能寄存器(80-FFH) ,注意SFR区单元除了以单元地址的形式外,还可用寄存器符号的形式给出,如:

MOV A,80H 与 MOV A,P0是等价的。

直接寻址方式是访问特殊功能寄存器的唯一寻址方式

四、以寄存器间接地址为目的操作数的指令

MOV @Ri, A ;(A)→((Ri)),i=0,1

MOV @Ri, direct ;(direct)→((Ri))

MOV @Ri, #data ; #data→((Ri))

五、16位数传送指令

MOV DPTR, #data16 ; #data16→DPTR

唯一的16位数据的传送指令,

立即数的高8位送入DPH,

立即数的低8位送入DPL。

六、堆栈操作指令

内部RAM中可以设定一个后进先出(LIFO-Last In First Out)的区域称作堆栈,堆栈指针SP始终指向堆栈的

栈顶位置。

1、进栈指令 PUSH direct

先将栈指针SP加1,然后把direct中的内容送到SP指示的内部RAM单元中

2、出栈指令 POP direct

SP指示的栈顶(内部RAM单元)内容送入direct字节单元

中,栈指针SP减1

七、累加器A与外部数据存储器传送指令

MOVX A, @DPTR ;((DPTR))→A,读外部RAM/IO

MOVX A, @Ri ;((Ri))→A,读外部RAM/IO

MOVX@DPTR, A ;(A)→((DPTR)),写外部RAM/IO

MOVX@Ri, A ;(A)→((Ri)),写外部RAM/IO

功能:A与外部RAM存储器传送数据,RD*(P3.7)或WR*(P3.6)信号有效。

1、采用DPTR间接寻址时,高8位地址(DPH)由P2口输出,低8位地址(DPL)由P0口输出。

2、采用Ri(i=0,1)间接寻址时,可寻址片外256个单元的数据存储器。Ri内容(地址)由P0口输出。

3、数据均由P0口输出。

八、查表指令

用于读程序存储器(内外)中的表格数据的指令,仅两条

,均采用基址寄存器加变址寄存器间接寻址方式。

1、MOVC A,@A+PC

(1) 以PC作为基址寄存器,A为变址寄存器;

(2) 两寄存器的内容相加,得到一个16位的地址;

(3) 取出此地址中的数据,传送给ACC。

注意:PC中的内容为下一条指令的起始地址,PSEN信号有效(作用同RD*、WR*)。

2、MOVC A,@A+DPTR

(1) 以DPTR 作为基址寄存器,A为变址寄存器;

(2) 两寄存器的内容相加,得到一个16位的地址;

(3) 取出此地址中的数据,传送给ACC。

如 (DPTR)=8100H (A)=40H 执行指令

MOVC A, @A+DPTR

执行结果将程序存储器中8140H的内容送入A。

本指令的执行结果只和指针DPTR及累加器A的内容有关,

与该指令存放的地址及常数表格存放的地址无关,因此表格的

大小和位置可以在64K程序存储器中任意安排,一个表格可以

为各个程序块公用。

功能指令

一、字节交换指令

XCH A, Rn

若(A)=80H,(R7)=08H,执行后(A)=08H,(R7)=80H

XCH A, direct

若(A)=80H,(40H)=F0H,执行后(A)=F0H ,(40H)= 80H

XCH A, @Ri

若(A)=80H , (R0)=6AH, (6AH)=0FH ,

执行后(A)=0FH,(6AH)=80H

二、半字节交换指令

XCHD A, @Ri累加器的低4位与内部RAM低4位交换

三、累加器半字节交换指令

SWAP A

将累加器A的高半字节和低半字节互换。

四、算术运算指令

加、减、乘、除指令,都是针对8位二进制无符号数。执行

的结果对Cy、Ac、OV等标志位有影响,但增1和减1指令不影

响上述标志。

1、加法指令,目的操作数均为ACC。

ADD A, Rn ;(A)+(Rn)→A,n=0~7

ADD A, direct ;(A)+(direct)→A

ADD A, @Ri ;(A)+((Ri))→A,i=0,1

ADD A, #data ;(A)+#data→A

注意运算结果对各个标志位的影响:

(1)、如果位7有进位,则进位标志Cy置“1”,否则清0;

(2)、如果位3有进位,则辅助进位标志Ac置“1”,否则清0;

(3)、溢出标志位OV:

如果位6有进位,而位7没有进位;或者位7有进位,而位6 没有,则溢出标志位OV置“1”,否则清0。

OV状态,只有在带符号数加法运算时才有意义。

当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围。

2、带进位加法指令

标志位Cy参加运算,因此是三个数相加。共4条:

ADDC A, Rn ;(A)+(Rn)+C→A,n=0~7 ADDC A, direct ;(A)+(direct)+C→A

ADDC A, @Ri ;(A)+(Ri)+C→A,i=0,1

ADDC A, #data ;(A)+#data+C→A

3、增1(加1)指令(C语言的++ )

INC A

INC Rn ;n=0~7

INC direct

INC @Ri ;i=0,1

INC DPTR (除立即数以外)

(1)、不影响PSW中的任何标志(除了INC A 外)。

(2)、INC DPTR

该指令是16位数增1指令。指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作,不影响标志Cy的状态。

4、DA A,十进制调整指令

用于对BCD码加法运算结果的修正。

两个BCD码按二进制相加之后,必须经本指令的调整才能

得到正确的压缩BCD码的和数。

调整方法:十进制调整修正,即结果加6调整。具体为:

a)累加器低4位大于9或辅助进位位Ac=1,则进行低4位加6修正;

b)累加器高4位大于9或进位位Cy=1,则进行高4位加6修正;

c)累加器高4位大于9, 低4位大于9, 则高4位和低4位分别加6修正;是否加6是通过执行指令 DA A 来自动实现的。

5、带借位的减法指令(注意:减法只有带借位的)

SUBB A, Rn ;(A)-(Rn)- Cy→A,n=0~7

SUBB A, direct ; (A)-(direct)- Cy→A

SUBB A, @Ri ;(A)-((Ri))- Cy→A, i=0,1

SUBB A, #data ;(A)-#data - Cy→A

A的内容减去源操作数和进位标志Cy的值,结果存在A中。

1、如果位7需借位,则Cy置1,否则清0;

2、如果位3需借位,则Ac置1 ,否则清0;

3、如果位6需借位而位7不需要借位,或者位7需借位,位6

不需借位,则溢出标志位OV置1,否则清0。

6、减1指令(C语言的--)

DEC A ;(A)-1→A

DEC Rn ;(Rn)-1→Rn,n=0~7

DEC direct ;(direct)-1→direct

DEC @Ri ;((Ri))-1→(Ri),i=0,1

1、减1指令不影响标志位。

2、增1/加1指令有INC DPTR,减1无DEC DPTR指令。

7、乘法指令

MUL AB ;A×B→BA

1、积的高字节在B中,低字节在A中;

2、如果积大于255,则置“1”溢出标志位OV

8、除法指令

DIV AB ;A/B→A(商),余数→B

如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。

五、左环移指令RL A

累加器A的内容向左环移一位,Acc.7移入Acc.0 ,不影响标志。

六、带进位左环移指令RLC A

累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其它标志。

七、右环移指令RR A

累加器A的内容向右环移一位,Acc.0移入Acc.7,不影响标志。

八、带进位环移指令RRC A

累加器A的内容和进位标志Cy一起向右环移一位,Acc.0移入Cy,Cy移入Acc.7。不影响其它标志。

九、逻辑与指令

ANL A, Rn ; (A)∧(Rn)→A,n=0~7

ANL A, direct ; (A)∧(direct)→A

ANL A, #data ; (A)∧#data→A

ANL A, @Ri ; (A)∧((Ri))→A,i=0~1

ANL direct, A ; (direct)∧(A)→direct

ANL direct, #data ; (direct)∧#data→direct

十、逻辑或指令

ORL A, Rn ;(A) ∨(Rn)→A ,n=0~7

ORL A, direct ;(A) ∨(direct)→A

ORL A, #data ;(A) ∨data→A

ORL A, @Ri ;(A) ∨((Ri))→A,i=0,1

ORL direct, A ;(direct) ∨(A)→direct

ORL direct, #data ;(direct) ∨#data→direct

十一、逻辑异或指令

XRL A, Rn ;(A) ⊕(Rn)→A

XRL A, direct ;(A) ⊕(direct)→A

XRL A, @Ri ;(A) ⊕((Ri))→A ,i=0,1

XRL A, #data ;(A) ⊕#data→A

XRL direct, A ;(direct) ⊕(A)→direct

XRL direct, #data ;(direct) ⊕#data →direct

与1相与取反,与0相与不变。

控制转移类

一、无条件转移指令 AJMP addrll (2字节指令)

2K(地址211)字节范围内的无条件跳转指令。

64K程序存储器空间分为32个区,每区2K字节,转移的目标地址必须与AJMP下一条指令的地址高5位地址码A15-A11相同。

指令执行时,先PC加2,然后把addrll送入PC.10~PC.0,

PC.15~PC.11保持不变,程序转移到目标地址。

注意:转移目标首地址必须在AJMP指令下一条指令地址(PC+2)的2KB范围内。

二、长跳转指令 LJMP addr16 (3字节指令)

64K字节范围内的无条件跳转指令。

指令执行时,把指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向addr16指出的目标地址。

目标地址可以在64K程序存储器地址空间的任何位置。

注意:短跳转、长跳转指令中addrll、addr16直接写上要转向的目标地址标号(即符号地址)就可以。

三、相对转移指令 SJMP rel (双字节)

rel为8位带符号二进制补码数(-128~+127),实现程序的双向转移。

在编写程序时,直接写上要转向的目标地址标号就可以。

四、间接跳转(散转)指令JMP @A+DPTR (三字节)

由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址,A的内容作变址。

五、条件转移指令 (双字节)

JZ rel ; 如果累加器为“0”,则转移

JNZ rel; 如果累加器非“0”,则转移

六、比较不相等转移指令(3字节指令)

CJNE A, direct, rel

CJNE A, #data, rel

CJNE Rn, #data, rel

CJNE @Ri, #data, rel

1、比较前面两个操作数(无符号整数)的大小,如果不相等则

转移,若相等则顺序执行下一条指令。

2、如果第一操作数小于第二操作数, 则Cy标志位置1, 否则清0。

如常把CJNE 第一操作数, 第二操作数, $+3

和JNC rel或JC rel 写在一块来判别2个数的大小。

$:本条指令在程序存储单元的首地址;

$+3:CJNE指令的下一条指令,即JNC rel或JC rel

七、减1不为0转移指令

DJNZ Rn, rel ;n=0~7

DJNZ direct, rel

将源操作数内容减1,结果回送到Rn寄存器或direct中去。如果源操作数内容不为0则转移,为0则顺序执行下一条指令。

主要用于控制程序循环。

1、把寄存器Rn或内部RAM的direct单元用作程序循环计数器

2、以减1后是否为“0”作为转移条件,实现按次数控制循环

八、子程序调用、返回指令

1、短调用指令 ACALL addr11 (双字节)

2K范围内的子程序调用。

2、长调用指令 LCALL addr16 (三字节)

64K范围内的子程序调用。

执行本指令时:

(1)断点地址(调用指令的下一条指令的首地址PC+2或PC+3)

保护

(SP)+1→SP,然后PCL →(SP)

(SP)+1→SP,然后PCH →(SP)

(2)将子程序首地址送入PC,执行子程序

3、子程序返回指令 RET

断点地址恢复

(SP) →PCH,(SP) - 1→SP

(SP) →PCL ,(SP) - 1→SP

功能:从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值开始继续执行程序。不影响标志位。

4、中断返回指令RETI

与RET指令相似,不同之处在于断点地址恢复,清除中断响应时被置“1”的51内部中断优先级寄存器的优先级状态。

子程序是编程时就已确定的固定位置调用,而中断服务子程序是由中断系统控制在特定条件下随机调用的。

九、空操作指令 NOP,消耗1个机器周期的时间

位操作指令

一、数据位传送指令

MOV C,bit

MOV bit,C

如MOV C,06H ;(20H).6→Cy

06H是内部RAM 20H字节位6的位地址。

MOV P1.0,C ;Cy→P1.0

可寻址位的具体定义:从20H单元的第一位开始一直到2FH单元的最后一位分别为00H~7FH以及特殊功能寄存器中80H~F7H。

二、位变量修改指令

CLR C ;清“0”Cy

CLR bit ;清“0”bit位

CPL C ;Cy求反

CPL bit ;bit位求反

SETB C ;置“1” Cy

SETB bit ;置“1”bit位

三、位变量逻辑与指令

ANL C,bit ;bit ∧Cy →Cy

ANL C,/bit; ;/ bit ∧Cy →Cy

四、位变量逻辑或指令

ORL C,bit ;bit ∨ Cy →Cy

ORL C,/bit ;/ bit ∨ Cy →Cy

五、条件转移类指令

JC rel ;如果进位位Cy=1,则转移

JNC rel ;如果进位位Cy=0,则转移

JB bit,rel ;如果直接寻址位=1,则转移

JNB bit,rel ;如果直接寻址位=0,则转移

JBC bit,rel ;如果直接寻址位=1,则转移,并对bit位清0

相关百科
返回顶部
产品求购 求购