最近寫了個(gè)小程序,用到9600波特率,板子上是12M晶振。但在調(diào)試的時(shí)候,死活都配不出9600的波特率。于是上狗狗,狗了一下,發(fā)現(xiàn)不少朋友們都遇到了相同的問題,而且下了板上釘釘?shù)慕Y(jié)論:51單片機(jī)在12M晶振的時(shí)候是無法實(shí)現(xiàn)9600波特率的。
本文引用地址:http://m.butianyuan.cn/article/201611/321604.htm
網(wǎng)友們大都推薦改成11.0592M晶振。當(dāng)然這個(gè)方案是絕對(duì)可行的,但我實(shí)在懶得去買這號(hào)晶振(跑一趟電子市場(chǎng)要花3小時(shí)呢)。于是重新去研究芯片手冊(cè),終于功夫不負(fù)有心人,我發(fā)現(xiàn),如果你一不小心選的是52或者54、58的芯片,這個(gè)問題是可以解決的哦。
51單片機(jī)通常由TIMER1來產(chǎn)生波特率,TIMER1的頻率是晶振的1/12,也就是1M。它的頻率太低導(dǎo)致它不能實(shí)現(xiàn)9600波特率。這也給我們提供了一條新的解決途徑:如果我們能提高時(shí)鐘頻率,那么也可能實(shí)現(xiàn)9600的波特率。
提高時(shí)鐘頻率是不是一定要提高晶振頻率呢?當(dāng)然,答案是否定的(改晶振頻率那就太土了)。52及以上的單片機(jī)提供了TIMER2,可作為波特率發(fā)器。且它作為波特率發(fā)生器時(shí),它的頻率是晶振的1/2,也就是6M。其結(jié)構(gòu)如圖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 的波特率發(fā)生器
TIMER2作為波特率發(fā)生器,要注意以下幾點(diǎn):
1.
C/T位清零,選擇OSC/2作為時(shí)鐘;
2.
TH2和TL2串聯(lián)成16位時(shí)鐘,溢出后自動(dòng)重裝;重裝常數(shù)存放在RCAP2H和RCAP2L;
3.
置RCLK和TCLK為1,將特率生成器切換到TIMER2;
4.
置TR2,啟動(dòng)TIMER2。
代碼如下:
void Uart0_Init()
{
//9600波特率對(duì)應(yīng) 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;
}
}
以上設(shè)置,用串口調(diào)試助手調(diào)試通過。
評(píng)論