[讨论] 哪个坛友知道波特率误差是如何计算出来的?

QWE4562009   2020-10-12 18:40 楼主

哪个坛友知道波特率误差是如何计算出来的?

  • 164949wrrcemrflv7aryyl.jpg

回复评论 (51)

你需要先把SMOD=0和SMOD=1是什么意思搞清楚,然后把异步串行通讯如何进行搞清楚,最后把51单片机如何产生异步串行通讯的波特率搞清楚。

点赞  2020-10-12 19:20

Baud.jpg 注意红色线联接的两个数字是相同的,一个是SMOD=0情况,另一个是SMOD=1情况,二者波特率恰是二倍关系。

点赞 (1) 2020-10-12 19:27

想计算波特率误差,先要知道如何计算波特率,是吧?

点赞  2020-10-12 19:32

你先学习一下计算波特率的公式,然后将相应的参数带入进去,得到的波特率与想要的相差多少,这就可以得到误差了。而且这些是别人已经整理好的了,如果你不计较这些的话,直接用就可以了。

点赞 (1) 2020-10-12 19:42
引用: maychang 发表于 2020-10-12 19:32 想计算波特率误差,先要知道如何计算波特率,是吧?

我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值  比如需要115200的波特率  而时钟频率是24M  假如是4分频    就是{[24000000/4]/[24000000/4/115200]-115200}/115200  *100%   对不对??

  • 邮洽图片20201013145646.jpg
点赞  2020-10-13 15:02
引用: QWE4562009 发表于 2020-10-13 15:02 我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值  比如需要115200的波特率 ...

先不要管定时器2。51单片机只有定时器0和定时器1,没有定时器2。52单片机才有定时器2。

点赞  2020-10-13 15:24
QWE4562009 发表于 2020-10-13 15:02 我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值  比如需要115200的波特率 ...

51单片机必须接石英晶体(也可以用压电陶瓷)作为时针发生器。

对51单片机来说,12个石英晶体振荡周期为一个时钟周期。别问为什么,硬件就是这样设计的。石英晶体频率为12MHz时,一个时钟周期就是1us。石英晶体频率为6MHz时,一个时钟周期就是2us。石英晶体频率为4MHz时,一个时钟周期就是3us。石英晶体频率为3MHz时,一个时钟周期就是4us。依此类推。

定时器1有几种工作方式。用于波特率发生器,定时器1通常工作于8位自动重装方式(模式2)。定时器1工作于8位重装方式时,高8位相当于一个8位寄存器,可以事先写入数据,低8位是计数器,对时钟周期计数。高8位溢出时,自动将低8位所存储的数据重新装入高8位,仍然对时钟周期计数。

所以如果石英晶体频率为12MHz,定时器1高8位存储数据为FFH(255),每个时钟周期(1us)定时器1低8位产生一次溢出(从FFH只计一个数就到了00H,也就是256)。定时器1高8位存储数据为FEH(254)时,每两个时钟周期(2us)定时器1低8位产生一次溢出。

如果石英晶体频率为6MHz,定时器1高8位存储数据为FFH(255),每个时钟周期(2us)定时器1低8位产生一次溢出(从FFH只计一个数就到了00H,也就是256)。定时器1高8位存储数据为FEH(254)时,每两个时钟周期(4us)定时器1低8位产生一次溢出。

如果石英晶体频率为4MHz,定时器1高8位存储数据为FFH(255),每个时钟周期(3us)定时器1低8位产生一次溢出(从FFH只计一个数就到了00H,也就是256)。定时器1高8位存储数据为FEH(254)时,每两个时钟周期(6us)定时器1低8位产生一次溢出。

本帖最后由 maychang 于 2020-10-13 15:48 编辑
点赞 (1) 2020-10-13 15:42
QWE4562009 发表于 2020-10-13 15:02 我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值  比如需要115200的波特率 ...

定时器1低8位每秒产生多少次溢出,称为定时器1低8位的溢出率。所以,石英晶体频率为12MHz,定时器1高8位事先存储数据为0xE6(230)时,定时器1低8位每26us溢出一次,或者说每秒溢出38461.54次。石英晶体频率为6MHz,定时器1高8位事先存储数据为0xE6(230)时,定时器1低8位每52us溢出一次,或者说每秒溢出19230.77次。

本帖最后由 maychang 于 2020-10-13 16:25 编辑
点赞 (1) 2020-10-13 15:59
maychang 发表于 2020-10-13 15:24 先不要管定时器2。51单片机只有定时器0和定时器1,没有定时器2。52单片机才有定时器2。

石英晶体频率确定后,要改变定时器1低8位的溢出率,只能改变定时器1高8位预装值。此预装值越大,定时器1低8位的溢出率越高。最大只可能到FFH(255),此时定时器1低8位溢出率为石英晶体频率的1/12。

本帖最后由 maychang 于 2020-10-13 16:13 编辑
点赞  2020-10-13 16:00
QWE4562009 发表于 2020-10-13 15:02 我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值  比如需要115200的波特率 ...

当SMOD=0时,定时器1低8位溢出率将除以32(分频。别问为什么,硬件就是如此设计的),但SMOD=1时,定时器1低8位溢出率将除以16,这就是你采用的实际波特率。

例如,石英晶体频率12MHz,定时器1高8位预装值E6H,SMOD=1,38461.54/16=2403.85,这就是你采用的实际波特率。也就是说,异步串行通讯每位占用时间为1/2403.85=0.000416秒。

本帖最后由 maychang 于 2020-10-13 16:32 编辑
点赞 (1) 2020-10-13 16:22
引用: QWE4562009 发表于 2020-10-13 15:02 我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值  比如需要115200的波特率 ...

至于这种情况(石英晶体频率12MHz,定时器1高8位预装值E6H,SMOD=1)下,波特率误差是多少,自己算吧。

点赞  2020-10-13 16:31
引用: QWE4562009 发表于 2020-10-13 15:02 我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值  比如需要115200的波特率 ...

如果石英晶体频率6MHz,定时器1高8位预装值E6H,SMOD=1,那么你的实际波特率就只有1201.92。

点赞  2020-10-13 16:45
引用: QWE4562009 发表于 2020-10-13 15:02 我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值  比如需要115200的波特率 ...

"有人说直接 用时钟频率/分频数/定时器初值"

那是胡说。

点赞  2020-10-13 16:47

楼主到底是干什么的?还弄这些。。。好跳跃

默认摸鱼,再摸鱼。2022、9、28
点赞 (1) 2020-10-13 21:00
引用: freebsder 发表于 2020-10-13 21:00 楼主到底是干什么的?还弄这些。。。好跳跃

遇到了 就问下  硬件的

点赞  2020-10-14 15:41
引用: maychang 发表于 2020-10-13 16:45 如果石英晶体频率6MHz,定时器1高8位预装值E6H,SMOD=1,那么你的实际波特率就只有1201.92。

这个预装值是怎么来的  

点赞  2020-10-14 15:42
引用: maychang 发表于 2020-10-13 16:00 maychang 发表于 2020-10-13 15:24 先不要管定时器2。51单片机只有定时器0和定时器1,没有定时器2。52单 ...

这个溢出率是啥玩意?65535-初值?

点赞  2020-10-14 15:43
引用: QWE4562009 发表于 2020-10-14 15:42 这个预装值是怎么来的  

“这个预装值是怎么来的”

单片机初始化时由你自己写入定时器1高8位,即写入TH1。

点赞  2020-10-14 15:44
引用: maychang 发表于 2020-10-13 15:59 QWE4562009 发表于 2020-10-13 15:02 我看了下  但是真的没看懂 有人说直接 用时钟频率/分频数/定时 ...

溢出之后要怎么处理?溢出就是装满的意思吧  就是65535满了?

点赞  2020-10-14 15:44
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复