嵌入式单片机基础篇(二十三)之串口通信

stm32F1以及51单片机串口通信详解

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

1、连线: 如图所示:我们先记住四条线,分别是电源线,地线,以及发送和接收线
既然两个单片机要通讯,那么一个发送一个接收,那么肯定是一个单片机的发送端连接到另一个单片机的接收端,就像两个人说话,一个用嘴说,一个用耳朵听,那么话语就是其中的抽象连线
2、数据的传输格式
(1)核心思想:就是低位先发高位后发(也就是说先发低位比如01234567位先发0,如果是二进制数据11100100先发0)
(2)数据的本质是什么?答案:电平状态
比如:
发送一个 0xE4 这个数据,用二进制形式表示就是 0b11100100,在 UART 通信过程中,是低位先发,高位后发的原则,那么就让 TXD首先拉低电平,持续一段时间,发送一位 0,然后继续拉低,再持续一段时间,又发送了一位 0,然后拉高电平,持续一段时间,发了一位 1……一直到把 8 位二进制数字 0b11100100全部发送完毕。
(3)数据传输格式是什么?答案:数据包
每个数据包包含1个起始位,5至9个数据位(一般是8位),可选的奇偶校验位(一般不设置)和1或1.5或2个停止位(一般是1位),协议如下:
在这里插入图片描述
在这里插入图片描述
如图:我们可以很清晰明了的看出数据包包含4种数据位类型,终结起来就是:起始>>数据>>校验>>停止
其实是和我们生活中做事是一样的总要有个开始和结束,然后包含事情的内容以及检查一下做的事到底对不对,当然啦,现实中的事情往往复杂的多,毕竟很多事往往无疾而终……
3、数据传输的动力:波特率
那么波特率的作用是什么?答案:其实说白了就是告诉单片机多久发送一个数据包
比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。
在电子通信领域,波特(Baud)即调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数。
波特率表示每秒钟传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,1波特即指每秒传输1个符号。
数据传输速率使用波特率来表示。单位bps(bits per second),常见的波特率9600bps、115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例子,如果串口波特率设置为115200bps,那么传输一个比特需要的时间是1/115200≈8.68us。
在这里插入图片描述
以上就是串口通信的原理,其实总结起来一句话:
以波特率为动力发送数据包!!!(so easy)
原理有了那么具体怎么实现传输数据的功能呢?就像道理大家都懂就是不会做事情
下面我们以51单片机以及stm32单片机为例,分别写一下串口通讯的驱动代码:
4、软件驱动:
4.1 51单片机:
4.1.1 80C51串行口的结构
在这里插入图片描述
有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。
4.1.2 串行口的控制寄存器(SCON)
用以设定串行口的工作方式、接收/发送控制以及设置状态标志:
在这里插入图片描述
SM0和SM1为工作方式选择位,可选择四种工作方式:
在这里插入图片描述
SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。
REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。
RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。
TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。
看起很复杂,但是实际上没有啥东西:比如,我们选择方式1,那么只需将sm0=0,sm1=1,记忆:01,使能位REN=1;TI和RI就是中断标志位而已,我们需要做的就是软件清零而已,TB8通常不用
SCON=0X50;这是什么意思?解析成2进制就是0000 0000 0101 0000
我们主要看低8位:0101的前面两个数代表方式1,sm2=0,并使能,接收到的数据直接进入Buff并且使RI=1,这个时候需要我们在中断函数里将标志位清0即可
4.1.3 PCON功率控制寄存器中只有一位SMOD与串行口工作有关 :
在这里插入图片描述
SMOD(PCON.7) 波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
这里不要想那么复杂只需要做一件事情:PCON=0X80; 这条语句应该可以看得懂
4.1.4波特率的计算(用波特率计算器)
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
T1 溢出率 = fosc /{12×[256 -(TH1)]}
在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。
在这里插入图片描述
4.1.5串口如何使用?
(1)确定串行口控制(编程SCON寄存器);
(2)确定T1的工作方式(编程TMOD寄存器);TMOD=0X20;
(3)计算T1的初值,装载TH1、TL1;
(4)启动T1(编程TCON中的TR1位);
4.1.6定时器知识点:
定时器/计数器的结构
定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时器/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
在这里插入图片描述
定时器/计数器的工作原理
计数器输入的计数脉冲源
系统的时钟振荡器输出脉冲经12分频后产生;
T0或T1引脚输入的外部脉冲源。
计数过程
每来一个脉冲计数器加1,当加到计数器为全1(即FFFFH)时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时器/计数器中断允许时)。如果定时器/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
定时应用
用作定时器:此时设置为定时器模式,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t 。
计数运用
用作计数器:此时设置为计数器模式,外部事件计数脉冲由T0或T1引脚输入到计数器。每来一个外部脉冲,计数器加1。但单片机对外部脉冲有基本要求:脉冲的高低电平持续时间都必须大于1个机器周期。
工作方式寄存器(TMOD)
在这里插入图片描述
GATE:门控位。
GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时器/计数器工作;(即需要一个启动条件)
GATE=1时,要用软件使TR0或TR1为1,同时外部中断引脚也为高电平时,才能启动定时器/计数器工作,即需要两个启动条件。
C/T :定时/计数模式选择位。
C/T =0为定时模式; C/T =1为计数模式。
M1M0:工作方式设置位。
计数器工作方式选择
M1 M0 工 作 方 式 功 能 说 明
0 0 方式0 13位计数器
0 1 方式1 16位计数器
1 0 方式2 自动重装8位计数器
1 1 方式3 定时器0:分成两个8位
定时器1:停止计数
定时器/计数器的控制
控制寄存器TCON
TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时器/计数器的启动和中断申请。其格式如下:
在这里插入图片描述
TF1(TCON.7)࿱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值