51单片机波特率的计算方法

通过51单片机的波特率,来计算定时器的初始值。

定时器的溢出率公式 :
1 / ov = 1/f * 12 *(256 - init)
(ov为溢出率,溢出频率; init 为初始值; f为时钟频率, 比如12M或者11.0592M等)

波特率的计算公式
baud = 2^smod * ov / 32 = 2^smod * f / (12 * 32 * (256 - init))
(baud为波特率 比如4800, 9600 等; smod为51单片机中频率加倍标志)

ov = 32 * baud / (2 ^ smod) = f / (12 * (256 - init))

init = 256 - f * (2^ smod) / (12 * 32 * baud)

算例1:
假如要设定
baud = 4800
smod = 1
f = 12M = 12_000_000

通过上面的式子
init = 256 - f * 2 / (12 * 32 * 4800) = 256 - f / 921600 = 242.97916666666666
四舍五入为 243 = 0xf3
实际 baud = 4807.692307692308
误差 0.16%

与stc的工具进行验证
在这里插入图片描述
算例2
假如要设定
baud = 4800
smod = 0
f = 12M = 12_000_000

通过计算
init = 249.48958333333334
init = 249 = ‘0xf9’
实际baud = 4464.285714285715
误差 6.99%

在这里插入图片描述
算例3:
假如要设定
baud = 4800
smod = 0
f = 11.0592M = 11_059_200

通过计算
init = 250.00 = 0xfa
误差为0

通过分析初始值计算公式
init = 256 - f * 2 ^smod/ (12 * 32 * baud) = 256 - f * 2^smod / (384 * baud)

关键是要让
f * 2^smod 能被 384 ** baud 整除就行 (先不考虑除数要小于 256的情况, 因为如果大于256 可以通过提高波特率来解决)
也可以先假定 smod = 0, 如果smod = 1, 把波特率提高1倍 与smod=0情况一样

假如f = 12M
12M / 384 = 31250.0 (整数)

很容易看出来下面的波特率都可以达到0误差的情况
baud = 3125 (smod = 0) init = 0xf6
baud = 6250 (smod = 0) init = 0xfb
baud = 12500 (smod = 1)init = 0xfb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值