微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51系列单片机12M晶振与9600波特率漫谈

51系列单片机12M晶振与9600波特率漫谈

时间:11-26 来源:互联网 点击:
最近写了个小程序,用到9600波特率,板子上是12M晶振。但在调试的时候,死活都配不出9600的波特率。于是上狗狗,狗了一下,发现不少朋友们都遇到了相同的问题,而且下了板上钉钉的结论:51单片机在12M晶振的时候是无法实现9600波特率的。



网友们大都推荐改成11.0592M晶振。当然这个方案是绝对可行的,但我实在懒得去买这号晶振(跑一趟电子市场要花3小时呢)。于是重新去研究芯片手册,终于功夫不负有心人,我发现,如果你一不小心选的是52或者54、58的芯片,这个问题是可以解决的哦。





51单片机通常由TIMER1来产生波特率,TIMER1的频率是晶振的1/12,也就是1M。它的频率太低导致它不能实现9600波特率。这也给我们提供了一条新的解决途径:如果我们能提高时钟频率,那么也可能实现9600的波特率。





提高时钟频率是不是一定要提高晶振频率呢?当然,答案是否定的(改晶振频率那就太土了)。52及以上的单片机提供了TIMER2,可作为波特率发器。且它作为波特率发生器时,它的频率是晶振的1/2,也就是6M。其结构如图1。



coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">







o:title="\"/>



图1 TIMER2 的波特率发生器






TIMER2作为波特率发生器,要注意以下几点:



1.
C/T位清零,选择OSC/2作为时钟;



2.
TH2和TL2串联成16位时钟,溢出后自动重装;重装常数存放在RCAP2H和RCAP2L;



3.
置RCLK和TCLK为1,将特率生成器切换到TIMER2;



4.
置TR2,启动TIMER2。





代码如下:



void Uart0_Init()



{



//9600波特率对应 FFD9H



RCAP2L = 0xD9;



RCAP2H
= 0xFF;





//RCLK、TCLK置1



//TR2置1



T2CON
= 0x34;





//串口工作模式1,接收使能



SCON
= 0x50;





//允许串口中断



ES
= 1;





return;



}





void Uart0_Ist() interrupt 4



{



if(RI)



{



RI
= 0;



//Do
whatever you want;



}



if(TI)



{



TI
= 0;



//Do
whatever you want;



}



}

以上设置,用串口调试助手调试通过。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top