最近写了个小程序,用到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;
}
}
以上设置,用串口调试帮手调试经过。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/257910.html