> 文档中心 > 猿创征文|『51单片机』串口通信

猿创征文|『51单片机』串口通信


🚩write in front🚩  

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 星级博主~掘金⇿InfoQ创作者~周榜137﹣总榜1040⇿全网访问量30w+🏅
🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠
 📝个人主页-謓泽的博客_CSDN博客 📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏-【51单片机】系列_謓泽的博客-CSDN博客🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩 
💬本系列哔哩哔哩江科大51单片机的视频为主以及博主自己的总结梳理📚

目录标题🖍

🚩write in front🚩  

🍋串口introduce

🍈陀螺仪

🍈蓝牙串口模块

🍎下载注意

🍊接口及引脚定义 

🍊串口通信的优缺点 

🌲优点

🌳缺点

🌴例如

🍊硬件电路 

🍊电平标准 TTL - RS

🍋通信方式相关术语

🍋51单片机的UART[串口]

🍈USB自动下载电路原理图

🍊串口的参数以及时序图 

㈠波特率解释

㈡校验位解释

㈢停止位

🍊串口模式图 

🍊控制波特率 - 时钟

🍈SBUF⇢串口数据缓存寄存器

🍊串口和中断系统逻辑图 

🍊串口相关寄存器 

🍈波特率计算

🍋串口introduce

串口是一种应用十分广泛的通讯接口(在工业控制领域它的运用是十分广泛的),串口成本低,容易使用,通信线路简单,可实现两个设备的互相通信。⇨ 这个概念十分的重要

单片机的串口可以使单片机与单片机,单片机与单片机『USB和转串口可以实现通信』

单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。串口和定时器一样都是单片机的内部资源 (●'◡'●)

五一单片机内部自带串口UART(Universal Asynchronous Receiver Transmitter) 通用异步收发器可实现单片机的串口通信。注:在不是很严格的情况下说 UART 是串口也是可以的。

在上图中的第一个是我们的 USB 接口,那么这个就需要这个模块左边是插 USB 右边是串口的一个线路,它就可以直接和我们的单片机进行一个连接。

🍈陀螺仪

上图当中的第②张图片名为:陀螺仪『它增强了单片机系统的硬件实力』⇢ 从这句话我们就可以看出我们单片机是一个芯片,它的一个内部资源是有限的,但是它可以从串口和其它设备进行一个通信。如果说一个人的能力是有限的,那么我叫一群人的能力不就是无限的吗?其原因是因为内部资源扩大了。因为增加了外部模块,同理也是一样的。

🍈蓝牙串口模块

下图当中的是第③个名为:蓝牙串口 下面的四根线是串口的一个接口,上面的四根线是我们蓝牙的一个模块。而且这个还非常的集成化,就是你完全不需要知道它的一个蓝牙模式的一个协议,另一头是可以达到进行一个手机的一个通信(单片机的数据发送到手机上)有时间的话博主也会写一篇关于使用蓝牙模块的文章的(╹ڡ╹)

🍎下载注意

在使用 STC - ISP 使用串口助手的串口号必须和下载的串口号对应一致。

因为在单片机当中下载程序也是通过串口通信,就是在我们程序当中写好的时候也是通过串口下载进去到单片机当中去的。

🍊接口及引脚定义 

串口的标准接口叫做DB9,如下图所示↓

这种接口现在的笔记本电脑已经没有这种接口了基本都已经被取消或者是淘汰了,如果是你使用的台式机箱的话,肯定是会有这个接口的。这种接口叫做串口。还有的是这种接口是9个针头的,当然在台式机或者是电脑上还有另外一种接口叫做是VGA接口,VGA接口和这种串口接口长得非常相似。VGA接口是传输视频的,像我们电脑和投影仪的话就可以使用我们这个 VGA 接口,主机和显示屏也可以使用VGA接口。它是可以用来传输视频的,而串口是单独用来传输数据的,这两种的接口是完全不一样的,只是它们的外观长得比较相向,所以大家不要弄错了。注意这个电压最大可达 15 V,所以不要直接把这个接口引出线去接到我们的单片机上,轻则"单片机去世",重则"电脑去世"。用之前一定要了解它的一个电平协议。 

🍊串口通信的优缺点 

数据在单条一位宽的传输线上,一比特接一比特地按顺序传送的方式称为串行通信。在并行通信中,一个字节【8位】数据是在⒏条并行传输线上同时由源传到目的地;而在串行通信方式中,数据是在单条1位宽的传输线上一位接一位地顺序传送。这样1个字节的数据要分8次由低位到高位按顺序一位位地传送。由此可见,串行通信的特点如下↓ 

🌲优点

⒈节省传输线,这是显而易见的。尤其是在远程通信时,此特点尤为重要。这也是串行通信的主要优点。

🌳缺点

⒉数据传送效率低。与并行通信比,这也这是显而易见的。这也是串行通信的主要缺点。

🌴例如

例:传送一个字节,并行通信只需要1T的时间,而串行通信至少需要8T的时间。由此可见,串行通信适合于远距离传送,可以从几米到数千公里。对于长距离、低速率的通信,串行通信往往是唯一的选择。并行通信适合于短距离、高速率的数据传送,通常传输距离小于30米。特别值得一提的是,现成的公共电话网是通用的长距离通信介质,它虽然是为传输声音信号设计的,但利用调制解调技术,可使现成的公共电话网系统为串行数据通信提供方便、实用的通信线路。

🍊硬件电路 

简单双向串口通信有两根通信线『发送端TXD接收端RXD

发送端TXD接收端RXD交叉连接 【看它的名字就知道了】

当只需单向的数据传输时,可以直接一根通信线。

就是只需要设备1TXD到设备2RXD 然后TXD设备2到RXD设备1就不需要了。

当电平标准不一致时,需要加电平转换芯片。

🍊电平标准 TTL - RS

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种↓ 

TTL电平: +5V表示1,0V表示0 我们单片机使用的电平就是TTL电平

RS232电平: -3V~-15V表示1,+3V~+15V表示0 → 注:这里是反逻辑 [0为1-1为0]

RS485电平:两线压差为 +2V~+6V 表示1,-2V~-6V表示0【差分信号】

RS485电平最高可以达到1km的一个传输数据,仅仅使用了差分信号。常见通信接口比较 

名称

引脚定义

通信方式

特点

UART

TXD(发送)       RXD(接收)

   全双工、异步

点对点通信

I²C

SCL[时钟线]、SDA

半双工、同步

可挂载多个设备

SPI

SCLK[时钟线]、MOSI、MISO、CS

全双工、同步

可挂载多个设备

1-Wire

DQ

半双工、异步

可挂载多个设备

🍎注意→可以挂载多个设备都可以叫做是“总线”,所以在这里只有UART不是总线。

🍋通信方式相关术语

全双工:通信双方可以在同一时刻互相传输数据。

半双工:通信双方可以互相传输数据,但必须分时复用一根数据线。

单工:通信只能有一方发送到另一方,不能反向传输。

异步:通信双方各自约定通信速率。

同步:通信双方靠一根时钟线来约定通信速率。

解释异步和同步的概念-意思是当我们通信的时候肯定会有一个速率,比如说我们有一个电平是从1~0的一个电平之间转换发送过去。但是说我们两者是需要一个速率的。

总的来说的话↓

异步→不会那么的同步。同步→时间很严格因为它是靠一根时钟线来约定的。

注→一般来说同步的会带一根时钟线而异步的话是不会带时钟线的。

总线→连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

此外还有:CAN(一般用于汽车🚗领域上面,稳定性好)、USB等。

🍋51单片机的UART[串口]

在STC89C52单片机的芯片上集成了⒈个 UART串口。高级的单片机上可能会有多个UART。

STC89C52的UART有四种工作模式就像定时器一样也是拥有④种工作模式 如下所示↓

⒈模式0:同步移位寄存器。

⒉模式1:8位UART[⒈个字节],波特率可变。

由于这里模式1是最常用的一个工作模式 那么接下来我们就来详细讲解下模式1的工作模式。

⒊模式2:9位UART,波特率固定。

⒋模式3:9位UART,波特率可变。

串口是通信设备·单片机的内部资源,是不需要像"LED" "数码管"一样有外部资源使用的。

注⇢P3.0和P3.1它是和RXD和TXD共用的一个线,那么这个时候那么应该怎么进行区分。

这个其实不用进行区分,看你操作的是哪个寄存器是谁就可以了。如果你操作的是P3_0和P3_1端口上的寄存器的话那么所用的就是IO口,如果你是直接操作串口的寄存器的话那么就通过IO来进行传输数据。我们不操作串口的话就自动为IO口的功能的。

🍈USB自动下载电路原理图

在上述图片当中就是用USB转串口当中的电路。 功能→把USB的电平协议转换成串口电平协议。

🍊串口的参数以及时序图 

㈠波特率解释

波特率⇢串口通信的速率『发送和接收各数据位的间隔时间』就是表示传输数据的快慢(s)

异步[UART]-通信双方各自约定通信速率。

拓展→比特率[bit]这个就是传输多少位,但是波特率和比特率表示的意思都是差不多的都是表示传输的快慢。

波特率越高,响应速度将提高,反应快了,受干扰的可能性越大,当然能否设置高波特率,与PLC和其他仪表等都有关系。波特率低的话,响应速度将变慢。不论用哪种速率,前提是设备首先支持该速率,其次能否满足应用要求,同时没有误码。

㈡校验位解释

校验位⇢用于数据验证。

比如8位=1字节,校验位会在⑧位后面再+①位。这多余的一位可以用来校验,校验前面的数据是否是正确的。奇偶校验是一个比较简单并且从常用的方法。

比如说⇢没有校验就是我发送一个数据 1010 1010[0x99] 发送给你接收到了,那么你怎么知道你接收的数据是正确的万一发送的数据某一个数据1变成了0那么怎么办。

所以,我们就会在后面跟了一位奇偶校验验。

例→比如说我们双方都约定了都使用的是奇检验配置。

比如 0000 0011 — 那我们就在后面+1,此时位为【0000 0011 1】那为什么要在后面+1呢。我们可以数一下这个数据为当中有几个⒈在上面数据当中有⒉个⒈,有两个⒈的话就是为偶数,那么我就可以在校验位上后面就补①个⒈,这样就保证这⒐位中⒈的个数是奇数。因为我们在其校验位上多加了一个⒈,那么它所接收到的位也就是【0000 0011 1】它也发现此时⒈的个数是为奇数。那么此时是奇数的话那么这个数据就正确的【一定程度上是可以检测到的】

再比如→【1110 0000】这里有⒊个奇数,所以我们后面校验位只需要跟上0即可。如果采用的偶检验也是同理的保证⒈的个数是偶数,那么我们就可以在校验位上加上⒈即可。

㈢停止位

停止位⇢用于数据帧间隔[⒈个数据字节⒏位发完之后它是需要一个时间进行停止的]先发高位从高到低发送,接收也是一位一位的进行接收。 

🍊串口模式图 

在上述图当中就是串口的模式图是串口是怎么样进行内部的接收和发出的。

注意串口模式都是在单片机内部的东西[MCU]

然后再外部引出两根引脚,一个是TXD(发送端)还有一个是RXD(接收端)

箭头指的是单片机的总线,就说明数据只有到总线之后单片机才可以操作这些东西。

🍊控制波特率 - 时钟

如上图所示:用来控制波特率,串口需要约定速率,靠的是定时器来约定速率。

T1的溢出率经过二分频、十六分频或者是直接十六分频,然后控制 收发器(发送控制器、接收控制器)的采样时间。在这里我们要控制T1控制收发的速率。

🍈SBUF⇢串口数据缓存寄存器

物理上是两个独立的寄存器,但占用相同的地址[99H - 十六进制的⒐⒐]

写操作时候写入的是发送寄存器,读操作时候是读出的接收寄存器。

那么这句话是什么意思呢。解释如下↓

就是⇢我们需要把⒏位的数据写到这个SBUF缓存里面,然后我们再去控制它。然后,发出去TXD[发送端]。接收从RXD进行接收到达移位寄存器一位一位的再次移动到另一个SBUF缓冲区这里来,我们想要数据时候直接把我们想要的缓冲区给读出来就好了。

再程序当中如果SBUF在左边就是被赋值的量 比如:SBUF = 0x01;那么此时就是放入发送寄存器SBUF然后就会自动发送出去。那么读出来的时候就是→定义一个变量a的。

a = SBUF;[这里SBUF在等号的左边就是被赋值的量] 读的时候那么就是从接收端的RXD开始。当收到一位数据的时候数据会申请一个 TI 就会进行一个发送中断RI也是一样的。

如果有数据过来的时候如果收到一个字节也就是⒏bit位 就会产生 RI 接收中断一旦开始中断,就会进入中断函数。

🍊串口和中断系统逻辑图 

注→控制门和控制器这个是不需要管的是它内部自动运转的。

有⒉个SBUF串口数据缓存寄存器,①个是发出去的数据另外①个是接收到的数据。我们写入数据就会通过这些东西[控制门、发送控制器]TXD发出去。一旦有数据的话通过这些电路[接收控制器,移位寄存器]把它给接收回来。然后发送完成和接收完成都会有相对应得中断。

拓展→void UART_Routine interrupt4 表示(串口中断)

TI 和 RI 占用的都是同一个中断通道,于是我们就需要进行判断到底是TI还是RI判断是哪一个中断。比如说发送TXD完成之后触发TI的中断,然后大于等于1实际上是一个或门。或:有其中一个中断那么就会进来把ES[使能串口]和EA[使能所有中断]打开的时候。PS设置优先级如果给0的话进的就是低优先级给1的话就是给的是为高优先级。

PS在这里默认即可,优先级是中断比较多的时候才会进行处理。

⒈个中断就没有必要配置的。

🍊串口相关寄存器 

串口这个寄存器就是相当于按钮,也可以是指示灯或者是数据的什么。

SCON是控制这个电路如何运转开关怎么拨。里面有很多位可以。控制这个电路

SBUF是串口数据缓存寄存器,发送的数据存储到这里。

PCON是电源管理寄存器其中有SMOD和SMOD0这两位是控制串口的,之所以放在电源这里可能是单片机当中资源有点紧张。然后串口又多了所以分配到电源管理寄存器当中去了。

IE是允许中断标志当种有EA和ES是这个中断控制的东西与串口有关。

🍈波特率计算

注→在STC-ISP下载器上可以自动帮我们进行波特率的一个计算器。

 

SMOD 是决定要不要进行波特率加倍的。

fosc 晶振频率。51单片机的晶振频率一般为12或11.0592(MHZ) 注:在串口通信上我们一般都是用11.0592(MHZ)因为用12MHZ它会产生百分之五的一个误差算出的结果会有小数。