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的晶體振盪器也會因晶體本身所存在的
誤差使波特率產生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計