STC89C52RC、22.1184M晶振,产生115200波特率。
这问题还纠结了很久,因为在普通情况下算出来的T1时间常数带小数点,这样通常会导致通信结果出错。其实通过电源控制寄存器PCON将波特率倍频下就解决问题了。下面简单给出计算过程:
1、首先T1时间常数X的值为:
X = 2^8 - 2^SMOD * 晶振频率 / (384 * 波特率);
2、电源控制寄存器PCON控制:
PCON D7 D6 D5 D4 D3 D2 D1 D0
位符号 SMOD —————— GF1 GF0 PD IDL
在CHMOS型单片机中,除SMOD位外,其他位均为虚设的,SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。
各位的定义:
(1)SMOD:该位与串口通信有关。
SMOD=0; 串口方式1,2,3时,波特率正常。
SMOD=1; 串口方式1,2,3时,波特率加倍。
(2)GF1,GF0:两个通用工作标志位,用户可以自由使用。
PD:掉电模式设定位。
PD=0 单片机处于正常工作状态。
PD=1 单片机进入掉电(Power Down)模式 ,可由外部中断或硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断工作。
(3)IDL:空闲模式设定位。
IDL=0 单片机处于正常工作状态。
IDL=1 单片机进入空闲(Idle)模式,除CPU不工作外,其余仍继续工作,在空闲模式下可由任一个中断或硬件复位唤醒。
3、通过将SMOD置1,可以正常产生115200波特率,由之前公式,可计算出TH1=TL1=X=0xFF;初始化代码如下:
UART_init()
{
PCON |= 0x80;
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFF;
TL1 = 0xFF;
TR1 = 1;
ES = 1; //串口中断
EA = 1; //总中断
}