新闻  |   论坛  |   博客  |   在线研讨会
51系列单片机12M晶振与9600波特率漫谈
mayer | 2009-09-01 19:43:15    阅读:7230   发布文章

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

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;

}

}

 

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客