跳到主要内容

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),这些助记符被分为五个组。

数据传输算术运算逻辑运算布尔运算程序分支
MOVADDANLCLRLJMP
MOVCADDCORLSETBAJMP
MOVXSUBBXRLMOVSJMP
PUSHINCCLRJCJZ
POPDECCPLJNCJNZ
XCHMULRLJBCCJNE
XCHDDIVRLCNOPDJNZ
DA ARRJBCNOP
RRCANLLCALL
SWAPORLACALL
CPLRET
RETI
JMP

8051单片机指令集的指令类型

在了解指令类型之前,我们先来看一下8051单片机指令的结构。一条8051指令由操作码(Opcode,即操作代码)和大小为零字节、一字节或二字节的操作数(Operand)组成。

指令的操作码部分包含助记符(Mnemonic),它指定了要执行的操作类型。所有助记符或指令的操作码部分都是一个字节大小。

接下来是操作数部分,它定义了指令处理的数据。操作数可以是以下之一:

  • 无操作数
  • 数据值
  • I/O端口
  • 存储器位置
  • CPU寄存器

指令可以有多个操作数,其格式如下:

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

简单的指令只包含操作码。其他指令可能包括一个或多个操作数。指令可以是一字节指令(只包含操作码),也可以是二字节指令(第二字节是操作数),或者是三字节指令(操作数占据第二和第三字节)。

根据它们执行的操作,8051单片机指令集中的所有指令被分为五个组。它们是:

  1. 数据传输指令(Data Transfer Instructions)
  2. 算术运算指令(Arithmetic Instructions)
  3. 逻辑运算指令(Logical Instructions)
  4. 布尔运算或位操作指令(Boolean or Bit Manipulation Instructions)
  5. 程序分支指令(Program Branching Instructions)

接下来,我们将简要介绍这些指令。

数据传输指令

数据传输指令与寄存器之间、外部程序存储器或外部数据存储器之间的数据传输有关。与数据传输相关的助记符如下:

  • MOV:移动数据
  • MOVC:移动代码
  • MOVX:移动外部数据
  • PUSH:将数据推入堆栈
  • POP:从堆栈复制数据
  • XCH:交换两个寄存器之间的数据
  • XCHD:交换两个寄存器之间的低阶数据

下表列出了所有可能的数据传输指令,以及寻址模式、占用的大小和所需的机器周期数。

alt text

算术运算指令

使用算术运算指令,可以执行加法、减法、乘法和除法。算术运算指令还包括加1、减1以及一个特殊的指令,称为“十进制调整累加器”。

与8051单片机算术运算指令相关的助记符如下:

  • ADD:无进位加法
  • ADDC:带进位加法
  • SUBB:带借位减法
  • INC:加1
  • DEC:减1
  • MUL:乘法
  • DIV:除法
  • DA A:十进制调整累加器(A寄存器)

算术运算指令不关心数据格式,即有符号、无符号、ASCII、BCD等。此外,算术运算指令执行的操作会影响PSW寄存器中的标志,如进位、溢出、零等。

下表列出了所有可能的算术运算指令的助记符。

alt text

逻辑运算指令

逻辑运算指令的下一组指令执行逻辑运算,如与(AND)、或(OR)、异或(XOR)、非(NOT)、旋转、清零和交换。逻辑运算指令按位对数据字节进行操作。

与逻辑运算指令相关的助记符如下:

  • ANL:逻辑与
  • ORL:逻辑或
  • XRL:异或
  • CLR:清零寄存器
  • CPL:对寄存器取反
  • RL:将字节向左旋转
  • RLC:将字节和进位标志向左旋转
  • RR:将字节向右旋转
  • RRC:将字节和进位标志向右旋转
  • SWAP:交换字节中的高低位

下表列出了所有可能的逻辑运算指令的助记符。

alt text

布尔运算或位操作指令

顾名思义,布尔运算或位操作指令处理位变量。我们知道,RAM中有一个特殊的可位寻址区域,一些特殊功能寄存器(SFRs)也是可位寻址的。

与布尔运算或位操作指令对应的助记符如下:

  • CLR:清零位(重置为0)
  • SETB:设置位(设置为1)
  • MOV:移动位
  • JC:如果进位标志被设置,则跳转
  • JNC:如果进位标志未被设置,则跳转
  • JB:如果指定的位被设置,则跳转
  • JNB:如果指定的位未被设置,则跳转
  • JBC:如果指定的位被设置,则跳转并清除该位
  • ANL:按位与
  • ORL:按位或
  • CPL:对位取反

这些指令可以在位级别执行设置、清除、与、或、取反等操作。下表列出了所有可能的布尔运算指令的助记符。

alt text

程序分支指令

8051单片机指令集中的最后一组指令是程序分支指令。这些指令控制程序逻辑的流程。程序分支指令的助记符如下:

  • LJMP:长跳转(无条件)
  • AJMP:绝对跳转(无条件)
  • SJMP:短跳转(无条件)
  • JZ:如果A等于0,则跳转
  • JNZ:如果A不等于0,则跳转
  • CJNE:比较并跳转如果不相等
  • DJNZ:递减并跳转如果不为零
  • NOP:无操作
  • LCALL:长调用子程序
  • ACALL:绝对调用子程序(无条件)
  • RET:从子程序返回
  • RETI:从中断返回
  • JMP:跳转到地址(无条件)

除了NOP(无操作)指令外,所有这些指令都会以某种方式影响程序计数器(PC)。其中一些指令在将控制权转移到程序的其他部分之前具有决策能力。

下表列出了所有与程序分支指令相关的助记符。

alt text

8051单片机的寻址模式

什么是8051的寻址模式?

寻址模式是一种定位目标数据的方法,目标数据也被称为操作数(Operand)。8051单片机家族允许五种类型的寻址模式来定位操作数。它们是:

  1. 立即寻址(Immediate Addressing)
  2. 寄存器寻址(Register Addressing)
  3. 直接寻址(Direct Addressing)
  4. 寄存器间接寻址(Register-Indirect Addressing)
  5. 索引寻址(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)。

在索引寻址模式中,只能使用MOVCJMP指令。索引寻址模式在从查找表中检索数据时非常有用。

示例:

MOVC A, @A+DPTR

这里,操作数的地址是DPTR和累加器内容的和。

注意:一些作者和教科书还增加了其他寻址模式,如绝对寻址模式(Absolute Addressing Mode)、相对寻址模式(Relative Addressing Mode)和长寻址模式(Long Addressing Mode)。

在本教程中,我们介绍了8051单片机的指令集、8051单片机的寻址模式以及8051单片机指令集中不同类型的指令。