在经典的 Intel 8051 架构单片机(如 STC89C52)开发中,配置串口波特率需要手动设置定时器1(Timer 1)的自动重装载初值(TH1)。为什么在 51 开发板上,几乎人人都会默认焊接一颗怪异、有小数的 **11.0592 MHz** 石英晶振,而不是整整齐齐的 12.0000 MHz 晶振?
我们来推算 51 单片机串口波特率产生的物理分频公式:
$BaudRate = \frac{2^{SMOD}}{32} \times \frac{F_{osc}}{12 \times (256 - TH1)}$
如果采用 12.0000 MHz 晶振产生 9600 bps 波特率,代入公式后会求得 TH1 的初值为非整数(256 - 32.55),我们不得不进行四舍五入。这一近似会导致 51 单片机产生实际的物理波特率与 9600 bps 存在高达 8.5% 的永久固有偏差。由于这个严重的累积相位漂移,电脑接收到的字符必定全是怪异乱码。但如果你换算 11.0592 MHz 晶振,在 9600 波特率下,TH1 可以精准除尽得到一个完美的整数 `FD`(即 253 或者是重载寄存器初值),在 115200 波特率下为 `FA`,物理分频产生的误差为 0%!因此,11.0592 晶振就是 51 单片机为了完美串口通信而诞生并延续至今的物理宿命。