51单片机 11.0592MHz 产生115200 波特率
最新推荐文章于 2024-04-22 00:16:41 发布
51单片机 11.0592MHz 产生115200 波特率
连接:http://homezzy.blog.hexun.com/29601793_d.html
具体定义如下:
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。
看表8-2串行口工作模式设置。
SM0 SM1 模 式 功 能 波特率
0 0 0 同步移位寄存器 fosc/12
0 1 1 8位UART 可变
1 0 2 9位UART fosc/32或fosc/64
1 1 3 9位UART 可变
表中的fosc代表振荡器的频率,也就是晶振的频率。
UART为(Universal Asynchronous Receiver)的英文缩写。
今天解决了一个小问题(查书后才得到确切结论。。。)用51单片机+11.0592的晶振,如何产生115200的波特率?
本来感觉这个小意思,直接初始化定时器1,程序如下:
void init_com( void )
{
SCON = 0x50 ; //串口工作方式1,8位UART,波特率可变
TMOD |= 0x20 ; //定时器1,工作方式2,自动再装入8位定时器
PCON |= 0x80 ; //SMOD=1; 波特率加倍
TH1 = 0xfa ; //波特率:9600 晶振=11.0592MHz
IE |= 0x90 ; //使能串口中断
TR1 = 1 ; // 定时器1开始
}
结果发现这样只能得到9600的波特率。。。
当SMOD=1时,K=2,波特率加倍,公式为:
波特率=K×11059200/32×12×(256-TH1)
所以,TH1=0xfa=256-(2×11059200/384×波特率) 其中波特率为9600
这时,及时令TH1=0xff,所得波特率最大只能为57600,也就是说,这样无法得到115200的波特率。。。
这样就只有采用其他方法了:
1、换晶振,用22.1184M晶振,在TH1=0xff时,刚好可以产生115200波特率。
2、采用6个时钟周期的单片机(换单片机啊。。。)
3、增强型51单片机有定时器2!(幸好偶用的是增强型。。。)
就用第三种方法啦!这时的波特率公式如下:
波特率=11059200 / { 32×[65536-(RCAP2H,RCAP2L)] }
其中的RCAP2H,RCAP2L为自动重装值,由上式得:
RCAP2H,RCAP2L=65536-11059200 / (32×波特率)
这样得波特率为115200时,RCAP2H,RCAP2L=0xff,0xfd,初始化程序如下:
void init_com( void )
{
SCON=0x50; //串口工作方式1,8位UART,波特率可变
TH2=0xFF;
TL2=0xFD; //波特率:115200 晶振=11.0592MHz
RCAP2H=0xFF;
RCAP2L=0xFD; //16位自动再装入值
/*****************/
TCLK=1;
RCLK=1;
C_T2=0;
EXEN2=0; //波特率发生器工作方式
/*****************/
TR2=1 ; //定时器2开始
}
OK!
这样就实现用51单片机+11.0592的晶振,产生115200的波特率了,当然老鸟看来很基本,但好长时间不用了,再复习一下~~