- 單片機原理
- 張志霞 張楠楠 王永剛 楊萍主編
- 3857字
- 2021-10-22 23:53:54
第五節 串行接口
中央處理器CPU和外界的信息交換稱為通信。通常有并行和串行兩種通信方式,數據的各位同時傳送的稱為并行通信,數據一位一位串行地順序傳送的稱為串行通信。
并行通信通過并行接口來實現,如MCS51的P1口就是并行接口。串行通信通過串行口來實現,MCS 51有一個全雙工的異步串行接口可以用于串行數據通信。
一、串行接口的組成和特性
MCS-51的串行口是一個全雙工的異步串行通信接口,可以同時發送和接收數據。串行口的內部有數據接收緩沖器和數據發送緩沖器。數據接收緩沖器只能讀出不能寫入,數據發送緩沖器只能寫入不能讀出,這兩個數據緩沖器都用符號SBUF來表示,地址都是99H。CPU對特殊功能寄存器SBUF執行寫操作,就是將數據寫入發送緩沖器;對SBUF讀操作,就是讀出接收緩沖器的內容。
特殊功能寄存器SCON存放串行口的控制和狀態信息,串行口用定時器T1或T2(8052)作為波特率發生器,特殊功能寄存器PCON的最高位SMOD為串行口波特率的倍率控制位。
1.串行口控制寄存器SCON
串行口控制寄存器SCON是一個特殊功能寄存器,地址為98H,具有位尋址功能。其格式如下:
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0、SM1:串行口的方式選擇位。功能如表2-10所示。
表2-10
串行口四種工作方式

SM2:允許方式2和3的多機通信控制位。對于方式2或3,如SM2置為1,則接收到的第9位數據(RB8)為0時不激活RI。對于方式1,如SM2=1,則只有接收到有效的停止位時才會激活RI。對于方式0,SM2應該為0。
REN:允許串行接收位。由軟件置位“1”以允許接收。由軟件清“0”來禁止接收。TB8:對于方式2和3,是發送的第9位數據。需要時由軟件置位或復位。
RB8:對于方式2和3,是接收到的第9位數據。對于方式1,如SM2=0,RB8是接收到的停止位。對于方式0,不使用RB8。
TI:發送中斷標志。由硬件在方式0串行發送第8位結束時置位,或在其他方式串行發送停止位的開始時置位。必須由軟件清“0”。
RI:接收中斷標志。由硬件在方式0接收到第8位結束時置位,或在其他方式接收到停止位的中間時置位。必須由軟件清“0”。
2.電源控制寄存器PCON
電源控制寄存器PCON格式如下:
SMOD
—
—
—
GF1
GF0
PD
IDL
PCON的最高位是串行口波特率系數控制位SMOD,當SMOD為1時使波特率加倍。PCON的其他位為節電方式控制位(CHMOS器件有效,詳見節電方式一節)。
二、串行接口的工作方式
MCS-51串行接口具有四種工作方式,我們主要從應用的角度討論各種工作方式的功能特性和工作原理。
1.方式0
方式0是外接移位寄存器的工作方式,用以擴展I/O接口。輸出時將發送數據緩沖器中的內容串行地移到外部的移位寄存器,輸入時將外部移位寄存器內容移入內部的輸入移位寄存器,然后寫入內部的接收數據緩沖器。
在以方式0工作時數據由RXD串行地輸入/輸出,TXD輸出移位脈沖,使外部的移位寄存器移位。波特率固定為振蕩器頻率的1/12。方式0時串行口簡化的邏輯結構框圖如
圖2-17所示。

圖2-17 串行口方式0結構
(1)方式0輸出。CPU對發送數據緩沖器SBUF寫入一個數據,就啟動串行口發送,發送的時序如圖2-18所示。
發送時,發送指令“寫SBUF”打開三態門1,這樣經內部總線送來的8位并行數據就可以寫入發送數據緩沖器SBUF。寫信號同時啟動發送控制器。經一個機器周期,發送控制端SEND有效,打開門5和門6,允許RXD引腳向外發送數據,同時TXD引腳輸出同步移位脈沖。在由時鐘信號觸發產生的內部移位脈沖作用下,發送數據緩沖器SBUF中待發送的數據逐位串行輸出。因為每一個機器周期只能發送一位數據,故波特率為fosc/12。外部時鐘信號同時在TXD上產生同步移位脈沖,每一個機器周期從TXD上輸出一個同步移位脈沖。一幀(8位)數據發送完畢,SEND恢復低電平,停止發送。且發送控制器硬件置發送中斷標志TI=1。這時如果允許發送中斷,則進入發送中斷處理程序。如果圖2-18 串行口方式0的發送時序
要再次發送數據,則必須在發送前用軟件清TI為0。
(2)方式0輸入。當RI=0時,將REN置1就啟動了接收。此時RXD為串行數據接收端,TXD依然輸出同步移位脈沖。方式0的接收時序如圖2-19所示。

圖2-19 串行口方式0的接收時序
接收過程啟動后,經過一個機器周期,接收控制端RECV有效,打開門6,允許TXD輸出同步移位脈沖。在同步移位脈沖的控制下,外設逐位的向單片機輸送數據。因為仍然是一個機器周期輸送一位數據,故波特率也不變,仍為fosc/12。在內部移位脈沖控制下,RXD上外設傳入的串行數據逐位移入移位寄存器。當一幀(8位)數據全部移入移位寄存器后,接收控制器使RECV失效,停止輸出移位脈沖,發出“裝載SBUF”信號,打開三態門2,將8位串行數據并行送入接收緩沖器SBUF。同時,接收控制器硬件將RI置1,向CPU申請中斷。如果CPU允許串行口接收中斷,則響應中斷。一般來說,在接收中斷處理程序中至少要做兩件事,一是將RI清零,以備接收下一幀數據;二是將SBUF中接收到的數據移出。在執行讀取SBUF指令后,CPU發出“讀SBUF”信號,打開三態門3,數據經內部總線進入CPU。
2.方式1
串行口定義為方式1時,它是一個8位異步串行通信口,TXD為數據輸出線,RXD為數據輸入線。傳送一幀信息的數據為10位:1位起始位,8位數據位(先低位后高位),1位停止位。方式1的波特率由定時器T1或T2(8052)的溢出率確定。方式1時串行口簡化的邏輯結構框圖如圖220所示。

圖2-20 串行口方式1、2、3的結構
(1)方式1輸出。CPU執行一條寫SBUF指令后便啟動了串行口發送,其輸入時序如
圖2-21(a)所示。
圖2-21 串行口方式1的時序
在指令執行期間,CPU送來“寫SBUF”信號,將并行數據送入SBUF,并啟動發送控制器,經一個機器周期,發送控制器的SEND、DATA相繼有效,通過輸出控制門從TXD上逐位輸出一幀信號。一幀信號發送完畢后,SEND、DATA失效,發送控制器硬件置發送中斷標志TI=1,向CPU申請中斷。
(2)方式1輸入。輸入的時序如圖2-21(b)所示。當允許接收標志REN=1時,接收器便以用戶所設波特率的16倍速率采樣RXD腳狀態。在采樣信號的負跳變時啟動接收控制器接收數據。為了避免通信雙方波特率微小不同的誤差影響,接收控制器將一位數據的傳送時間等分為16份,并在第7、8、9三個狀態由位檢測器采樣RXD三次,取三次采樣中至少兩次相同的值作為數據。這樣可以大大減少干擾影響,保證通信準確無誤。
如果接收到的起始位不為0,則起始位無效,復位接收電路,重新開始接收。接收到起始位0后,開始接收本幀數據,當8位數據和停止位都接收完畢后,如果RI=1,則接收的數據將會丟失。如果RI=0,并且SM2=0或停止位為1,則表示接收數據有效,開
始裝載SBUF,8位有效數據送入SBUF,停止位送入RB8,同時硬件置RI=1,向CPU
申請中斷,TI必須由用戶用軟件清0。無論數據接收有效無效,接收控制器將再次采樣RXD引腳的負跳變,以接收下一幀信息。
3.方式2和方式3
串行口工作在方式2時為9位異步串行通信口。方式2與方式1不同的是,它的數據是9位的,即它的一幀包括11位,1個開始位,9個數據位和1個停止位。其中第9位(即D8)數據是可由用戶編程的,可用來作奇偶校驗,也可用來作地址數據標志位。
當SM0=1、SM1=1時,串行口工作在方式3。方式3與方式2極其接近,它們之間唯一的差別在于波特率不同。方式2是波特率固定的,而方式3的波特率是可變的。
方式2和方式3的發送和接收與方式1相似,只是發送時將SCON寄存器中的TB8取出,作為第9位數據發送;接收時,若接收有效,則將接收到的第9位數據送到SCON
的RB8保存。
方式2和方式3多用于多機通信。三、波特率
1.方式0波特率
串行口方式0的波特率由振蕩器的頻率所確定:方式0波特率=振蕩器頻率/12
2.方式2波特率
串行口方式2的波特率由振蕩器的頻率和SMOD(PCON.7)所確定:
方式2波特率=2SMOD×振蕩器頻率/64
3.方式1和方式3的波特率
串行口方式1和方式3的波特率由定時器T1或T2(8052等單片機)的溢出率和SMOD所確定。T1和T2是可編程的,可以選的波特率范圍比較大,因此串行口方式1和3是最常用的工作方式。
(1)用定時器T1產生波特率。當定時器T1作為串行口的波特率發生器時,串行口方式1和3的波特率由下式確定:
方式1和3波特率=2SMOD×(T1溢出率)/32
定時器T1作波特率發生器時,應禁止T1中斷。通常T1工作于定時方式(C/T=0),計數脈沖為振蕩器的十二分頻信號。也可以選擇外部T1(P3.5)上的輸入脈沖作為T1計數信號(C/T=1)。T1的溢出率又和它的工作方式有關,一般選方式2定時,此時波特率的計算公式為:
方式1和方式3波特率=2SMOD×振蕩器頻率/﹛32×12[256(TH1)]﹜
(2)用定時器T2產生波特率。8052等單片機內的定時器T2也可以作為串行口的波特率發生器,置位T2CON中的TCLK或RCLK位,T2就工作于串行口的波特率發生器方式。這時T2的邏輯結構框圖如圖2-22所示。
圖2-22 T2波特率發生器方式結構
T2的波特率發生器方式和計數初值常數自動再裝入方式相似,若C/T2=0,以振蕩器的二分頻信號作為T2的計數脈沖,C/T2=1時,計數脈沖是外部引腳T2(P1.0)上的輸入信號。T2作為波特率發生器時,當TH2計數溢出時,將RCAP2H和RCAP2L中常數自動裝入TH2、TL2,使T2從這個初值開始計數,但是并不置“1”TF2,RCAP2H和RCAP2L中的常數由軟件設定后,T2的溢出率是嚴格不變的,因而使串行口方式1和3的波特率非常穩定,其值為:
方式1和3波特率=振蕩器頻率/32[65536-(RCAP2H)(RCAP2L)]
T2工作于波特率發生器方式時,計數溢出時不會置“1”TF2,不向CPU請求中斷,
因此可以不必禁止T2的中斷。如果EXEN2為1,當T2EX(P1.1)上輸入電平發生“1”至“0”的負跳變時,也不會引起RCAP2H和RCAP2L中的常數裝入TH2、TL2,僅僅
置位EXF2,向CPU請求中斷,因此T2EX可以作為一個外部中斷源使用。
在T2計數過程中(TR2=1)不應該對TH2、TL2進行讀/寫。如果讀,則讀出結果不會精確(因為每個狀態加1);如果寫,則會影響T2的溢出率使波特率不穩定。在T2的計數過程中可以對RCAP2H和RCAP2L進行讀但不能寫,如果寫也將使波特率不穩
定。因此,在初始化中,應先對TH2、TL2、RCAP2H、RCAP2L初始化編程以后才置“1”TR2,啟動T2計數。