个人对单片机串口波特率的理解

波特率就是串口每秒发送的位数,也可以看成发送的频率。在每一个周期上可以携带1 bit的数据,因此频率(波特率)越高,发送数据的效率就越高。
在单片机中用串口通信计算波特率的方法:
串行口工作方式为方式1:
 (波特率=(2^SMOD)/32)定时器T1的溢出率
 定时器T1的溢出率=单片机内部时钟频率/(256-X)
X是定时器的初值
 波特率=(2^SMOD)/32
(单片机内部时钟频率/(256-X))

对公式的理解:
我们要计算波特率,实际就是要计算如何得到我们想要的频率。
我们单片机的晶振频率一般为11.0592 MHZ。而我们如果想要得的频率为9600(波特率),很显然晶振频率要远远大于我们实际想要的。这时,我们就需要通过软硬件的计算方法得到波特率。
改变频率的方法:
1、 单片机内部的分频电路,有12分,32分等。
2、 利用内部定时器产生中断。
我们的公式也是围绕上面两种方法来理解的。
溢出率=单片机内部时钟频率/(256-X)
溢出率就是我们定时器利用内部时钟来得到我们想要的频率。
我们的定时器采用的是8位自动重载的方式。意思就是每到加到256时,就会溢出并产生中断并改变脉冲正负或不改变。因此我们就可以通过设置 X 初值的大小让定时器从X加起,根据X到256的大小来得到我们想要的频率。
例如:当我们晶振频率为11.0592 MHZ,经过12分频后单片机内部时钟频率就为
(11.0592 MHZ/12)。那么内部的机器周期就为(1/(11.0592 MHZ/12)),大约为1us。
我们定时器加1一次,就是过去一机器周期(1us),我们通过改变X的大小,这样就可以得到 定时器的周期 (256-X)us。每隔(256-X)us就会产生溢出和中断。

以前我们是1us发送一位数据,而现在我们要(256-X)us才发送一位数据,这样我们改变频率的目的就达到了。
所以溢出率的公式理解就是,我们利用定时器改变频率后 一秒要发送的数据位数(波特率)。

然而,我们发现利用定时器改变后,发送的频率还是太大了。
这时,我们可以利用分频电路再来改变频率,32分频或16分频。
32分频还是16分频,取决于我们设置的SMOD,为1时波特率加倍,那么就要加大频率,使用16分频。为0时,32分频。
我们将定时器改变频率后得到的溢出率除32或16那么,就可以得到我们可以在串口上使用的波特率大小了。

通常我们计算波特率设定定时器值时,我们先用fosc/12/32,先12分频在32分频,然后fosc/12/32/波特率,得到在定时器中加一的次数,然后用 256-fosc/12/32/波特率,就是我们要设定的定时器初值。

串行口工作方式:

串行口分四种工作方式,由SM0、SM1二位决定,其定义如下:
SM0、SM1 工作方式 功能描述 波特率
0 0 方式0 8位移位寄存器 Fosc/12 (固定波特率)
0 1 方式1 10位UART 可变 (一般常用)
1 0 方式2 11位UART Fosc/64或fosc/32 (固定波特率,64还是32取决于是否波特率加倍)
1 1 方式3 11位UART 可变
(1)方式0:串行口的工作方式0为移位寄存器I/O方式,可外接移位寄存器,一扩展I/O口,也可外接同步I/O设备。
发送操作:当执行一条“MOV SBUF,A”指令时,启动发送操作,由TXD输出移位脉冲,由RXD串行SBUF中的数据。发送完8位数据后自动置TI=1.请求中断。要继续发送时,TI必须有指令清零。
接收操作:REN是串行口接收允许控制位。REN=0时禁止接收;REN=1时允许接收。当软件将REN置“1”时,即开始从RXD端口以fosc/12波特率输入数据,当接收到8位数据时,将中断标志RI置“1”。再次接收数据之前,必须用软件将RI清0。
(2)方式1:串行口位10位通用异步接口。发送或接收一帧数据信息为10位,包括1位起始位“0”、8位数据位、1位停止位“1”。
发送数据:数据从TXD端口输出,当数据写入发送缓冲器SBUF时,就启动发送器发送。发送完一帧数据后,置中断标志TI=1,申请中断,通知CPU可以发送下一个数据了。
接收数据:首先使REN=1(允许接收数据),串行口从RXD接收数据,当采样到1至0跳变时,确认是起始位“0”,就开始接收一帧数据,当接收完一帧数据时,置中断标志RI=1,申请中断,通知CPU从SBUF取走接收到的数据
(3)方式2:串行口为11位异步通信接口。发送或接收一帧信息包括1位起始位“0”、8位数据位、1位可编程位、1位停止位“1”。
发送数据:发送前,先根据通信协议由软件设置TB8为“奇偶校验位”或“数据标识位”,然后将要发送的数据写入SBUF,即能启动发送器。发送过程是由执行任何一条以SBUF为目的寄存器的指令而启动的,把8位数据装入SBUF,同时还把TB8装到发送移位寄存器的第9位上,然后从TXD(P3.1)端口输出一帧数据。
接收数据:先置REN=1,使串行口为允许接收状态,同时还要将RI清“0”。然后再根据SM2的状态和所接收到的RB8的状态决定此串行口在信息到来后是否置R1=1,并申请中断,通知CPU接收数据。当SM2=0时,不管RB8为“0”还是为“1”,都置RI=1,此串行口将接收发送来的信息。当SM2=1时,且RB8=1,表示在多机通信情况下,接收的信息为“地址帧”, 此时置RI=1, 串行口将接收发来的地址。当SM2=1时,且RB8=0,表示在多机通信情况下,接收的信息为“数据帧”, 但不是发给本从机的,此时RI不置为“1”,因而SBUF中接收的数据帧将丢失。
(4)方式3:为波特率可变的11位异步通信方式,除了波特率有所区别之外,其余方式都与方式2相同。

串口的工作方式—51系列单片机
串行口分四种工作方式,由SCON中的SMO、SM1二位选择决定。
1.方式0
(1)特点
1.用作串行口扩展,具有固定的波特率,为Fosf/12。
2.同步发送/接收,由TXD提供移位脉冲,RXD用作数据输入/输出通道。
3.发送/接收8位数据,低位在先。
(2)发送操作
当执行一条“MOV SBUF,A”指令时,启动发送操作,由TXD输出移位脉冲,由RXD串行发送SBUF中的数据。发送完8位数据后自动置TI=1,请求中断。要继续发送时,T1必须有指令清零。
(3)接收操作
在RI=0条件下,置REN=1,启动一帧数据的接收,由TXD输出移位脉冲,由RXD接收串行数据到A中。接收完一帧自动置位RI,请求中断。想继续接收时,要用指令清零RI。
2.方式1
(1)特点
1.8位UART接口。
2.帧结构为10位,包括起始位(为0),8位数据位,1位停止位。
3.波特率由指令设定,由T1的溢出率决定。
(2)发送操作
当执行一条“MOV SBUF,A”指令时,启动发送操作,A中的数据从TXD端实现异步发送。发送完一帧数据后自动置TI=1,请求中断。要继续发送时,TI必须由指令清零。
(3)接收操作
当置REN=1时,串行口采样RXD,当采样到1至0的跳变时,确认串行数据帧的起始位,开始接收一帧数据,直到停止位到来时,把停止位送入RB8中。置位RI请求中断。CPU取走数据后用指令清零RI。
3.方式2和方式3
方式2和方式3具有多机通信功能,这两种方式除了波特率不同以外,其余完全相同。
(1)特点
1.9位UART接口。
2.帧结构为11位,包括起始位(为0)、8位数据位、1位可编程位TB8/RB8和停止位(为1)。
3.波特率在方式2时为固定FOSC/32或FOSC/64,由SMOD位决定,当SMOD=1时,波特率为FOSC/32;当SMOD=0时,波特率为FOSC/64。方式3的溢出率由T1的溢出率决定。
(2)发送操作
发送数据之前,由指令设置TB8(如作为奇偶校对位或地址/数据位),将要发送的数据由A写入SBUF中启动发送操作。在发送中,内部逻辑会把TB8装入发送移位寄存器的第9位位置,然后发送一帧完整的数据,发送完毕后置位TI。TI须由指令清零。
(3)接收操作
当置位SEN位且RI=0时,启动接收操作,帧结构上的第9位送入RB8中,对所接收的数据视SM2和RB8的状态决定是否会使RI置位。
当SM2=0时,RB8不论什么状态RI都置1,串行口都接收数据。
当SM2=1时,为多机通信方式,接收到的RB8为地址/数据表识位。
当RB8=1时,接收的信息为地址帧,此时置位RI,串行口接收发送来的数据。
当RB8=0时,接收的信息为数据帧,若SM2=1时,RI不会置位,此数据丢弃;若SM2=0,则SBUF接收发送来的数据。

发布了3 篇原创文章 · 获赞 1 · 访问量 506
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览