在使用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使用手册

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐