新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51系列單片機(jī)12M晶振與9600波特率漫談

51系列單片機(jī)12M晶振與9600波特率漫談

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò) 收藏
最近寫(xiě)了個(gè)小程序,用到9600波特率,板子上是12M晶振。但在調(diào)試的時(shí)候,死活都配不出9600的波特率。于是上狗狗,狗了一下,發(fā)現(xiàn)不少朋友們都遇到了相同的問(wèn)題,而且下了板上釘釘?shù)慕Y(jié)論:51單片機(jī)在12M晶振的時(shí)候是無(wú)法實(shí)現(xiàn)9600波特率的。

本文引用地址:http://butianyuan.cn/article/201611/321604.htm

網(wǎng)友們大都推薦改成11.0592M晶振。當(dāng)然這個(gè)方案是絕對(duì)可行的,但我實(shí)在懶得去買(mǎi)這號(hào)晶振(跑一趟電子市場(chǎng)要花3小時(shí)呢)。于是重新去研究芯片手冊(cè),終于功夫不負(fù)有心人,我發(fā)現(xiàn),如果你一不小心選的是52或者54、58的芯片,這個(gè)問(wèn)題是可以解決的哦。





51單片機(jī)通常由TIMER1來(lái)產(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)試通過(guò)。



評(píng)論


技術(shù)專區(qū)

關(guān)閉