为任何微控制器编写程序包括以特定顺序向微控制器发出命令,这些命令必须按特定顺序执行才能执行特定任务。微控制器的命令称为微控制器指令集。
正如一句话是由每个汉字组成的一样,微控制器(包括任何计算机)程序都是由指令组成的。写在程序中的指令告诉微控制器执行哪个操作。指令集是计算机系列独有的。在本文当中,小编简单介绍下8051微控制器指令集,或称为MCS-51指令集。
由于8051系列微控制器是8位处理器,因此8051微控制器指令集针对8位控制应用进行了优化。作为典型的8位处理器,8051微控制器指令具有8位操作码。因此,8051微控制器指令集最多可以有28=256条指令。
在介绍8051单片机指令集、指令类型和寻址模式之前,首先需要简要了解一下8051单片机指令集(MCS-51指令集)的指令和指令组。
下表格显示了8051指令组和每组中的指令。8051单片机指令集中有49个指令助记符,这49个助记符分为5组。
| 数据传输指令 | 算术指令 | 逻辑指令 | 布尔指令 | 程序分枝指令 |
| 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 | JB | CJNE |
| XCHD | DIV | RLC | JNB | DJNZ |
| DA A | RR | JBC | NOP | |
| RRC | ANL | LCALL | ||
| SWAP | ORL | ACALL | ||
| CPL | RET | |||
| RETI | ||||
| JMP |
寻址模式是一种定位目标数据的方法,也称为操作数。8051系列微控制器允许使用五种寻址模式来寻址操作数,分别是:
1、立即寻址
在立即寻址模式下,操作码后面的操作数是8位或16位的常量数据。立即寻址的名称来自于要存储在内存中的常量数据紧跟在操作码之后的事实。要存储的常量值在指令本身中指定,而不是从寄存器中获取。常量数据必须复制到的目标寄存器应该与指令中提到的操作数大小相同。
示例:MOV A,#030H
其中,累加器加载了30(十六进制)。操作数中的#表示它是一个数据而不是寄存器的地址。立即寻址非常快,因为要加载的数据在指令本身中给出。
2、寄存器寻址
在寄存器寻址模式下,八个寄存器(R0–R7)之一被指定为指令中的操作数。
在PSW寄存器的帮助下选择合适的Bank很重要。下面看一个假设选择Bank0的寄存器寻址示例。
示例:MOV A,R5
其中,Bank0的寄存器R5的8位内容被移动到累加器。
3、直接寻址
在直接寻址模式中,数据的地址被指定为指令中的操作数。使用直接寻址模式,可以访问任何寄存器或片上变量。这包括通用RAM、SFR、I/O端口、控制寄存器。
示例:MOV A,47H
其中,RAM单元47H中的数据被移动到累加器。
4、寄存器间接寻址
在间接寻址模式或寄存器间接寻址模式中,操作数的地址被指定为寄存器的内容。下面举个列子:
示例:MOV A,@R1
@符号表示寻址方式是间接的。例如,如果R1的内容为56H,则操作数位于内部RAM位置 56H。如果RAM单元56H的内容是24H,则将24H移入累加器。
在间接寻址模式中只允许使用R0和R1。这些间接寻址模式的寄存器称为指针寄存器。
5、索引寻址模式
在索引寻址模式下,操作数的有效地址是基址寄存器和偏移寄存器的总和。基址寄存器可以是数据指针 (DPTR) 或程序计数器 (PC),而偏移寄存器是累加器 (A)。
在索引寻址模式下,只能使用MOVC和JMP指令。从查找表中检索数据时,索引寻址模式很有用。
示例:MOVC A,@A+DPTR
这里,操作数的地址是DPTR和Accumulator的内容之和。
注意:另外有些朋友可能还会添加了一些其它寻址模式,例如绝对寻址模式、相对寻址模式和长寻址模式。
在看指令类型之前,可以先看看805单片机指令的结构。一条8051指令由一个操作码(操作代码的简称)和后跟零字节、一字节或两字节大小的操作数组成。
指令的操作码部分包含助记符,它指定要执行的操作类型。指令的所有助记符或操作码部分都是一个字节大小。至于指令的操作数部分,它定义了指令正在处理的数据。操作数可以是以下任何一种:
其实,可以有多个操作数,指令格式如下:
助记符、目的操作数、源操作数
一条简单的指令只包含操作码。其他指令可以包括一个或多个操作数。指令可以是仅包含操作码的单字节指令,也可以是双字节指令,其中第二个字节是操作数,也可以是三字节指令,其中操作数构成第二个和第三个字节。
根据它们执行的操作,8051微控制器指令集中的所有指令分为五组,分别是:
数据传输指令与寄存器或外部程序存储器或外部数据存储器之间的数据传输相关。下面给出了与数据传输指令相关的助记符。
| 助记符 | 描述 |
| MOV | 移动数据 |
| MOVC | 移动代码 |
| MOVX | 移动外部数据 |
| PUSH | 将数据移动到堆栈 |
| POP | 从堆栈复制数据 |
| XCH | 在两个寄存器之间交换数据 |
| XCHD | 在两个寄存器之间交换低阶数据 |
2、算术指令
使用算术指令,可以执行加法、减法、乘法和除法。算术指令还包括加一、减一和称为十进制调整累加器的特殊指令。
与8051单片机指令集的算术指令相关的助记符有:
| 助记符 | 描述 |
| ADD | 无进位加法 |
| ADDC | 带进位加法 |
| SUBB | 带进位减法 |
| INC | 增加1 |
| DEC | 减1 |
| MUL | 乘 |
| DIV | 除 |
| DA A | 十进制调整累加器(A寄存器) |
算术指令不会了解数据格式,即有符号、无符号、ASCII、BCD等。此外,算术指令执行的操作会影响PSW寄存器中的进位、溢出、零等标志。
下表中整理了与算术指令相关的所有可能的助记符。
3、逻辑指令
逻辑指令执行逻辑运算,如AND、OR、XOR、NOT、Rotate、Clear和Swap。逻辑指令是按位对数据字节执行的。与逻辑指令相关的助记符如下:
| 助记符 | 描述 |
| ANL | 逻辑与 |
| ORL | 逻辑或 |
| XRL | 异或 |
| CLR | 清除寄存器 |
| CPL | 补充寄存器 |
| RL | 向左旋转一个字节 |
| RLC | 循环一个字节并左进位 |
| RR | 向右旋转一个字节 |
| RRC | 循环一个字节并向右进位 |
| SWAP | 在一个字节中交换更低和更高的半字节 |
下表显示了逻辑指令的所有可能助记符。
4、布尔或位操作指令
顾名思义,布尔或位操作指令处理位变量。众所周知,RAM中有一个特殊的位寻址区域,一些特殊功能寄存器 (SFR) 也是位寻址的。
布尔或位操作指令对应的助记符为:
| 助记符 | 描述 |
| CLR | 清零(复位为0) |
| SETB | 设置一个位(设置为1) |
| MOV | 移动一点 |
| JC | 如果设置了进位标志则跳转 |
| JNC | 如果未设置进位标志则跳转 |
| JB | 如果指定的位被设置则跳转 |
| JNB | 如果指定位未设置则跳转 |
| JBC | 如果指定的位被设置则跳转并清除该位 |
| ANL | 按位与 |
| ORL | 按位或 |
| CPL | 补位 |
这些指令可以在位级别执行设置、清除和/或补码等。下表中指定了布尔指令的所有可能助记符。
5、程序分支指令
8051微控制器指令集中的最后一组指令是程序分支指令,这些指令控制程序逻辑的流程。程序分支指令的助记符如下。
| 助记符 | 描述 |
| LJMP | 长跳跃(无条件) |
| AJMP | 绝对跳跃(无条件) |
| SJMP | 短短跳(无条件) |
| JZ | 如果A等于0则跳转 |
| JNZ | 如果A不等于0则跳转 |
| CJNE | 如果不相等则比较并跳转 |
| DJNZ | 如果不为零则递减和跳转 |
| NOP | 无操作 |
| LCALL | 长调用子程序 |
| ACALL | 绝对调用子程序(无条件) |
| RET | 从子程序返回 |
| RETI | 从中断返回 |
| JMP | 跳转到地址(无条件) |
下表显示了与程序分支指令相关的所有助记符。