51单片机指令集
*51指令不区分大小写
1个机器周期=12个时钟振荡周期
只有乘除两条指令的执行时间为4个机器周期
指令由两部分组成:操作码+操作数
指令系统的寻址方式
共7种寻址方式
-
寄存器寻址方式
MOV A,Rn;n=0~7 寄存器Rn的内容传送到累加器A
-
直接寻址方式
MOV A,40H 直接地址传送给累加器A
-
寄存器间接寻址方式
MOV R1,#40H
MOV A,@Ri 累加器传送到外部RAM
PUSH(压栈)和POP(出栈)
-
立即寻址方式
MOV A,#40H
MOV A,#0FFH
若立即数的首位为A~F,前面还要加零
-
基址寄存器加变址寄存器间址寻址方式
以DPTR或PC作基址寄存器,以累加器A作为变址寄存器。
MOVC A,@A+DPTR
MOVC A,@A+PC
JMP @A+DPTR
专门针对程序存储器的寻址方式
-
位寻址方式、
MOV C,bit
MOV C,40H 直接寻址位传送到进位位C
可寻址位4种表示方法
- 直接使用位地址。例如PSW.5的位地址为0D5H。
- 用位名称表示。例如PSW.5用F0表示该位。
- 单元地址加位数的表示方法。例如PSW.5可表示为(0D0H).5
- 特殊功能寄存器符号价位数的表示方法。例如PSW.5。
-
相对寻址方式
目的地址=源地址+2(相对转移指令字节数)+rel
指令系统分类
- 数据传送类(28条)
- 算术操作类(24条)
- 逻辑运算类(25条)
- 控制转移类(17条)
- 位操作类(17条)
指令中符号的意义:
Rn 当前寄存器区的8个工作寄存器R0~R7。
Ri 当前选中的寄存器区中可作间接寻址寄存器的2个寄存器R0、R1。
Direct 直接地址,即8位的内部数据存储器单元或特殊功能寄存器的地址。
#data 包含在指令中的8位立即数。
#data16 包含在指令中的16位立即数。
rel 相对转移指令中的偏移量,为8位的带符号补码数。
DPTR 数据指针,可用作16位的数据地址寄存器。
bit 内部RAM或特殊功能寄存器中的直接寻址位。
C(或Cy) 进位标志位或位处理机中的累加器。
addr11 11位目的地址
addr16 16位目的地址
@ 间接寻址寄存器前缀
(X)X中的内容
((X))由X寻址的单元中的内容
数据传送类指令
MOV <目的操作数>,<源操作数>
1. 以累加器为目的操作数的指令
MOV A,Rn
MOV A,@Ri
MOV A,direct
MOV A,#data
2. 以Rn为目的操作数的指令
MOV Rn,A
MOV Rn,direct
MOV Rn,#data
3. 以直接地址direct为目的操作数的指令
MOV direct,A
MOV direct,Rn
MOV direct1,direct2
MOV direct,@Ri
MOV direct,#data
4. 以寄存器间接地址为目的操作数的指令
MOV @Ri,A
MOV @Ri,direct
MOV @Ri,#data
5. 16位传送指令
MOV DPTR,#data16
DPH:指向高八位
DPL:指向低八位
6.堆栈操作指令
进栈指令
PUSH direct
出栈指令
POP direct
----先进后出!!!
7. 累加器A与外部数据存储器传送指令
MOVX A,@DPTR
MOVX A,@Ri
MOVX @DPTR,A
MOVX @Ri,A
8.查表指令
MOVC A,@A+PC PC中的内容是将要执行的下一条指令的地址
MOVC A,@A+DPTR
9. 字节交换指令
XCH A,Rn
XCH A,direct
XCH A,@Ri
10. 半字节交换指令
XCHD A,@Ri 累加器的低4位与内部RAM低四位交换
算数操作类指令
1. 加法指令
ADD A,Rn
ADD A,direct
ADD A,@Ri
ADD A,#data
结果总是放在累加器ACC中
位7有进位Cy=1,否则置零
位3有进位Ac=0,否则置零
位6和位7有且只有一个进位OV=0,否则置零
A中结果1的位数为奇数个,奇偶校验位P=1,否则置零
2. 带进位加法指令
ADDC A,R0
ADDC A,direct
ADDC A,@Ri
ADDC A,#data
3. 加1指令
INC A
INC Rn
INC direct
INC @Ri
INC DPTR
不影响PSW中的任何标志(Cy,Ac,OV)!
4. 十进制调整指令
用于对BCD码十进制数加法运算结果的内容修正
两个压缩BCD码按二进制相加之后,必须经本指令的调整才能得到正确的和数(仍为压缩BCD码表示)。
DA A
应用背景
①执行前一般有一条加法指令。
②加法指令中的两个家属,应该是用压缩BCD码表示的十进制数,和存放在A中。
③执行完DA指令后,A中存放的数是两个加法指令的十进制和,也使用压缩BCD码表示。
5. 带借位的减法指令
SUBB A,Rn
SUBB A,direct
SUBB A,@Ri
SUBB A,#data
位7有借位Cy=1,否则置零
位3有借位Ac=0,否则置零
位6和位7有且只有一个借位OV=0,否则置零
6. 减1指令
DEC A
DEC Rn
DEC direct
DEC @Ri
7. 乘法指令
MUL AB A×B→BA
如果积大于255,则。如果OV为1,需读B。
8. 除法指令
DIV AB A/B→A(商),余数→B
如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。
逻辑运算指令
1.简单逻辑操作指令
CLR A 功能是对累加器A清“0”
CPL A 功能是将累加器A的内容按位逻辑取反
不影响PSW中的任何标志(Cy,Ac,OV)!
2. 左环移指令
RL A 功能室累加器A的8位向左循环移位,位7循环移入位0,不影响标志。
3. 带进位左环移指令
RLC A 功能室将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy进入Acc.0,不影响其它标志。
4. 右环移指令
RR A
5. 带进位右环移指令
RRC A
6. 累加器半字节交换指令
SWAP A 将累加器A的高半字节(Acc.7Acc.4)和低半字节(Acc.3Acc.0)互换。
7.逻辑与指令
ANL A,Rn
ANL A,direct
ANL A,#data
ANL A,@Ri
ANL direct,A
ANL direct,#data
8.逻辑或指令
ORL A,Rn
ORL A,direct
ORL A,#data
ORL A,@Ri
ORL direct,A
ORL direct,#data
9. 逻辑异或指令
XRL A,Rn
XRL A,direct
XRL A,#data
XRL A,@Ri
XRL direct,A
XRL direct,#data
不同为1相同为0
控制转移类指令
1. 无条件转移指令
AJMP addr11
2. 长跳转指令
LJMP addr16 addr16→可用程序的标号来代替
3.相对转移指令
SJMP rel 处于当前PC值的-128字节——+127字节字节之内
4.间接跳转指令
JMP @A+DPTR
5. 条件转移指令
JZ rel 如果累加器为"0",则转移
JNZ rel 如果累加器非"0",则转移
6. 比较不相等转移指令
CJNE A,direct,rel
CJNE A,#data,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
如果第一操作数(无符号整数)小于第二操作数(无符号整数),则进位标志位Cy置"1",否则置"0"
7. 减1不为0转移指令
DJNZ Rn,rel
DJNZ direct,rel
8. 调用子程序指令
(1) 短调用指令
ACALL addr11
(2) 长调用指令
LCALL addr11
该指令执行时,MCS51执行如下操作:
(1)当前PCL、PCH进栈
(2)addr 16送入PC
9. 子程序的返回指令
RET
10. 中断返回指令
RET1
11. 空操作指令
NOP
位操作指令
1. 数据位传送指令
MOV C,bit
MOV bit,C
2. 位变量修改指令
CLR C 清零
CLR bit
CPL C 求反
CPL bit
SETB C 置1
SETB bit
3. 位变量逻辑与指令
ANL C,bit
ANL C,/bit
4. 位变量逻辑或指令
ORL C,bit
ORL C,/bit
5. 条件转移类指令
JC rel Cy位
JNC rel
JB bit,rel 直接寻址位
JNB bit,rel
JBC bit,rel 直接寻址位=1则转移,并清0直接寻址位
问答
- 如何对SFR中的内容进行读写
直接寻址方式访问。MOV A,80H或者MOV A,P0
- 如何对52系列单片机的高128字节RAM进行读写?
间接寻址方式访问。
MOV R0,#80H
MOV A,@R0
- 如何读出片外数据存储器字节地址为2000H中的内容?
MOV DPTR,#2000H
MOVX A,@DPTR