晶振11.0592MHZ,波特率4800bps计算
在使用11.0592MHz晶振的8051单片机中,通过配置SMOD位(0或1)和定时器1的初值(TH1),可以精确生成4800波特率。8051串口通信的波特率由以下公式决定:其中:foscfosc:晶振频率(11.0592 MHz):电源控制寄存器(PCON)的位7(0或1):定时器1的重载值(0~255)配置寄存器:TH1 = 250(十六进制 0xFA)定时器1模式设为自动重载(模式2)设置
在使用11.0592MHz晶振的8051单片机中,通过配置SMOD位(0或1)和定时器1的初值(TH1),可以精确生成4800波特率。以下是详细的配置方法及计算过程:
1. 波特率计算公式
8051串口通信的波特率由以下公式决定:

其中:
-
foscfosc:晶振频率(11.0592 MHz)
-
SMOD:电源控制寄存器(PCON)的位7(0或1)
-
TH1:定时器1的重载值(0~255)
2. 配置方法
情况一:SMOD=0

配置寄存器:
TH1 = 250(十六进制 0xFA)
定时器1模式设为自动重载(模式2)
设置SMOD=0(默认值)
使用STC-ISP 生成代码

void UartInit(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
情况二:SMOD=1

配置寄存器:
TH1 = 244(十六进制 0xF4)
定时器1模式设为自动重载(模式2)
设置SMOD=1(需手动置位PCON.7)
使用STC-ISP 生成代码
与上一个相比,勾选了 波特率倍数(SMOD)

void UartInit(void) //4800bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
江科大解释
8-2 46:30
up采用 晶振12MZH, 12倍分频,

void UartInit(void) //4800bps@12.000MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
演算过程-晶振12mhz
江科大up:
0xF3 243
每隔256 溢出一次,
256-243 = 13 每次只计13个数就溢出一次
12MHZ晶振在12T模式(12倍分频) 1us 计数一次
计13次数就溢出一次,即 每隔13us 就溢出一次
1/13us=0.07692 MHZ 定时器T1的溢出频率
此处设置SMOD=1 除以16 (没有除以2,除以16)
0.07692/16=0.00480769 MHZ = 4807.69HZ
不是4800的原因, 频率没有对上位置,产生误差
误差: 7.69/4800 = 0.00160208333 = 0.16%
上述方法符合 表格中计算公式
个人疑惑:那对于晶振11.0592MHZ ,该如何用上述方法计算? 得出波特率4800bps
答案:参考计算公式,
SMOD=1, 则除以16 ,所以初值为:
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时初值
0xF4 = 244
SMOD=0, 则除以2,除以16(选择该线路),所以初值为:
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时初值
0xFA = 250
参考资料:
1.deepseek
2.江科大
[8-2] 串口向电脑发送数据&电脑通过串口控制LED_哔哩哔哩_bilibili
3.STC89C52使用手册
更多推荐




所有评论(0)