单片机寄存器

news2024/10/5 14:01:51

单片机寄存器简述

1、单片机寄存器就是单片机片内存储器(片内RAM)一部分,每一个都有地址。只不过这几个寄存器有特殊的作用,比如指令:MUL AB,这条指令用到两个寄存器A,B进行乘法,结果存到BA里面,这条指令必须用这两个寄存器。

2、单片机寄存器其实就相当于一个变量,只不过这个变量在固定的地址,有一个特殊的名称(当然也不强制)。

寄存器构成

寄存器是单片机内部的基本存储单元, 由触发器构成, 一个触发器就是1位寄存器。图1-15所示是一种由D触发器构成的4位寄存器
在这里插入图片描述
在工作时, 寄存器先让清0线为低电平, 该低电平送到各触发器的CLR端(实际为D触发器的R端) , 将各触发器清0, Y3Y2Y1Y0=0000; 然后将数据送到各触发器输入端,当CLK端的时钟脉冲上升沿到来时, 输入端的数据就被存入到各触发器中, 并从输出端输出。

ps;触发器

触发器是一种具有记忆存储功能的电路, 由门电路组成。 常见的触发器包括: RS 触发器、 D 触发器和 JK触发器等, 其中D触发器最为常用。 D触发器的逻辑符号如图1-14所示
在这里插入图片描述
从图1-14中可以看出, D触发器的端子包括: 输入端D、 输出端Q、 反相输出端 、 时钟脉冲输入端CLK、 置“0”端R和置“1”端S。数据存储过程: 当D触发器的D端输入数据“1”时, 数据并不能马上被存入触发器, 只有CLK端时钟脉冲信号上升沿(即低电平转为高电平时) 到来时, “1”才能被存入触发器, 存入后Q端输出“1”, 端输出“0”。 也就是说, 只有时钟脉冲上升沿到来时, D触发器才能将输入端的数据存储起来, 并从Q端输出。D触发器的置“0”和置“1”: 当置“0”端R为低电平时, 触发器被置“0”, 即Q端为“0”;当置“1”端S为低电平时, 触发器被置“1”, 即Q端为“1”。

寄存器的用途:

1 .可以对寄存器中的数据进行算术运算和逻辑运算。

2 .寄存器内保存的地址可用于存储器所在的位置,即寻址。

3 .可用于向电脑读写数据的外围设备。

寄存器的数码存取方式

1、并行方式

将凡位二进制数一次存人寄存器或从寄存器中读出的方式。将n位二进制数以每次l位,分成n次存人寄存器并从寄存器读出。并行方式只需一个时钟脉冲就可以完成数据操作,工作速度快,但需要n根输入和输出数据线。

2、串行方式

数码从一个输入端逐位输入到寄存器中。要使用几个时钟脉冲完成输入或输出操作,工作速度慢,但只需要一根输入或输出数据线,传输线少,适用于远距离传输。

51单片机寄存器

寄存器单片机寄存器就是单片机片内存储器(片内RAM)一部分,每一个都有地址。参考下存储器就知道寄存器是啥了,存储器介绍https://editor.csdn.net/md/?articleId=128726818

在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

寄存器实例一

寄存器的每一位都可以控制硬件的变化(高低电平、开关断通,通道选择或者数据寄存),寄存器相当于cpu和硬件的桥梁,cpu通过寄存器来控制硬件,
在这里插入图片描述在这里插入图片描述

寄存器实例二

在这里插入图片描述上图中说的就是通过寄存器(写进去一些数,对寄存器进行操作,进而控制相关外设,例如gpio=1,gpio寄存器写数,来控制io口)
在这里插入图片描述在这里插入图片描述在这里插入图片描述
上图Sfr特殊功能寄存器,这也就验证了寄存器也是存储器,他也有地址
在此也理解下stm32,32位,4G内存如何分配的,一些地址给了ROM,一些
RAM,还有寄存器等等,这个地址大小和内存的计算关系可参考文档(这
个不是stm32,但是是32位的,原理类似)
在这里插入图片描述
在这里插入图片描述
上图1三极管导通,灯亮

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现-LED循环闪烁

oid Delay(unsigned int Time)
while(Time --)
)
#define GPX2C0N (*(unsigned int*)0x11000c40)
#define GPX2DAT (*(unsigned int*)0x11000c44)

int main()
{
GPX2C0N =0x10000000;
whtle(1)
{
GPX2DAT =0x80;//转换成16进制
Delay(1000000);
GPX2DAT =0x00;
Delay(1000000);
}
Return 0;
}

实例三、思考硬件电路与寄存器编程的关系

最一般的实现跑马灯的电路如下
在这里插入图片描述
从任意单片机引出四个含GPIO功能的引脚引出来,GPIO是General Purpose Input Output是经典的实现设置输出电平,检测捕获输入电平的硬件电路。

四个GPIO口与电阻和LED灯连接,共同连接在接地端。

如果想实现1亮234灭,2亮134灭,类似这样的跑马灯功能,该如何实现呢?

如果是我来做这些事,首先我会把第一个电路接在VCC上,然后其他电路都接在地上,这样一路电路有了压降LED亮了,其他没有,就灭了,然后我再把一路接地,二路接VCC,就实现了一个跑马灯的动画效果。

好像下图这样
在这里插入图片描述
以此类推,只要我不停的换连导线,就可以完成这样的动画效果了。

但是这样好麻烦,我不想一直不断的机械做这些事,可以花更多的时间在散步读书上才对。

所以我特别希望改进这个电路,仔细观察,找到规律

如果用1 代表导线接入VCC , 用0代表接地,那么顺序应该是

1000 -> 0100 -> 0010 -> 0001 ->1000

能不能有什么设备帮助我们换连导线呢?

这里有两个思路,第一个使用经典的数字电路,移位寄存器,用逻辑门啥的,在时钟信号的驱动下帮我们切换导线连接方法。

那么第二个思路就是用单片机啦!单片机那可比简单的数字电路厉害多了。

单片机的GPIO设备有好几种工作方式,按照其工作的特点来看可以分为 输出/输入两种模式。

当我们需要单片机去感应外部电平的时候,我们会把它设置在输入模式,当然现在在我们希望他能输出特定的电压,所以设置他为输出模式。

单片机是一个大黑盒子,里面的原理很深奥很复杂,但是幸运的是,设计单片机的人,给我们提出了寄存器的概念,这样我们就不需要理解复杂的电路原理,就可以完成特定的功能操作了!

例如,选择GPIO口为输出还是输入,其切换电路可以抽象成这样
在这里插入图片描述
当P0SEL寄存器的BIT0的数值为1的时候,P0.0口硬件与一大片输出相关电路相连,也就是说此时P0.0口是处于输出功能状态下,反之BIT0为数值0 则与一大片输入相关电路相连。其底层的原理大概是利用三极管开关特性完成的吧!无论如何我们配置寄存器,就完成了开关的操作,选择了怎样的电路与我的P0.0口连接!

值得高兴的是在GPIO一系列的寄存器里,我找到了切换输出电平的寄存器 P0OUT寄存器,我抽象的思考这样寄存器应该是这样的。
在这里插入图片描述
当我给P0OUT的最低位写上1的时候P0.0口与VCC连接,写上0的时候P0.0口与GND连接。大底是这样思考的。

于是我惊喜的发现,单片机可以帮助我实现切换导线连接这样的事情。

于是我用了MSP430单片机,把P0.0 P0.1 P0.2 P0.3 接在了上述的电路上。

写下了这样的C代码

int main(void){
unsigned char led_flash_pos=0x01;

Basic_init(); //基础配置

P0SEL = 0x0f;//确保P0SEL寄存器低四位是1,使得硬件电路与输出相关电路相连

Loop:
if(led_flash_pos == 0x10)
led_flash_pos = 0x01; //限制左移范围

P0OUT = led_flash_pos;
DELAY_S(1); // 延时1S让眼睛看到现象
led_flash_pos <<= 1; //计算机算法,左移操作
goto Loop;//跳转 循环
}

可以有非常花哨的写法,但是最底层的操作就是配置P0OUT这个寄存器,单片机编程所有对硬件的操作都是对寄存器的操作,我们无需对底层硬件有太多深奥的理解,就可以完成操作!

作者思考:

分工的时代,如果认真深入的去了解学习单片机最底层的硬件原理的话,那会消耗大量的时间和精力,成为一名优秀的软件开发工程师的话,对底层硬件有一定的理解就好,更多精力花费在对代码数据结构,算法的优化,例如对P0OUT这个寄存器,何时写他,怎么写他,写多少比较合适,这都是需要考虑的事情,还有就是延时的时间是否过长,用定时器延时比较好,还是用阻塞延时比较好?另外,怎样的跑马灯动画更好看?很多可以编程的花样!

记得笔者第一次跑起跑马灯程序,兴奋的写了好多衍生代码,例如隔着一个灯闪烁,快速闪烁,等等,好像往你手上塞了好多好多乐高积木(寄存器),你可以任意的搭接,描绘出自己心中完美的模样!

参考文章
如有侵权,请联系作者删除。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基本功系列之type命令实战

文章目录一. type命令介绍二. 语法格式及常用选项三. 参考案例3.1 查看别名3.2 查看是否是内建命令3.3 查看是否为关键字3.4 显示所有命令的位置3.5 判断当前命令是否为alias或者keyword等总结前言&#x1f680;&#x1f680;&#x1f680; 想要学好Linux&#xff0c;命令是基本…

4-2指令系统-指令的寻址方式

文章目录一.指令寻址1.顺序寻址2.跳跃寻址二.数据寻址1.隐含寻址2.立即&#xff08;数&#xff09;寻址3.直接寻址4.间接寻址5.寄存器寻址6.寄存器间接寻址7.相对寻址&#xff08;程序浮动、转移指令&#xff09;8.基址寻址&#xff08;多道程序&#xff09;9.变址寻址&#xf…

移动web字体图标

字体图标下载字体图标使用字体图标使用类名引入字体图标使用unicode编码(了解)在线字体图标使用伪元素字体图标小结下载字体图标 具体的步骤&#xff1a; 使用字体图标 引入相关文件 复制相关的文件&#xff0c;到 fonts文件夹里面。 引入 css <link rel"styleshe…

回溯法复习(总结篇)

根据课本上的学习要点梳理&#xff0c;“通用解题法”&#xff0c;可以系统的搜索一个问题的所有解、任一解&#xff0c;他是一个既带有系统性&#xff08;暴力遍历&#xff09;又带有跳跃性&#xff08;剪枝&#xff09;的搜索算法。 理解回溯法和深度优先搜索策略 回溯的本质…

Kafka入门与核心概念

前言在我们开发过程中&#xff0c;有一些业务功能比较耗时&#xff0c;但是又不是很重要的核心功能&#xff0c;最典型的场景就是注册用户以后发送激活邮件分为两步1&#xff1a;向数据库插入一条数据2&#xff1a;向注册用户发送邮件第2步其实并不是核心功能&#xff0c;但是发…

SpringMVC-拦截器

1&#xff0c;pringMVC-拦截器 对于拦截器这节的知识&#xff0c;我们需要学习如下内容: 拦截器概念入门案例拦截器参数拦截器工作流程分析 1.1 拦截器概念 讲解拦截器的概念之前&#xff0c;我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务…

字节青训前端笔记 | 响应式系统与 React

本节课为前端框架 React 的基础课程讲解 React的设计思路 UI编程的特点 状态更新的时候&#xff0c;UI不会自动更新&#xff0c;需要手动调用DOM接口进行更新欠缺基本的代码层面的封装和隔离&#xff0c;代码层面没有组件化UI之间的数据依赖关系&#xff0c;需要手动维护&am…

【程序人生 | 价值扳机】你的寒假自律第一步(建议收藏)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计专业大二本科在读&#xff0c;阿里云社区专家博主&#xff0c;华为云社区云享专家&#xff0c;CSDN SAP应用技术领域新兴创作者。   在学习工…

小技巧:Excel顽固的名称、引用冲突的解决

共享编辑、跨文档引用的不便 Excel 的共享文档多人编辑、跨文档引用等功能似乎很美好&#xff0c;实际用下来很成问题。 首先共享文档虽然用约定按标注责任人的方式由不同的人编辑不同的行避免的多人同时编辑一行的冲突&#xff0c;但是这通常是个大文件&#xff0c;经常(大概…

函数 C语言】

函数的声明和定义 函数间调用关系是&#xff0c;由于函数调用其他函数&#xff0c;替他函数也可以互相调用&#xff0c;同一个函数可以被一个或多个函数调用任意次。 先声明&#xff0c;后调用。 #include <stdio.h> //去标准库下找文件 #include "stdio.h"…

分件操作和IO

1.文件的路径如图:当我们打开此电脑后(windows系统),上面会显示我们当前的位置&#xff0c;点击之后会出现如图片中的一段字符&#xff0c;这段字符代表着当前你所处位置的路径。最开头的D&#xff1a;/d&#xff1a;是盘符&#xff0c;后面会用斜杠‘/’或者反斜杠‘\’分开,该…

MFC的使用

1.初使用的简单代码该程序包含两个代码 头文件mfc.h和mfc.cpp文件头文件mfc.h#pragma once #include<afxwin.h>class MyApp:public CWinApp//CWinApp应用程序类 { public://程序入口virtual BOOL InitInstance(); }; class MyFrame : public CFrameWnd//继承窗口框架类a …

Java_Git:2. 使用git管理文件版本

目录 1 创建版本库 1.1 使用GitBash 1.2 使用TortoiseGit 2 添加文件 2.1 添加文件过程 2.2 工作区和暂存区 3 修改文件 3.1 提交修改 3.2 查看修改历史 3.3 差异比较 3.4 还原修改 4 删除文件 5 案例&#xff1a;将java工程提交到版本库 5.1 复制文件到工作目录 …

论文阅读:Boosting 3D Object Detection by Simulating Multimodality on Point Clouds

Boosting 3D Object Detection by Simulating Multimodality on Point CloudsResponse DistillationSparse-Voxel DistillationVoxel-to-Point DistillationInstance DistillationlossExperiments稠密&#xff08;多模态、多帧&#xff09;信息->稀疏&#xff08;单模态点云…

【华为上机真题 2023】数组去重和排序 (华为机考真题)

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

2023/1/20 ES6基本语法学习

1 let 命令的解读 1 let 声明变量&#xff0c;没有变量提升 <script>// 不存在变量提升console.log(variable)let variable zhaoshuai-lc </script>2 作用域 全局作用域函数作用域&#xff1a;function() {}块级作用域&#xff1a;{} let 是一个块作用域 <…

Spring中涉及的设计模式总结

Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实例化阶段主要是通过反射或者CGLIB对bean进行实例化&#xff0c;在这个阶段Spring又给我们暴露了很多的扩展点&#xff1a; 实现方式&#xff1a;BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现…

【设计模式】结构型模式·装饰者模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.概述 在不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增…

2022年房地产投资退出方法和工具研究报告

第一章 房地产投资概况 房地产商品既是人们日常“衣食住行”中的一种必需品&#xff0c;又因保值增值的功能而具有很好的投资品属性。房地产投资是以房地产为对象&#xff0c;为获得预期效益而对土地和房地产开发、房地产经营&#xff0c;以及购置房地产等进行的投资。 房地产…

深度学习 GNN图神经网络(二)PyTorch Geometric(PyG)安装

一、前言 我们使用torch_geometric库来实现图神经网络的编码&#xff0c;因为它与PyTroch天然集成。本文介绍了PyTorch Geometric&#xff08;PyG&#xff09;的安装与测试。 二、安装 首先打开官方的安装说明文档&#xff1a;https://pytorch-geometric.readthedocs.io/en/…