1.5 8051微控制 器指令集
为任何微控制器编写程序包括以特定的顺序向微控制器发出命令,这些命令必须按顺序执行以完成特定任务。这些向微控制器发出的命令被称为微控制器的指令集(Instruction Set)。
正如我们的句子由单词组成一样,微控制器的程序(事实上,任何计算机的程序)由指令组成。程序中的指令告诉微控制器要执行哪些操作。
指令集对于计算机家族来说是独一无二的。本教程介绍了8051单片机的指令集,也被称为MCS-51指令集。
由于8051单片机家族是8位处理器,8051单片机的指令集针对8位控制应用进行了优化。作为一个典型的8位处理器,8051单片机的指令具有8位操作码(Opcode)。因此,8051指令集最多可以有(2^8 = 256)条指令。
8051单片机指令集和指令分组
在深入探讨8051指令集的细节、指令类型和寻址模式之前,让我们先简要了解一下8051指令集(MCS-51指令集)的指令和指令分组。
下表展示了8051指令组和每个组中的指令。8051单片机指令集中有49条指令助记符(Mnemonic),这些助记符被分为五个组。
数据传输 | 算术运算 | 逻辑运算 | 布尔运算 | 程序分支 |
---|---|---|---|---|
MOV | ADD | ANL | CLR | LJMP |
MOVC | ADDC | ORL | SETB | AJMP |
MOVX | SUBB | XRL | MOV | SJMP |
PUSH | INC | CLR | JC | JZ |
POP | DEC | CPL | JNC | JNZ |
XCH | MUL | RL | JBC | CJNE |
XCHD | DIV | RLC | NOP | DJNZ |
DA A | RR | JBC | NOP | |
RRC | ANL | LCALL | ||
SWAP | ORL | ACALL | ||
CPL | RET | |||
RETI | ||||
JMP |
8051单片机指令集的指令类型
在了解指令类型之前,我们先来看一下8051单片机指令的结构。一条8051指令由操作码(Opcode,即操作代码)和大小为零字节、一字节或二字节的操作数(Operand)组成。
指令的操作码部分包含助记符(Mnemonic),它指定了要执行的操作类型。所有助记符或指令的操作码部分都是一个字节大小。
接下来是操作数部分,它定义了指令处理的数据。操作数可以是以下之一:
- 无操作数
- 数据值
- I/O端口
- 存储器位置
- CPU寄存器
指令可以有多个操作数,其格式如下:
简单的指令只包含操作码。其他指令可能包括一个或多个操作数。指令可以是一字节指令(只包含操作码),也可以是二字节指令(第二字节是操作数),或者是三字节指令(操作数占据第二和第三字节)。
根据它们执行的操作,8051单片机指令集中的所有指令被分为五个组。它们是:
- 数据传输指令(Data Transfer Instructions)
- 算术运算指令(Arithmetic Instructions)
- 逻辑运算指令(Logical Instructions)
- 布尔运算或位操作指令(Boolean or Bit Manipulation Instructions)
- 程序分支指令(Program Branching Instructions)
接下来,我们将简要介绍这些指令。
数据传输指令
数据传输指令与寄存器之间、外部程序存储器或外部数据存储器之间的数据传输有关。与数据传输相关的助记符如下:
- MOV:移动数据
- MOVC:移动代码
- MOVX:移动外部数据
- PUSH:将数据推入堆栈
- POP:从堆栈复制数据
- XCH:交换两个寄存器之间的数据
- XCHD:交换两个寄存器之间的低阶数据
下表列出了所有可能的数据传输指令,以及寻址模式、占用的大小和所需的机器周期数。

算术运算指令
使用算术运算指令,可以执行加法、减法、乘法和除法。算术运算指令还包括加1、减1以及一个特殊的指令,称为“十进制调整累加器”。
与8051单片机算术运算指令相关的助记符如下:
- ADD:无进位加法
- ADDC:带进位加法
- SUBB:带借位减法
- INC:加1
- DEC:减1
- MUL:乘法
- DIV:除法
- DA A:十进制调整累加器(A寄存器)
算术运算指令不关心数据格式,即有符号、无符号、ASCII、BCD等。此外,算术运算指令执行的操作会影响PSW寄存器中的标志,如进位、溢出、零等。
下表列出了所有可能的算术运算指令的助记符。

逻辑运算指令
逻辑运算指令的下一组指令执行逻辑运算,如与(AND)、或(OR)、异或(XOR)、非(NOT)、旋转、清零和交换。逻辑运算指令按位对数据字节进行操作。
与逻辑运算指令相关的助记符如下:
- ANL:逻辑与
- ORL:逻辑或
- XRL:异或
- CLR:清零寄存器
- CPL:对寄存器取反
- RL:将字节向左旋转
- RLC:将字节和进位标志向左旋转
- RR:将字节向右旋转
- RRC:将字节和进位标志向右旋转
- SWAP:交换字节中的高低位
下表列出了所有可能的逻辑运算指令的助记符。

布尔运算或位操作指令
顾名思义,布尔运算或位操作指令处理位变量。我们知道,RAM中有一个特殊的可位寻址区域,一些特殊功能寄存器(SFRs)也是可位寻址的。
与布尔运算或位操作指令对应的助记符如下:
- CLR:清零位(重置为0)
- SETB:设置位(设置为1)
- MOV:移动位
- JC:如 果进位标志被设置,则跳转
- JNC:如果进位标志未被设置,则跳转
- JB:如果指定的位被设置,则跳转
- JNB:如果指定的位未被设置,则跳转
- JBC:如果指定的位被设置,则跳转并清除该位
- ANL:按位与
- ORL:按位或
- CPL:对位取反
这些指令可以在位级别执行设置、清除、与、或、取反等操作。下表列出了所有可能的布尔运算指令的助记符。

程序分支指令
8051单片机指令集中的最后一组指令是程序分支指令。这些指令控制程序逻辑的流程。程序分支指令的助记符如下:
- LJMP:长跳转(无条件)
- AJMP:绝对跳转(无条件)
- SJMP:短跳转(无条件)
- JZ:如果A等于0,则跳转
- JNZ:如果A不等于0,则跳转
- CJNE:比较并跳转如果不相等
- DJNZ:递减并跳转如果不为零
- NOP:无操作
- LCALL:长调用子程序
- ACALL:绝对调用子程序(无条件)
- RET:从子程序返回
- RETI:从中断返回
- JMP:跳转到地址(无条件)
除了NOP(无操作)指令外,所有这些指令都会以某种方式影响程序计数器(PC)。其中一些指令在将控制权转移到程序的其他部分之前具有决策能力。
下表列出了所有与程序分支指令相关的助记符。

8051单片机的寻址模式
什么是8051的寻址模式?
寻址模式是一种定位目标数据的方法,目标数据也被称为操作数(Operand)。8051单片机家族允许五种类型的寻址模式来定位操作数。它们是:
- 立即寻址(Immediate Addressing)
- 寄存器寻址(Register Addressing)
- 直接寻址(Direct Addressing)
- 寄存器间接寻址(Register-Indirect Addressing)
- 索引寻址(Indexed Addressing)
立即寻址(Immediate Addressing)
在立即寻址模式中,操作码(Opcode)之后的操作数是一个8位或16位的常量数据。这种寻址模式被称为“立即寻址”,是因为要存储的常量数据直接跟在操作码之后。
要存储的常量值直接在指令中指定,而不是从寄存器中获取。目标寄存器必须与指令中提到的操作数大小相同。
示例:
MOV A, #030H
这里,累加器(Accumulator)被加载了30H(十六进制)。操作数中的#
表示这是一个数据,而不是寄存器的地址。
立即寻址非常快,因为要加载的数据直接包含在指令中。
寄存器寻址(Register Addressing)
在8051单片机的存储器组织中,我们已经看到了RAM的组织方式以及四个工作寄存器组,每个组包含8个寄存器(R0-R7)。
在寄存器寻址模式中,指令中指定的寄存器(R0-R7)中的一个作为操作数。
选择合适的寄存器组非常重要,这可以通过程序状态字(PSW)寄存器来完成。假设选择了Bank0,以下是一个寄存器寻址的示例。
示例:
MOV A, R5
这里,Bank0中寄存器R5的内容(8位)被移动到累加器中。
直接寻址(Direct Addressing)
在直接寻址模式中,指令中指定的操作数是数据的地址。通过直接寻址模式,我们可以访问任何寄存器或片上变量。这包括通用RAM、特殊功能寄存器(SFRs)、I/O端口和控制寄存器。
示例:
MOV A, 47H
这里,RAM位置47H中的数据被移动到累加器中。
寄存器间接寻址(Register Indirect Addressing)
在间接寻址模式或寄存器间接寻址模式中,操作数的地址被指定为某个寄存器的内容。通过一个示例可以更清楚地说明这一点。
示例:
MOV A, @R1
@
符号表示寻址模式是间接的。假设R1的内容是56H,那么操作数位于内部RAM位置56H。如果RAM位置56H的内容是24H,那么24H被移动到累加器中。
在间接寻址模式中,只允许使用R0和R1。这些寄存器在间接寻址模式中被称为指针寄存器。
索引寻址(Indexed Addressing)
在索引寻址模式中,操作数的有效地址是基地址寄存器和偏移寄存器的和。基地址寄存器可以是数据指针(DPTR)或程序计数器(PC),而偏移寄存器是累加器(A)。
在索引寻址模式中,只能使用MOVC
和JMP
指令。索引寻址模式在从查找表中检索数据时非常有用。
示例:
MOVC A, @A+DPTR
这里,操作数的地址是DPTR和累加器内容的和。
注意:一些作者和教科书还增加了其他寻址模式,如绝对寻址模式(Absolute Addressing Mode)、相对寻址模式(Relative Addressing Mode)和长寻址模式(Long Addressing Mode)。
在本教程中,我们介绍了8051单片机的指令集、8051单片机的寻址模式以及8051单片机指令集中不同类型的指令。