通过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