51單片機定時計數器溢出率計算和串口的波特率之間的關系


51 芯片的串口可以工作在幾個不同的工作模式下,其工作模式的設置就是使用SCON 寄存器。它的各個位的具體定義如下:
                SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1 為串行口工作模式設置位,這樣兩位可以對應進行四種模式的設置。串行口工作模式設置。

    波特率在使用串口做通訊時,一個很重要的參數就是波特率,只有上下位機的波特率一樣時才可以進行正常通訊。波特率是指串行端口每秒內可以傳輸的波特位數。這里所指的波特率,如標准9600 不是每秒種可以傳送9600個字節,而是指每秒可以傳送9600 個二進位,而一個字節要8 個二進位,如用串口模式1 來傳輸那么加上起始位和停止位,每個數據字節就要占用10 個二進位,9600 波特率用模式1 傳輸時,每秒傳輸的字節數是9600÷10=960 字節。      

51芯片的串口工作模式0的波特率是固定的,為fosc/12,以一個12M 的晶振來計算,那么它的波特率可以達到1M。

模式2的波特率是固定在fosc/64 或fosc/32,具體用那一種就取決於PCON 寄存器中的SMOD位,如SMOD 為0,波特率為focs/64,SMOD 為1,波特率為focs/32。    

模式1和模式3的波特率是可變的,取決於定時器1或2(52芯片)的溢出速率,就是說定時器1每溢出一次,串口發送一次數據。那么我們怎么去計算這兩個模式的波特率設置時相關的寄存器的值呢?可以用以下的公式去計算。  

 

波特率 = (2smod/32) * 溢出速率          (T1的溢出速率)

 

    上式中如設置了PCON寄存器中的SMOD位為1時就可以把波特率提升2倍。通常會使用定時器1工作在定時器工作模式2下,這時定時值中的TL1做為計數,TH1做為自動重裝值,這個定時模式下,定時器溢出后,TH1的值會自動裝載到TL1,再次開始計數,這樣可以不用軟件去干預,使得定時更准確。在這個定時模式2下定時器1溢出速率的計算公式如下:   

 

溢出速率 = 計數速率 / (256-TH1初值) = fosc / [12 *(256-TH1初值)]    

 

 

計數速率 = fosc / 12          (12T的單片機)

溢出速率 = 1 / 溢出時間 = 1 / [(256 - TH1初值)* (12 / fosc)] = fosc / [12 *(256-TH1初值)]    

計數速率 = 1 / 計數時間 = 1 / (12 / fosc) = fosc / 12

 

上式中的“計數速率”與所使用的晶體振盪器頻率有關,在51 芯片中定時器啟動后會在每一個機器周期使定時寄存器TH 的值增加一,一個機器周期等於十二個振盪周期,所以可以得知51芯片的計數速率為晶體振盪器頻率的1/12,一個12M 的晶振用在51芯片上,那么51的計數速率就為1M。通常用11.0592M 晶體是為了得到標准的無誤差的波特率,那么為何呢?計算一下就知道了。如我們要得到9600 的波特率,晶振為11.0592M 和12M,定時器1 為模式2,SMOD 設為1,分別看看那所要求的TH1 為何值。代入公式:     

 

                   11.0592M        9600=(2÷32)×((11.0592M/12)/(256-TH1))                TH1=250

                   12M                9600=(2÷32)×((12M/12)/(256-TH1))                         TH1≈249.49    

 

上面的計算可以看出使用12M晶體的時候計算出來的TH1不為整數,而TH1的值只能取整數,這樣它就會有一定的誤差存在不能產生精確的9600 波特率。當然一定的誤差是可以在使用中被接受的,就算使用11.0592M 的晶體振盪器也會因晶體本身所存在的誤差使波特率產生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM