因为需要比较精确的定时器,所以在STC89C52系统上使用了外部的12M晶振,T0/T1的1次计数就是1us。
所以,当需要做串口通信时,踩到一个小坑,网上也没什么资料说清楚了的。这里写下来记录一下,免得以后忘记了。
先上手册里面的常用波特率设置表格
好吧,常用的里面没我需要的,啃文档吧
首先明确,我的需求是9600,8n1,也就是文档里描述的串口工作在模式1
这里就有两个可变设置量,1是SMOD,2是12T/6T,最后选定SMOD=1,6T,这样就有计算式
TH1=256 - 12M/6/16/9600 = 243(0xF3)
实际波特率 = 2/32*12M/6/(256-243)=2M/16/13=9615.4
偏差为(9615.4-9600)/9600 =0.0016 = 0.16%,妥妥的能用
实际配置代码如下:
void Uart1_Init(void) //9600bps@12.000MHz
{
SCON=0x50; //SM0(bit7)=0,SM1(bit6)=1串口工作在模式1,8位波特率可变,SM2(bit5)=0,REN(bit4)=1允许串行接收控制位,其他位=0
TMOD=TMOD&0X0F;//低4位是T0配置不动
TMOD=TMOD|0x20; //T1工作于模式2,TMOD.7=0表示不需要外部管脚控制,TMOD.6=0表示T1是定时器,TMOD.5:TMOD.4 = 10表示8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1
PCON |= 0x80;//波特率加倍
TH1=243;//
TL1=TH1;
EA=1;
ES=1;
ET1=0;
TR1=1;
}
下载软件上要勾选使能6T(双倍速)模式