Bootstrap

51单片机中串口波特率的计算方法详解

首先,波特率并不是指每秒传送多少个字节,而是指每秒能够传送多少个二进制。举例:波特率为9600代表每秒能够传送9600个二进制,而一个字节=8个二进制。

那么,串口是按照什么时间标准来发送数据的?

其实,串口是在定时器计数时,每溢出一次发送一个二进制。溢出的意思就是假设我现在定时器设置为8位计数器,那么说明计数到256就会溢出,然后设置计数器的起始值为0,那么计数器开始工作后,将会从0开始,一个数一个数往上数(1,2,3.....),当达到256时,一次计数完成,这时候串口就会发送一个二进制。

既然这样,那么我们就要通过设置这个起始值的大小,来改变它没发送一个二进制所需要的时间。

在51单片机中,计数一次的时间时多少呢?也就是从1数到2间隔多长时间?

其实,在51单片机中,一个机器周期计数一次,而一个机器周期等于12个振荡周期。假设我们51单片机使用的晶振频率为12Mhz,那么振荡周期就是1/(12M),那么一个机器周期=1/(1M)。

通过上面的描述,大概就能推算出波特率的计算方法:

波特率 = (12M/12)/(256-起始值)

但结果并不是这样子,而是:

波特率 = [(12M/12)/(256-起始值)]*((2^mod)/32)

这其实是因为单片机中为我们提供了串口的几种方式:(方式0,1,2,3),详细内容自己查询

上面的公式为方式一的公式,为什么要在加上后面的括号内容呢?

其实起初的公式是我们自己根据单片机晶振频率推算出来,但是单片机串口中提供的方法不是直接用单片机的晶振频率,而是将它进行32分频,而2^mod也是这种方法提供给我们用来选择分频后放大几倍,假如现在你选择mod为1,则放大2倍。(就是一种先分频后倍频的感觉,我感觉这么做是为了好让用户可以自己选择放大倍数,至于真实原因不必深究)

;