51单片机入门:串口通信

串行通信的初步认识

通信方式分类

1、按照数据传送方式:

并行通信:通信时数据的各个位同时传送,可以实现字节为单位的通信。

但是通信线多,占用资源多,成本高。

串行通信:一次只能发送一位,要发送8次才能发送一个字节。(从低位开始发送)

2、按照数据同步方式:

同步通信:发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的约定(例如:在时钟信号的上升沿的时候,将数据发送出去)发送数据,接收端根据发送端提供的时钟信号来接收数据。如:I2C、SPI等有时钟信号的协议,都属于这种通信方式。

异步通信:接收方并不知道数据什么时候会到达,收发双方可以有各自自己的时钟。发送方发送的时间间隔可以不均,接收方是在数据的起始位和停止位的帮助下实现信息同步的。

3、按照数据传输方向:

单工通信:只允许一方向另外一方传送信息(即单方面传送),比如电视遥控机等。

半双工通信:数据可以在双方之间相互传播,同一时间只能其中一方发给另外一方,比如对讲机。

全双工通信:发送数据的同时也能够接收数据,两者可以同时进行,比如视频通话。

UART串口通信

UART(通用异步收发器)是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。通过发送和接收数据来使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。

对于51单片机,以STC89C52RC为例,有两个引脚专门用来通信:一个是RXD,一个是TXD,其基本模型如下:

f5235e5a0e694ba69129b2fe81efa695.jpg

其中,GND必须连接在一起,因为GND是电平基准。

如果单片机1要给单片机2发送11110 0100这个数据,先发送一个0,持续一段时间,再发送一个0,再持续一段时间......以此类推,逐次把所有的位都发送出去。

1、持续时间是多长时间?

引入波特率,也叫比特率:发送二进制数据的速率,习惯上用baud表示。发送一位二进制数据的持续时间为:1/baud。

如果单片机1和单片机2要通信,必须要保持波特率的一致。

2、数据什么时候开始、结束?

UART串口通信里规定:当没有通信信号发生的时候,通信线路保持高电平。在发送数据之前,先发送一个0表示起始位(这个0的持续时间也是1/baud)。之后再发送8位的数据位,最后再发送一位1表示停止位

61b83f8d2ec3421081036a2fcfd361b5.jpg


RS232通信接口

串口通信可以实现单片机与单片机通信,也可实现单片机与电脑通信。对于电脑,其CPU就相当于一个单片机。

通常,台式电脑上有RS232接口(九针九孔,也叫公头母头),但笔记本电脑一般没有,通常用USB虚拟的串口。

RS232接口及其各个针孔功能:

05b349b0c4e94292b9e7a492527353cf.jpg

RS232电平标准:

高电平1:-3V~-15V;低电平0:+3V~+15V,为负逻辑。

其不能直接与单片机相连(会烧坏单片机),通常情况下用MAX232转换芯片来实现我们单片机电压与电脑电压之间的转换。

缺点:传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。且接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。


电平转换芯片

MAX232转换芯片

f6df51a3e9864aa08e249ee6dbe52d07.jpg

MAX232芯片是美信(MAXIM)公司专为RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。

TTL/CMOS数据从11引脚(T1IN)、10引脚(T2IN)输入转换成RS-232数据从14(T1OUT)、7脚(T2OUT)送到电脑DB9插头;DB9插头的RS-232数据从13引脚(R1IN)、8引脚(R2IN)输入转换成TTL/CMOS数据后从12引脚(R1OUT)、9引脚(R2OUT)输出。

USB转串口通信

我们在工业上常使用RS232串口通信,但在商业上大部分为USB转UART技术。

USB转串口设备是一种将计算机的USB接口转换为通用串口(如RS232、RS485等)的转换器这种设备使得没有串口的老式设备(如编程器、机械控制系统等)能够通过USB接口与现代计算机连接。


串行口通信相关寄存器

SCON:串行控制寄存器

地址D7D6D5D4D3D2D1D0
98HSM0/FESM1SM2RENTB8RB8TIRI

SCON用于选择串行通信的工作方式,和某些控制功能,其格式如上,可位寻址通常只考虑SM0、SM1、REN、TI和RI

SM0/FE:当PCON寄存器中的SMOD0为1,该位用于帧错误检测;当PCON寄存器中的SMOD0为0时,该位与SM1一起指定串行通信的工作方式,具体如下:

REN:允许/禁止穿行接收控制位。由软件置位REN,REN=1为允许串行接收状态,可启动串行接收器RXD,开始接收信息;软件复位REN,即REN=0,则禁止接收;

TI:发送中断请求标志位。在模式1中,停止位开始发送时由内部硬件置1,表示向主机请求中断;中断响应后需要软件复位,即TI=0。初始化为0。

RI:接收中断请求标志位。在模式1中,接收到停止位时由内部硬件置1;中断响应后由软件复位0,初始化为0。

PCON:电源控制寄存器

地址D7D6D5D4D3D2D1D0
87HSMODSMOD0/POFGF1GF0PDIDL

不可位寻址

SMOD:波特率选择位,就是决定波特率是否加倍。用软件置位SMOD,当SMOD=1时,使波特率加倍;当SMOD=0时,各工作方式的波特率不加倍。复位时默认SMOD=0。

SMOD0:帧错误检测有效控制位,当SMOD0=1时,SCON寄存器中的SM0/FE位用于FE功能(帧错误检测);当SMOD0=0时,SCON寄存器中的SM0/FE位用于SM0功能,与SM1一起指定串行口工作方式。

SBUF:串行口数据缓冲寄存器

SBUF寄存器有2个,一个是发送寄存器,另一个是接收寄存器(名字都一样),但在逻辑上SBUF只有一个(地址都为99H),物理结构上,这是俩个完全独立的寄存器。如果CPU写SBUF,数据就会被送入发送寄存器准备发送;如果CPU读SBUF,则读入的数据一定来自接收寄存器。

简单来讲:a=SBUF,代表单片机从计算机接收到了数据(接收到的数据自动存在接收寄存器SBUF中)并且从接收寄存器SBUF读取数据并赋给a。SBUF=a,代表单片机要给计算机发送a数据,只需将a赋给发送寄存器SBUF就行,发送寄存器SBUF会自动给计算机发送SBUF中的数据。


波特率的设置

为选择波特率,关键在于定时器/计数器1的溢出率。

溢出率:单位时间内(1秒)定时器/计数器溢出的次数。

通常用的是定时器T1的模式2。模式2中,不再是 TH1 代表高 8 位,TL1 代表低 8 位了,而只有 TL1 在进行计数,当 TL1 溢出后,不仅仅会让 TF1 变 1,而且还会将 TH1 中的内容重新自动装到 TL1 中。这样有一个好处,就是我们可以把想要的定时器初值提前存在 TH1 中,当 TL1 溢出后,TH1 自动把初值就重新送入 TL1 了,全自动的,不需要程序中再给 TL1 重新赋值了。


代码设计

UART串口通信初始化

void UART_Init(){SCON=0x40;  //0100 0000PCON=0;/**通过定时器T1来设置波特率*/TMOD&=0x0F;  //0000 1111,清零定时器T1TMOD|=0x20;  //0010 1111,设置T1定时模式TL1 = 0xFA;		//设定定时初值TH1 = 0xFA;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1
}

其中,要禁止定时器1中断。如果允许中断,当中断服务程序执行时,可能会引入额外的延迟或抖动,这会干扰波特率发生器的正常工作,导致数据传输错误或不稳定。

此处SCON=0x40,说明REN=0,不允许接收数据;若需要单片机接收数据,将REN置1,即:SCON=0x50。

串口发送一个字节

void UART_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);//检测是否完成发送TI=0;
}

串口中断函数模版

void UART_Routine() interrupt 4
{if(RI==1){执行程序RI=0;  }
}

注意,中断函数要进行条件判断,因为串口接收和发送字节都能产生中断请求(即:当TI为1或RI为1时都能产生中断请求),通过条件判断来区分接收和发送。

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

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

相关文章

微软exchange邮箱发送

使用java发送exchange类型的邮件&#xff0c;foxmail中配置如下图&#xff1a; 需要的maven依赖如下&#xff1a; <dependency><groupId>com.microsoft.ews-java-api</groupId><artifactId>ews-java-api</artifactId><version>2.0</ve…

PCIE协议-2-事务层规范-Message Request Rules

2.2.8 消息请求规则 本文档定义了以下几组消息&#xff1a; INTx 中断信号电源管理错误信号锁定事务支持插槽电源限制支持厂商定义消息延迟容忍度报告&#xff08;LTR&#xff09;消息优化缓冲区冲洗/填充&#xff08;OBFF&#xff09;消息设备就绪状态&#xff08;DRS&#…

【系统架构师】-案例篇(八)数据流图

数据流&#xff1a;数据流是系统中数据的流动&#xff0c;它可以是输入、输出或存储在系统中的数据。 数据处理过程&#xff1a;数据处理过程是对数据进行处理的单元&#xff0c;可以是一个物理设备或软件模块。 数据存储&#xff1a;数据存储是系统中存储数据的单元&#xff0…

小红书·电商运营课:小红书开店流程,小红书电商如何运营(18节视频课)

课程目录 第1节课:学习流程以及后续实操流程注意事项 第2节课:小红书店铺类型解析以及开店细节 第3节课:小红书电商运营两种玩法之多品店铺解析 第4节课:小红书电商运营两种玩法之单品店铺解析 第5节课:选品课(多品类类目推荐) 第6节课:选品课(多品类类目推荐) 第7节课:…

百度GL地图实现某一段路的路况(new BMapGL.DrivingRouteLine)

功能描述&#xff1a; 1.百度地图实现点击地图出现起点&#xff0c;再次点击出现终点&#xff08;起点终点能拖动&#xff09;绘制完终点后获取该路的路况并且起点和终点可以拖动实现实时更新&#xff08;新绘制的路段的&#xff09;路况 2.地点搜索 效果如下&#xff1a; 关键…

Springboot+Vue项目-基于Java+MySQL的制造装备物联及生产管理ERP系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Web自动化-日志收集

目标 1. 理解日志的相关概念 2. 掌握日志的基本用法 3. 掌握日志的高级用法 一、日志相关概念 目标 1. 了解日志的概念 2. 理解日志的作用 3. 掌握常见的日志级别 1. 日志 概念&#xff1a;日志就是用于记录系统运行时的信息&#xff0c;对一个事件的记录&#xff1b…

ppt转pdf的java实现

一、实现方式 java采用jacob包的功能&#xff0c;把ppt演示文稿转换为pdf。 支持文件格式&#xff1a;pptx,ppt 二、事先准备 1、依赖于office&#xff0c;需安装office办公软件 2、需要下载一个jacob-1.20-x64.dll的文件&#xff0c;放到java的bin目录下。 文件可以网上搜…

电影网站|基于SSM+vue的电影网站系统(源码+数据库+文档)

电影网站 目录 基于SSMvue的电影网站系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道…

贪心算法-----柠檬水找零

今日题目&#xff1a;leetcode860 题目链接&#xff1a;点击跳转题目 分析&#xff1a; 顾客只会给三种面值&#xff1a;5、10、20&#xff0c;先分类讨论 当收到5美元时&#xff1a;不用找零&#xff0c;面值5张数1当收到10美元时&#xff1a;找零5美元&#xff0c;面值5张数…

未授权访问:JBoss未授权访问漏洞

目录 1、漏洞原理  2、环境搭建 3、未授权访问 4、利用jboss.deployment getshell 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬…

【Ubuntu 安装erlang】

apt-get 安装 apt-get install erlang或 源码安装 git clone https://github.com/erlang/otp.git cd otp git checkout maint-25 # current latest stable version ./configure make make install安装完后&#xff0c;验证是否成功 # 命令行输入 erl

系统集成项目管理工程师第4章思维导图发布

2024年开年&#xff0c;软考系统集成项目管理工程师官方教程&#xff0c;迎来了阔别7年的大改版&#xff0c;改版之后的软考中项考试&#xff0c;离同宗兄弟高项考试渐行渐远。 中项第3版教程&#xff0c;仅仅从教程来看&#xff0c;其难度已经不亚于高级的信息系统项目管理师&…

数据结构与算法学习笔记三---循环队列的表示和实现(C语言)

目录 前言 1.为啥要使用循环队列 2.队列的顺序表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.空队列 6.队列长度 7.获取队头 8.入队 9.出队 10.遍历队列 11.完整代码 前言 本篇博客介绍栈和队列的表示和实现。 1.为啥要使用循环队列 上篇文章中我们知道了顺序队列…

Hive Transaction事务表(含实现原理)

Hive Transaction事务表 在Hive中&#xff0c;事务表&#xff08;Transactional Tables&#xff09;允许用户执行事务性操作&#xff0c;包括ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性。事务表是在Hive 0.14版本引入的&#xff0c;并且在后续版本中不断…

LabVIEW天然气压缩因子软件设计

LabVIEW天然气压缩因子软件设计 项目背景 天然气作为一种重要的能源&#xff0c;其压缩因子的准确计算对于流量的计量和输送过程的优化具有关键意义。传统的计算方法不仅步骤繁琐&#xff0c;而且难以满足现场快速响应的需求。因此&#xff0c;开发一款既能保证计算精度又便于…

使用Pandas对Data列进行基于顺序的分组排列

目录 一、引言 二、Pandas库简介 三、按照数据列中元素出现的先后顺序进行分组排列 四、案例分析 五、技术细节探讨与扩展应用 1. 技术细节 2. 扩展应用 3. 示例代码&#xff1a;用户行为分析 4. 进阶应用&#xff1a;分组后的聚合操作 5. 分组后的数据筛选 6. 分组…

【DevOps】Linux 安全:iptables 组成、命令及应用场景详解

导读&#xff1a;全面掌握 iptables&#xff1a;从基础到实践 在 Linux 系统中&#xff0c;iptables 是一个非常强大的工具&#xff0c;它不仅是系统管理员用来构建和管理网络防火墙的首选工具&#xff0c;而且也是一个功能丰富的网络流量处理系统。无论是进行包过滤、监控网络…

学习笔记:【QC】Android Q qmi扩展nvReadItem/nvWriteItem

一、qmi初始化 流程图 初始化流程: 1、主入口&#xff1a; vendor/qcom/proprietary/qcril-hal/qcrild/qcrild/rild.c int main(int argc, char **argv) { const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **); rilInit RIL_Init; funcs rilInit…

李彦宏回顾大模型重构百度这一年

“大模型我们走在最前面&#xff0c;我们需要去勇闯无人区&#xff0c;需要去冒前人没有冒过的风险。”近日&#xff0c;在百度一场内部颁奖活动中&#xff0c;百度创始人、董事长兼首席执行官李彦宏指出&#xff0c;百度一直坚信技术可以改变世界&#xff0c;会一直沿着这条路…