"); //-->
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} st1\:*{behavior:url(#ieooui) }
最近写了个小程序,用到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。
<!--[if !vml]-->
<!--[endif]-->
图1 TIMER2 的波特率发生器
TIMER2作为波特率发生器,要注意以下几点:
<!--[if !supportLists]-->1. <!--[endif]-->C/T位清零,选择OSC/2作为时钟;
<!--[if !supportLists]-->2. <!--[endif]-->TH2和TL2串联成16位时钟,溢出后自动重装;重装常数存放在RCAP2H和RCAP2L;
<!--[if !supportLists]-->3. <!--[endif]-->置RCLK和TCLK为1,将特率生成器切换到TIMER2;
<!--[if !supportLists]-->4. <!--[endif]-->置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;
}
}
以上设置,用串口调试助手调试通过。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。