SCON串行使用波特率計算和設置


1. 工作模式

    SCON 串行口控制寄存器 
    通常在芯片或設備中爲了監視或控制接口狀態,都會引用到接口控制寄存器。SCON就是51芯片的串行口控制寄存器。
    它的尋址地址是98H,是一個可以位尋址的寄存器,作用就是監視和控制51芯片串行口的工作狀態。51芯片的串口
    可以工作在幾個不同的工作模式下。
    具體定義如下:
    SM0 SM1 SM2 REN TB8 RB8 TI RI 
    SM0、SM1爲串行口工作模式設置位,這樣兩位可以對應進行四種模式的設置。看錶8-2串行口工作模式設置。
    SM0 SM1        模 式           功 能               波特率 
    0 0              0             同步移位寄存器       fosc/12 
    0 1              1             8位UART              可變 
    1 0              2             9位UART              fosc/32或fosc/64 
    1 1              3             9位UART              可變 
    在這裏只說明最常用的模式1,其它的模式也就一一略過,有興趣的朋友可以找相關的硬件資料查看。
    表中的fosc代表振盪器的頻率,也就是晶振的頻率。
    ​UART爲(Universal Asynchronous Receiver)的英文縮寫。 

 

 2. 定義詳解   

    SM2:模式2、模式3中爲多處理機通信使能位。在模式0中要求該位爲0。    
    REM:允許串口接收位,置1允許接收,置0禁止接收。REM由軟件置位或清零。
        如果在一個電路中接收和發送引腳P3.0,P3.1都和上位機相連,在軟件上有串口中斷處理程序,當要求在處理某個子
        程序時不允許串口被上位機來的控制字符產生中斷,那麼可以在這個子程序的開始處加入REM=0來禁止接收,在子程
        序結束處加入REM=1再次打開串口接收。  
    TB8:發送數據位8,在模式2和3是要發送的第9位。該位可用軟件根據需要置位或清除,通常這位在通信協議中做奇偶位,
         在多處理機通信中這一位則用於表示是地址幀還是數據幀。
    RB8:接收數據位8,在模式2和3是已接收數據的第9位。該位可以是奇偶效驗位,地址/數據標識位。在模式0中,
        RB8爲保留位沒有被使用。在模式1中,當SM2=0,RB8是已接收數據的停止位。    
     TI: 發送中斷標識位。在模式0,發送完第8位數據時,由硬件置位。其它模式中則是在發送停止位之初,由硬件置位。TI
        置位0,申請中斷,CPU響應中斷後在軟件置位0發送一幀數據。任何模式TI必須軟件置0,也就是說在數據寫入到SBUF後,
        硬件發送數據,中斷響應(如中斷打開),這時TI=1,表明發送已完成,TI不會由硬件清除,所以這時必須用軟件對其清零。    
     RI: 接收中斷標識位。在模式0,接收第8位結束時,由硬件置位。其它模式中則是在接收停止位的半中間,由硬件置位。
        RI=1,申請中斷,要求CPU取走數據。但在模式1中,SM2=1時,當未收到有效的停止位,則不會對RI置位。同樣RI
        也必須要靠軟件清除。常用的串口模式1是傳輸10個位的,1位起始位爲0,8位數據位,低位在先,1位停止位爲1。它
        的波特率是可變的,其速率是取決於定時器1或定時器2的定時值(溢出速率)。AT89C51和AT89C2051等51系列芯
        片只有兩個定時器,定時器0和定時器1,而定時器2是89C52系列芯片纔有的。
 3. 波特率設定    
    波特率在使用串口做通訊時,一個很重要的參數就是波特率,只有上下位機的波特率一樣時纔可以進行正常通訊。
    波特率:是指串行端口每秒內可以傳輸的波特位數
    有一些初學的朋友認爲波特率是指每秒傳輸的字節數,如標準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芯片)的溢出速率。那麼我們怎麼去計算這兩個模式的波特率設置
    時相關的寄存器的值呢?可以用以下的公式去計算:
        波特率=(2SMOD÷32)×定時器1溢出速率    
        上式中如設置了PCON寄存器中的SMOD位爲1時就可以把波特率提升2倍。通常會使用定時器1工作在定時器工作模式2下,
    這時定時值中的TL1做爲計數,TH1做爲自動重裝值 ,這個定時模式下,定時器溢出後,TH1的值會自動裝載到TL1,再次開
    始計數,這樣可以不用軟件去幹預,使得定時更準確。
    在這個定時模式2下定時器1溢出速率的計算公式如下:            
        溢出速率=(計數速率)/(256-TH1)    
        上式中的“計數速率”與所使用的晶體振盪器頻率有關,在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的晶體振盪器也會因晶體本身所存在的
    誤差使波特率產生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章