宏晶STC89C52产生波特率115200,需要C语言的,晶振11.0592MHz
串口通讯一般采用
工作模式1——10位异步收发(1起始+8数据+1停止),由定时器1
提供
波特率,而此模式的
波特率
计算公式:Baud=2^(SMOD)/32
×T1溢出率;
注:T1溢出率=1/T1中断时间;
SMOD
为
倍频系数(0
跟
1);
当
T1
溢出率最大时(即中断时间最短),波特率最大,中断最短也只能
=1个机械周期,晶振Fosc=11.0592MHz,
机械周期
t=12/Fosc,溢出率就=
Fosc/12,代入上面公式,
Baud=(2^1)÷32×11059200/12=
57600
bps,支持不了LZ
要的
115200
的波特率,不过
好在,STC89C52单片机,是支持
机械周期
倍频的(在烧录时选择“双倍频”),它可以把
12T
模式
倍频为
6T模式,也就是
把上面
的12
替代为
6,计算结果
=
115200,刚好等于
LZ
要的。
52单片机 如何用T2来设波特率为115200的 串口接收 要用C语言写
void UART_init()
{
//初始化串行口和波特率发生器
SCON =0x64; //选择串口工作方式,打开接收允许
TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd; //实现波特率115200(系统时钟11.0592MHZ)
TR1 =1; //启动定时器T1
ET2 =1; //允许T2中断
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
//————————————————————————————————–
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位\’S\’在内的十位数据到数据缓冲区
//————————————————————————————————–
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI) //处理接收中断
{
RI=0; //清除中断标志位
RECEIVR_buffer=SBUF; //接收串口数据
if(point==0) //如果还没有接收到起始位
{
if(RECEIVR_buffer==\’S\’) //判断是否起始标志位
point++; //是准备接收下一位
else
point=0; //不是,继续等待起始位
}
else if(point0point10) //判断是否接收够十位数据
buffer[point++]=RECEIVR_buffer; //不够,把接收到的数据放入接收缓存区
else point=0; //缓冲区已满,清除缓存区内数据重新接收
}
If(TI) //处理发送中断
{
TI=0;
}
}
//
51单片机 设置串口波特率115200初值怎么弄 呢 单片机是11.0592的晶振
void UartInit(void) //115200bps@11.0592MHz
{
PCON = 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR = 0xfe; //串口1选择定时器1为波特率发生器
TMOD = 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void UartInit(void) //115200bps@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 = 0xFF; //设定定时初值
TH1 = 0xFF; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
单片机的问题6
你可以把T1工作在方式2自动重装载模式,这样可以避免进入中断,把TH1=TL1=0xFA,SMOD=0,具体程序如下:
TMOD=0x20; //定时器1,模式2,8位重装
SCON=0x50; //串口工作方式1,允许接收,假设你的串口现在是接受数据状态
PCON=0x00; //令SMOD=0,不倍频
TH1=0xFA;
TL1=0xFA; //波特率=4800
EA=1; //开总中断
ES=1; //开串口中断
TR1=1;
这个程序我没有在运行过,但应该没问题的,希望你自己能掌握波特率和溢出率的计算方法,。。。。晚安!
评论0