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