你先学习一下计算波特率的公式,然后将相应的参数带入进去,得到的波特率与想要的相差多少,这就可以得到误差了。而且这些是别人已经整理好的了,如果你不计较这些的话,直接用就可以了。
引用: maychang 发表于 2020-10-12 19:32 想计算波特率误差,先要知道如何计算波特率,是吧?
我看了下 但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值 比如需要115200的波特率 而时钟频率是24M 假如是4分频 就是{[24000000/4]/[24000000/4/115200]-115200}/115200 *100% 对不对??
引用: QWE4562009 发表于 2020-10-13 15:02 我看了下 但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值 比如需要115200的波特率 ...
先不要管定时器2。51单片机只有定时器0和定时器1,没有定时器2。52单片机才有定时器2。
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 编辑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 编辑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 编辑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 编辑引用: QWE4562009 发表于 2020-10-13 15:02 我看了下 但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值 比如需要115200的波特率 ...
至于这种情况(石英晶体频率12MHz,定时器1高8位预装值E6H,SMOD=1)下,波特率误差是多少,自己算吧。
引用: QWE4562009 发表于 2020-10-13 15:02 我看了下 但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值 比如需要115200的波特率 ...
如果石英晶体频率6MHz,定时器1高8位预装值E6H,SMOD=1,那么你的实际波特率就只有1201.92。
引用: QWE4562009 发表于 2020-10-13 15:02 我看了下 但是真的没看懂 有人说直接 用时钟频率/分频数/定时器初值 比如需要115200的波特率 ...
"有人说直接 用时钟频率/分频数/定时器初值"
那是胡说。
引用: freebsder 发表于 2020-10-13 21:00 楼主到底是干什么的?还弄这些。。。好跳跃
遇到了 就问下 硬件的
引用: maychang 发表于 2020-10-13 16:45 如果石英晶体频率6MHz,定时器1高8位预装值E6H,SMOD=1,那么你的实际波特率就只有1201.92。
这个预装值是怎么来的
引用: maychang 发表于 2020-10-13 16:00 maychang 发表于 2020-10-13 15:24 先不要管定时器2。51单片机只有定时器0和定时器1,没有定时器2。52单 ...
这个溢出率是啥玩意?65535-初值?
引用: maychang 发表于 2020-10-13 15:59 QWE4562009 发表于 2020-10-13 15:02 我看了下 但是真的没看懂 有人说直接 用时钟频率/分频数/定时 ...
溢出之后要怎么处理?溢出就是装满的意思吧 就是65535满了?