技術(shù)篇之MCS-51 單片機串口的相關(guān)特殊功能寄存器
與串口工作有關(guān)的特殊功能寄存器包括:串口控制寄存器SCON(圖4-18中的TI和RI均是該寄存器中的位)、串口緩沖區(qū)寄存器SBUF和電源控制寄存器PCON(圖4-18中的SMOD是該寄存器中的位)。
1.串口緩沖區(qū)寄存器SBUF
串口緩沖區(qū)寄存器SBUF的地址是99H,不能按位尋址。雖然串口發(fā)送緩沖區(qū)和接收緩沖區(qū)的名稱均為SBUF,但是在物理上它們是獨立的。
可以通過指令的操作區(qū)分發(fā)送緩沖區(qū)和接收緩沖區(qū)。因為,接收緩沖區(qū)只能被讀出、不能被寫入,而發(fā)送緩沖區(qū)只能被寫入、不能被讀出,所以在指令中,作為目的操作數(shù)的SBUF代表發(fā)送緩沖區(qū),作為源操作數(shù)的SBUF接收緩沖區(qū)。例如,指令“MOV SBUF,A”將累加器A中的數(shù)據(jù)寫入發(fā)送緩沖區(qū);而指令“MOV A,SBUF”則將接收緩沖區(qū)的數(shù)據(jù)讀出并存入累加器A。
MCS-51單片機沒有專門的啟動串口發(fā)送的指令,在滿足串口發(fā)送條件時,任何向SBUF中寫入數(shù)據(jù)的操作都可以啟動串口的數(shù)據(jù)發(fā)送。在串口接收數(shù)據(jù)時,必須及時讀取接收緩沖區(qū)中的數(shù)據(jù),否則其中的數(shù)據(jù)有可能被新接收的數(shù)據(jù)覆蓋而導(dǎo)致丟失。
2.串口控制寄存器SCON和電源控制寄存器PCON
串口控制寄存器SCON用于監(jiān)控串口的工作狀態(tài),其格式見表4-11。SCON中各位的作用如下:
(1)串口中斷請求標(biāo)志位TI和RI
串口有兩個中斷請求位,分別是發(fā)送中斷請求標(biāo)志位TI和接收中斷請求標(biāo)志位RI。
串口每發(fā)送完一個完整的字符幀后,TI被單片機硬件置1,并向CPU發(fā)出中斷請求。單片機的硬件任何時候都不會自動將TI清0。再次發(fā)送數(shù)據(jù)前必須使用指令將TI清0,如指令“CLR TI”。另外,在中斷方式的串口程序設(shè)計中,若不及時將TI清0,單片機將誤認(rèn)為發(fā)送中斷請求一直存在,從而重復(fù)執(zhí)行串口中斷服務(wù)處理程序。
串口每接收到一個完整字符幀后,RI被單片機硬件置1,以向CPU發(fā)出中斷請求。接收新數(shù)據(jù)前,必須通過指令將RI清0,如指令“CLR RI”。同發(fā)送過程相似,在中斷方式的程序設(shè)計中,為了避免重復(fù)發(fā)出中斷請求,必須及時將RI清0。
另外,TI和RI均可由軟件指令置1和清零0,并且軟件置1對單片機的影響與硬件置1的完全相同。
(2)串口工作方式選擇位SM0和SM1
串口有4種工作方式,由SM0和SM1選擇,見表4-12。在表4-12中:
1)fosc是單片機的晶振頻率,影響串口的數(shù)據(jù)傳輸速度。
2)UART是“Universal Asynchronous Receiver/Transmitter”的縮寫,即通用的異步接收和發(fā)送器。
3)SMOD是電源控制寄存器PCON(見表4-13)的最高位。由表4-12中的波特率計算公式可知,當(dāng)SMOD由0變?yōu)?時,與之相關(guān)的波特率將加倍,因此SMOD又被稱為波特率倍增位。
在表4-12出現(xiàn)了“T1溢出率”,下面將介紹表4-12中“T1溢出率”的計算方法,以及在串口方式1和方式2下,如何利用“T1溢出率”計算串口通信的波特率。
如圖4-18所示,定時/計數(shù)器T1是串口通信的波特率發(fā)生器,此時通常將T1設(shè)置為定時器且工作于工作方式2(自動重裝初值的8位定時器),并屏蔽其中斷。T1溢出率是T1每秒鐘溢出的次數(shù),該次數(shù)與T1的初值有關(guān)。若假設(shè)T1的初值為M,則T1相鄰兩次溢出之間的時間間隔為(256-M)/(12/fosc),因此
式中,fosc為單片機的晶振頻率。
由表4-12和式(4-7)可知,串口的波特率計算方法見表4-14。在串行通信中,發(fā)送端和接收端須使用同樣的波特率。
表4-15給出了常用波特率及其相關(guān)設(shè)置,編程時可以通過查表的方式獲得定時器T1初值。另外,在計算波特率時,若晶振頻率為11.0592MHz,則可以得到精確的T1初值(不會產(chǎn)生小數(shù)值),因此頻率為11.0592MHz的晶振在單片機系統(tǒng)中經(jīng)常被采用。
(3)允許接收位REN
REN是串口接收數(shù)據(jù)允許位,REN=0時禁止串口接收,REN=1時允許接收。該位可以由軟件指令置1或清0。
在串行通信過程中,只有當(dāng)RI=0且REN=1時,才啟動并允許串口接收,接收到的字符幀存入接收緩沖區(qū)。
(4)TB8
在工作方式2和工作方式3中,發(fā)送方TCON寄存器中的TB8將出現(xiàn)在發(fā)送字符幀中,并且位于數(shù)據(jù)位D7之后。另外,在具有一臺主機和多態(tài)從機的多機體通信中,TB8可以作為地址幀/數(shù)據(jù)幀的區(qū)分標(biāo)志。當(dāng)TB8=1時,字符幀的數(shù)據(jù)位代表從機的編號,即字符幀為地址幀;而當(dāng)TB8=0時,數(shù)據(jù)位是實際要發(fā)送的數(shù)據(jù),即字符幀為數(shù)據(jù)幀。
(5)RB8
RB8與TB8相對應(yīng),在工作方式2和工作方式3中,接收方將接收到含有發(fā)送方TB8的字符幀,并且發(fā)送方的TB8將被硬件自動送入接收方SCON寄存器的RB8位。換句話說,當(dāng)接收緩沖區(qū)接收到一個完整字符幀后,接收方RB8的值將與發(fā)送方TB8的值相同。
(6)多機控制位SM2
串口的方式2和方式3屬于多機通信方式,SM2用于控制實現(xiàn)多機通信。在多機通信系統(tǒng)中僅有一臺主機,可以有多臺從機。每次通信時,主機需從多臺從機中選擇一臺從機并與之進行數(shù)據(jù)傳輸。因此,多機通信過程可以分為如下幾個步驟:
1)主機發(fā)向所有從機發(fā)送地址幀,地址幀的數(shù)據(jù)位代表從機編號。發(fā)送時要求主機的SM2=0,所有從機的SM2=1。
2)所有從機接收到地址幀后,將其中的從機編號與自身的編號相比較,比較相同的從機(即被主機選中的從機)的SM2被清0,而其他從機的SM2依然為1。
3)被選中的從機與主機之間進行一對一的數(shù)據(jù)傳輸。
4)主機與從機通信結(jié)束后,被選中從機的SM2被重新置1,為下一次多機通信做準(zhǔn)備。
多機通信中,從機接收數(shù)據(jù)后能否產(chǎn)生中斷請求,與SM2、RB8和RI的取值有關(guān),見表4-16。