目录
基本概念讲解
指令是计算机(或单片机)中 CPU 能够识别并执行的基本操作命令。
指令系统是一台计算机(或单片机)能够执行的全部指令的集合。指令系统的强弱,决定了计算机智能的高低。
对于 51 单片机而言,其指令系统涵盖了数据传送、算术运算、逻辑操作、控制转移、位操作等多种类型的指令。这些指令有机组合,赋予了 51 单片机强大的功能。
要使计算机(或单片机)按照人们的要求完成一项工作,就必须让CPU按照一定逻辑顺序逐条执行 人们编写的指令。这种按照人们要求所编排的指令操作的序列,称为程序 。编写程序的过程叫程序设计。
程序设计语言就是编写程序的一整套规则和方法 ,是实现人机交换信息的基本工具。分为机器语言、汇编语言和高级语言。
为了方便称呼,我们可以将其对应的指令分别称为:机器指令 、汇编指令 、高级指令(如使用 C51 写出的指令)。
虽然说并没有高级指令这个概念,但是这样去理解是不存在问题的。而且无论是汇编语言还是高级语言写出的程序,最终都要先被翻译成机器可以识别的机器指令,才能在计算机(或单片机)上执行。
本文将会对51单片机中的这三种指令作简单介绍。
一、机器指令
机器指令是 51 单片机能够直接识别并执行的二进制代码。它以 0 和 1 的序列形式存在 ,每一条机器指令都对应着特定的硬件操作。
例如,实现数据传送的机器指令,会通过控制单片机内部的数据总线,将数据从一个存储单元搬运到另一个存储单元。
虽然机器指令直接面向硬件,执行效率高,但由于其采用二进制形式,对于开发者而言,阅读和编写难度极大。在实际开发中,很少直接使用机器指令进行编程,而是借助汇编语言或高级语言,通过编译器将代码转换为机器指令。
二、汇编指令
汇编指令是机器指令的助记符形式,与机器指令一一对应。
相较于机器指令,汇编指令使用具有一定含义的英文单词或缩写来表示操作码和操作数,大大提高了程序的可读性和可编写性。
51 单片机汇编语言指令的一般格式如下:[标号:] 操作码 [操作数] [;注释] 。一般格式中,方括号表示可以没有相应的部分,即可以没有标号、操作数、注释,但一定要有操作码。
例如 "NOP" 指令,属于空操作指令,它不需要操作数,仅仅执行一个空操作周期,用于产生短暂延时等场景。
汇编指令要被翻译成机器指令(二进制代码) 才能被机器识别并执行对应功能,操作码和操作数都有对应的二进制编码 ,指令代码有若干个字节组成。在51单片机的指令系统中,有单字节指令 、双字节指令和3字节指令。
下面,我们将对汇编指令的一般格式与按字节数分类的指令作详细讲解。
(一)汇编指令的一般格式
1、标号
(1)定义: 标号是用户自定义的符号,用于表示指令所在的地址,方便在程序中进行跳转、调用等操作。
(2)命名规则: 由字母、数字和下划线组成,但不能以数字开头,且不能使用汇编语言的保留字(如操作码、寄存器名等)。
(3)示例: "START:" 表示程序开始的位置,在后续的指令中可以使用这个标号进行跳转。如**使用"AJMP START"**会使程序跳转到 START 标号所在的指令处继续执行。
2、操作码
(1)定义: 操作码是汇编指令的核心部分,它规定了指令要执行的操作类型 ,明确指令所执行的具体操作功能。如数据传送、算术运算、逻辑运算等。
(2)示例: MOV 表示数据传送操作,ADD 表示加法运算,SJMP 表示短跳转操作。
3、操作数
(1) 定义: 操作数是指令操作的对象 ,可以是数据本身 ,也可以是数据所在的地址 。操作数的个数根据指令的不同而有所变化,指令没有操作数,最多可以有三个。
(2)分类及示例
**① 立即数:****直接出现在指令中的数据,用符号"#"表示。**例如,MOV A, #30H 表示将立即数 30H 传送到累加器 A 中。
**② 寄存器:使用单片机内部的寄存器作为操作数。**例如,MOV A, R0 表示将寄存器 R0 中的数据传送到累加器 A 中。
**③ 直接地址:****直接给出操作数所在的内存地址。**例如,MOV A, 30H 表示将内部数据存储器地址为 30H 单元中的数据传送到累加器 A 中。
**④ 间接地址:****操作数的地址存放在寄存器中,通过寄存器间接找到操作数。**例如,MOV A, @R0 表示将寄存器 R0 中的值作为地址,把该地址单元中的数据传送到累加器 A 中。
4、注释
(1)定义: 注释是为了提高程序的可读性而添加的说明性文字 ,不会被翻译成机器代码。
(2)格式: 以";" 开头,后面可以跟任意文本。
**(3)示例:**MOV A, #30H ; 将立即数30H传送到累加器A中。
以下是一个完整的51单片机汇编语言程序示例:

这个示例展示了汇编语言程序的基本结构和指令格式,包含了标号、操作码 、操作数 和注释等部分。
(二)按字节数分类的指令
1、单字节指令
(1)指令构成: 在 51 单片机指令体系中,单字节指令仅占一个字节的程序存储空间,操作码和可能的操作数信息都包含在这一字节内。
(2)示例分析: 以 " INC Rn" 为例,"INC" 是操作码,表示加 1 操作,特定编码指定操作对象为寄存器 Rn。如执行 "INC R0",会将寄存器 R0 数据加 1。这类指令占空间小、执行快。
(3)应用场景: 适用于对寄存器进行简单计数 ,如循环程序中对多个寄存器依次计数;也用于位操作算法,如 "RL A" 指令在数据加密中对二进制数据移位混淆。
2、双字节指令
(1)指令构成: 在程序存储器中占两个字节,首字节为操作码**,明确操作类型,** 次字节表示操作数或其地址。
(2)示例分析:"MOV A, #data" 中,首字节 "MOV" 为操作码,次字节 "#data" 是要传送到累加器 A 的立即数,如 "MOV A, #30H"。"SJMP rel" 中,首字节 "SJMP" 为短跳转操作码,次字节 "rel" 是相对偏移量,决定程序跳转目标地址。
(3)应用场景: 常用于初始化变量 ,如 "MOV P1, #0FFH" 设置端口 P1 初始状态;也用于程序流程控制,实现短距离条件跳转或循环。
3、三字节指令
(1)指令构成: 在程序存储器中占三个字节,首字节为操作码,后两字节表示操作数或其地址信息。
(2)示例分析:"LJMP addr16" 中,首字节 "LJMP" 为长跳转操作码,后两字节 "addr16" 是 16 位目标地址,可实现 64KB 程序空间内任意跳转。"MOV direct1, direct2" 中,首字节 "MOV" 为数据传送操作码,第二、三字节分别是目的和源操作数地址。
(3)应用场景: 大型程序中,"LJMP addr16" 用于大范围改变执行流程 ;数据存储与搬运时,"MOV direct1, direct2" 实现不同直接寻址单元间的数据转移。
汇编指令能够精准地控制单片机的硬件资源,适用于对程序执行效率要求极高、对硬件资源操作精细的场景,如底层驱动开发等。在 51 单片机开发中,汇编语言仍然被广泛应用,尤其是在一些小型、对资源要求苛刻的项目中。
三、高级指令
随着单片机应用的不断发展,高级程序设计语言在单片机开发中也逐渐普及。像 C 语言这样的高级语言,具有丰富的数据类型、灵活的控制结构以及良好的可移植性。人们把"51单片机 C 语言"称为"C51"。
以 C51 为例,在 51 单片机开发中,开发者可以使用变量、数组、结构体等数据类型,通过函数来组织代码逻辑。例如,使用 C51 编写一个简单的点亮 LED 灯 的程序:
TypeScript
#include <reg51.h> // 包含51单片机的头文件
sbit LED = P1^0; // 定义P1.0口为LED控制引脚
void main() {
while(1) {
LED = 0; // 点亮LED
}
}
在这段代码中,虽然没有直接出现汇编指令中的操作码和操作数,但编译器会将这些高级语言代码转换为对应的汇编指令,进而生成机器指令,从而执行对应的功能。
高级语言指令使得开发者可以更专注于程序的功能实现,而无需过多关注底层硬件细节,大大提高了开发效率。
不过,由于高级语言代码在编译过程中会生成相对较多的中间代码,在对资源和执行效率要求极为严格的情况下 ,可能需要结合汇编语言进行优化。
总结
51 单片机指令系统虽内容繁杂,但只要从机器指令、汇编指令、高级指令这三个层面入手,掌握其基本概念、弄清其基本形式,了解其使用场景,同时掌握三者间的关系,就可以实现51单片机指令系统的入门。