51单片机指令系统入门

目录

基本概念讲解

一、机器指令​

二、汇编指令​

(一)汇编指令的一般格式

(二)按字节数分类的指令

三、高级指令

总结​


基本概念讲解

        指令是计算机(或单片机)中 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 灯的程序

#include <reg51.h>  // 包含51单片机的头文件
sbit LED = P1^0;  // 定义P1.0口为LED控制引脚
void main() {while(1) {LED = 0;  // 点亮LED}
}
#include <reg51.h>  // 包含51单片机的头文件
sbit LED = P1^0;  // 定义P1.0口为LED控制引脚
void main() {while(1) {LED = 0;  // 点亮LED}
}
#include <reg51.h>  // 包含51单片机的头文件
sbit LED = P1^0;  // 定义P1.0口为LED控制引脚
void main() {while(1) {LED = 0;  // 点亮LED}
}

        在这段代码中,虽然没有直接出现汇编指令中的操作码和操作数,但编译器会将这些高级语言代码转换为对应的汇编指令,进而生成机器指令,从而执行对应的功能。

        高级语言指令使得开发者可以更专注于程序的功能实现,而无需过多关注底层硬件细节,大大提高了开发效率。

        不过,由于高级语言代码在编译过程中会生成相对较多的中间代码,在对资源和执行效率要求极为严格的情况下可能需要结合汇编语言进行优化

总结​

        51 单片机指令系统虽内容繁杂,但只要从机器指令汇编指令高级指令 这三个层面入手,掌握其基本概念、弄清其基本形式,了解其使用场景,同时掌握三者间的关系,就可以实现51单片机指令系统的入门。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35130.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql5.x和mysql8.x查看和设置隔离级别

MySQL的隔离级别 级别标志值描述读未提交READ-UNCOMMITTED0存在脏读、不可重复读、幻读的问题读已提交READ-COMMITTED1解决脏读的问题&#xff0c;存在不可重复读、幻读的问题可重复读REPEATABLE-READ2mysql 默认级别&#xff0c;解决脏读、不可重复读的问题&#xff0c;存在幻…

【函数式编程】【C#/F#】第四讲:单子与函子 - 抽象的编程模式

在第二讲中我们探讨了一个诚实的函数应该要做到什么事&#xff0c;并运用了一种方法&#xff0c;让我们可以去准确的描述数据。 不过有一种情况让我们始料未及&#xff0c;例如网站需要收集一些信息&#xff0c;但有些信息不是必须的&#xff0c;是可有可无的。如果我们要去准…

【vue2 + Cesium】使用Cesium、添加第三方地图、去掉商标、Cesium基础配置、地图放大缩小事件、获取可视区域、层级、高度

参考文章&#xff1a; vue2 使用 cesium 篇【第一篇】 vue2 使用 cesium 【第二篇-相机视角移动添加模型】 vue2 项目模版&#xff1a; vue2-common 安装 cesium npm install cesium --save这个就很简单&#xff0c;只需要一句简简单单的命令就可以实现在 vue 项目中安装 ce…

vllm-openai多服务器集群部署AI模型

服务器配置是两台ubantu系统电脑,每台电脑安装两张4090-48G显存的显卡,共计192G显存。 服务器1 服务器2 准备工作: 1.两台电脑都已经安装了docker 2.两台电脑都已经安装了nvidia驱动 参考vllm官方资料 https://docs.vllm.ai/en/latest/serving/distributed_serving.html…

【电源】斩波电路

文章目录 前言定义概念 缩写降压斩波电路使用步骤总结参考文献 前言 进行大创项目开发的学习 bilibili 定义概念 缩写 斩波电路&#xff1a;分为降压&#xff0c;电荷泵&#xff0c;升压&#xff0c;升降压&#xff0c;Cuk&#xff0c;Speic&#xff0c;Zeta 等等 降压斩…

Hadoop集群组成

&#xff08;一&#xff09;Hadoop的组成 对普通用户来说&#xff0c; Hadoop就是一个东西&#xff0c;一个整体&#xff0c;它能给我们提供无限的磁盘用来保存文件&#xff0c;可以使用提供强大的计算能力。 在Hadoop3.X中&#xff0c;hadoop一共有三个组成部…

c++基础知识-图论进阶

一、拓扑排序 1、基础知识 1&#xff09;什么是拓扑排序 对一个有向无环图G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点u和v&#xff0c;若&#xff0c;则u在线性序列中出现在v之前。 2&#xff09;拓扑排序的操作方法 重复执行…

从Scaling Laws中解析大模型训练的边际递减临界点

前言 当我们拆解GPT-4到DeepSeek的演进路径&#xff0c;会发现一个反直觉的真相&#xff1a;​AI的智能跃迁不依赖参数堆砌&#xff0c;而取决于对"结构-能量-信息"三元关系的精准把控。就像人类大脑在进化中通过皮层折叠而非单纯增大体积来实现智能突破&#xff0c…

Word 小黑第20套

对应大猫21 特定一页设为横向 上下用分页符

【从0到1搞懂大模型】RNN基础(4)

先说几个常用的可以下载数据集的地方 平台&#xff1a;kaggle&#xff08;https://www.kaggle.com/datasets&#xff09; 和鲸社区&#xff08;https://www.heywhale.com/home&#xff09; 阿里天池&#xff08;https://tianchi.aliyun.com/&#xff09; 其他&#xff1a;海量公…

openEuler24.03 LTS下安装MySQL8

前提条件 拥有openEuler24.03 LTS环境&#xff0c;可参考&#xff1a;Vmware下安装openEuler24.03 LTS 步骤 卸载原有mysql及mariadb sudo systemctl stop mysql mysqld 2>/dev/null sudo rpm -qa | grep -i mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps 2>/dev/…

如何在Odoo 18中实现OWL通知服务

如何在Odoo 18中实现OWL通知服务 OWL&#xff08;Odoo Web Library&#xff09;是Odoo的前端框架&#xff0c;用于构建现代化的动态响应式用户界面。在早期版本中&#xff0c;Odoo 前端设计与开发使用的是诸如 QWeb 这类较为老旧的框架&#xff0c;而随着 Odoo 每发布一个新版本…

Unet nn-Unet

Unet && nn-Unet&#xff1a; 文章题目&#xff1a;U-Net: Convolutional Networks for Biomedical Image Segmentation 代码&#xff1a;https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/ 文章题目&#xff1a;nnU-Net: Self-adapting Framework for U…

【扩散模型入门】Latent Diffusion

1. 概述 扩散模型为公众所知的一个主要原因是Stable Diffusion(SD)的推出展现出了远超以往的图像合成效果,而SD的主要技术就是Latent Diffusion Model(LDM)。 实际上,LDM的核心idea非常简单: 为了确保生成质量,LDM尽可能提升去噪模型的规模。提升模型规模往往也会同步…

搭建主从服务器

任务需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容为&#xff1a;Very good, you have successfully set up the system. 各个主机能够实现时间同步&#xff0c;并且都开启防…

SAP HANA on AWS Amazon Web Services

SAP HANA on AWS Amazon Web Services

vue项目如何实现条件查询?

目录 1.前端 2.后端 3.mybatis的sql语句 结语 1.前端 说白了就是&#xff0c;无论该参数是否是空字符串&#xff0c;都会传递到后端。&#xff08;反正不是null就行&#xff09;。 2.后端 在controller层中&#xff0c;使用RequestParam注解接收名为registerName的参数&…

C++:类对象的存储方式

如何计算类对象的大小 class A { public: void PrintA() { cout<<_a<<endl; } private: char _a; }; 类中既可以有成员变量&#xff0c;又可以有成员函数&#xff0c;那么一个类的对象中包含了什么&#xff1f;如何计算 一个类的大小&#xff1f; 类对象的存储方…

Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(一)

WDDM 3.0 之前的翻转队列模型 许多新式显示控制器支持对按顺序显示的多个帧排队的能力。 从 WDDM 2.1 开始&#xff0c;OS 支持将在下一个 VSync 中显示的多个未完成的翻转覆盖请求。 显示微型端口驱动程序 (KMD) 通过 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVS…

OSPF-5 3类LSA SummaryLSA

上一期我们介绍了2类LSA Network LSA的内容信息以及怎样从2类LSA中的信息描绘出一张具体的拓扑信息以及网段信息 这一期我们将介绍3类LSA Summary LSA区域间的LSA看看3类LSA是怎样把域间的路由信息传递到别的区域的 一、概述 由于3类LSA是用来描述我们域间的路由信息所以它是…