新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51系列單片機12M晶振與9600波特率漫談

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

        作者: 時間:2016-11-26 來源:網絡 收藏
        最近寫了個小程序,用到9600波特率,板子上是12M晶振。但在調試的時候,死活都配不出9600的波特率。于是上狗狗,狗了一下,發現不少朋友們都遇到了相同的問題,而且下了板上釘釘的結論:51單片機在12M晶振的時候是無法實現9600波特率的。

        本文引用地址:http://www.104case.com/article/201611/321604.htm

        網友們大都推薦改成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;



        }



        }

        以上設置,用串口調試助手調試通過。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 苗栗市| 牙克石市| 托克托县| 洪江市| 拉萨市| 汶上县| 抚松县| 古田县| 郯城县| 龙南县| 延津县| 县级市| 新竹县| 玉树县| 同仁县| 大足县| 鄄城县| 海城市| 左云县| 连南| 永州市| 盐池县| 云安县| 昌邑市| 大化| 武汉市| 白山市| 炉霍县| 永昌县| 婺源县| 文山县| 诸暨市| 武鸣县| 永靖县| 兰溪市| 鄂州市| 龙川县| 琼海市| 类乌齐县| 拜城县| 灵石县|