C51 UART 串列埠通訊
SBUF 暫存器:它是兩個在物理上獨立的接收、傳送緩衝器,可同時傳送、接收資料,可通過指令對SBUF 的讀寫來區別是對接收緩衝器的操作還是對傳送緩衝器的操作。從而控制外部兩條獨立的收發訊號線RXD(P3.0)、TXD(P3.1),同時傳送、接收資料,實現全雙工。
序列口控制暫存器SCON(見表1) 。
表1 SCON暫存器
表1 SCON暫存器
表中各位(從左至右為從高位到低位)含義如下。
SM0 和SM1 :序列口工作方式控制位,其定義如表2 所示。
表2 序列口工作方式控制位
表2 序列口工作方式控制位
其中,fOSC 為微控制器的時鐘頻率;波特率指序列口每秒鐘傳送(或接收)的位數。
SM2 :多機通訊控制位。 該僅用於方式2 和方式3 的多機通訊。其中傳送機SM2 = 1(需要程式控制設定)。接收機的序列口工作於方式2 或3,SM2=1 時,只有當接收到第9 位資料(RB8)為1 時,才把接收到的前8 位資料送入SBUF,且置位RI 發出中斷申請引發序列接收中斷,否則會將接受到的資料放棄。當SM2=0 時,就不管第位資料是0 還是1,都將資料送入SBUF,並置位RI 發出中斷申請。工作於方式0 時,SM2 必須為0。
REN :序列接收允許位:REN =0 時,禁止接收;REN =1 時,允許接收。
TB8 :在方式2、3 中,TB8 是傳送機要傳送的第9 位資料。在多機通訊中它代表傳輸的地址或資料,TB8=0 為資料,TB8=1 時為地址。
RB8 :在方式2、3 中,RB8 是接收機接收到的第9 位資料,該資料正好來自發送機的TB8,從而識別接收到的資料特徵。
TI :序列口傳送中斷請求標誌。當CPU 傳送完一序列資料後,此時SBUF 暫存器為空,硬體使TI 置1,請求中斷。CPU 響應中斷後,由軟體對TI 清零。
RI :序列口接收中斷請求標誌。當序列口接收完一幀序列資料時,此時SBUF 暫存器為滿,硬體使RI 置1,請求中斷。CPU 響應中斷後,用軟體對RI 清零。
電源控制暫存器PCON(見表3) 。
表3 PCON暫存器
表3 PCON暫存器
表中各位(從左至右為從高位到低位)含義如下。
SMOD :波特率加倍位。SMOD=1,當序列口工作於方式1、2、3 時,波特率加倍。SMOD=0,波特率不變。
GF1、GF0 :通用標誌位。
PD(PCON.1) :掉電方式位。當PD=1 時,進入掉電方式。
IDL(PCON.0) :待機方式位。當IDL=1 時,進入待機方式。
另外與序列口相關的暫存器有前面文章敘述的定時器相關暫存器和中斷暫存器。定時器暫存器用來設定波特率。中斷允許暫存器IE 中的ES 位也用來作為序列I/O 中斷允許位。當ES = 1,允許 序列I/O 中斷;當ES = 0,禁止序列I/O 中斷。中斷優先順序暫存器IP的PS 位則用作序列I/O 中斷優先順序控制位。當PS=1,設定為高優先順序;當PS =0,設定為低優先順序。
波特率計算:在瞭解了序列口相關的暫存器之後,我們可得出其通訊波特率的一些結論:
① 方式0 和方式2 的波特率是固定的。
在方式0 中, 波特率為時鐘頻率的1/12, 即fOSC/12,固定不變。
在方式2 中,波特率取決於PCON 中的SMOD 值,即波特率為:
當SMOD=0 時,波特率為fosc/64 ;當SMOD=1 時,波特率為fosc/32。
② 方式1 和方式3 的波特率可變,由定時器1 的溢位率決定。
從而波特率的計算公式由公式(2)所示:
在實際應用時,通常是先確定波特率,後根據波特率求T1 定時初值,因此式(2)又可寫為:
C51序列口有0、1、2、3四種工作方式。
方式0:8位同步移位暫存器方式
方式1:10位通用非同步通訊
方式2:11位非同步通訊
方式3:可變波特率11位非同步通訊。
方式0:同步移位暫存器方式,波特率固定為fosc/12.
由RXD(P3.0)引腳輸入和輸出資料,由TXD(P3.1)引腳輸出同步移位時鐘。
傳送:當執行一條寫SBUF的指令(MOV SBUF ,A)時,就啟動序列資料的傳送。
接收:當滿足REN=1(允許接受)且接收中斷標誌RI=0是,就會啟動一次接受過程。
方式1:10位通用非同步通訊
一幀資訊為10位:1位為起始位(0),8位資料位,1位停止位(1)
TXD(P3.1)是傳送端。RXD(p3.2)是接收端。
採用T1作為序列口接收和傳送的波特率發生器,資料傳輸波特率可調,由T1的溢位決定,可用程式設定。
TI:傳送中斷標誌
方式0中,在傳送第8位末尾置位;其它方式中,在傳送停止位開始時設定。TI=1表示傳送幀結束。由硬體置位,用
軟體清零。必須清零,因為如果TI始終等於1,則表示傳送幀結束,也就不會再發送幀 。(TI=1表示一直處於中斷狀態,也就無法傳送了,所以要清零)
RI:接收中斷標誌
方式0中,在接收第8位末尾置位;其他方式中,在接收停止位中間設定,RI=1表示幀接收結束。由硬體置位,用軟體清除。(RI=1表示一直處於中斷狀態,也就無法接受了,所以要清零。)
TI和RI是同一個中斷源,兩者共用一箇中斷向量。CPU事先不知道是傳送中斷TI還是接收中斷RI產生的中斷請求,所以在全雙工通訊時,必須由軟體來判別。
REN:允許接收位
REN=0,禁止接收;REN=1,允許接受。軟體設定。
TB8:方式2和方式3中要傳送的第9位資料。在通訊協議中,常規定TB8為奇偶校驗位。在8051多機通訊中,
TB8用來表示主機發送的是地址還是資料:TB8=0為資料,TB8=1為地址。用軟體來置位/清除。
RB8:方式2和方式3中接受到的第9位資料。
方式1中接收到的是停止位。方式0中不使用這一位
波特率選擇
在序列通訊中,收發雙方的資料傳送率(波特率)要有一定的約定。在8051序列口的四種工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可變的,由定時器T1的溢位率控制。
方式0
方式0的波特率固定為主振頻率的1/12。
方式2
方式2的波特率由PCON中的選擇位SMOD來決定,可由下式表示:
波特率=2的SMOD次方除以64再乘一個fosc,也就是當SMOD=1時,波特率為1/32fosc,當SMOD=0時,波特率為1/64fosc
方式1和方式3
定時器T1作為波特率發生器,其公式如下:
波特率=2^SMOD/32 * 定時器T1溢位率
T1溢位率= T1計數率/產生溢位所需的週期數
式中T1計數率取決於它工作在定時器狀態還是計數器狀態。當工作於定時器狀態時,T1計數率為fosc/12;當工作於計數器狀態時,T1計數率為外部輸入頻率,此頻率應小於fosc/24。產生溢位所需週期與定時器T1的工作方式、T1的預置值有關。
定時器T1工作於方式0:溢位所需週期數=8192-x
定時器T1工作於方式1:溢位所需週期數=65536-x
定時器T1工作於方式2:溢位所需週期數=256-x
因為方式2為自動重灌入初值的8位定時器/計數器模式,所以用它來做波特率發生器最恰當。
當時鍾頻率選用11.0592MHZ時,取易獲得標準的波特率,所以很多微控制器系統選用這個看起來“怪”的晶振就是這個道理。
下表列出了定時器T1工作於方式2常用波特率及初值。
常用波特率 Fosc(MHZ) SMOD TH1初值
19200 11.0592 1 FDH
9600 11.0592 0 FDH
4800 11.0592 0 FAH
2400 11.0592 0 F4H
1200 11.0592 0 E8H
例如9600 11.0592 0 FDH
波特率=定時器T1溢位率
T1溢位率= T1計數率/產生溢位所需的週期數
產生溢位所需的週期數=256-FD(253)=3
SMOD=0 11059200/12*3 *1/32=9600
波特率計算
在序列通訊中,收發雙方對傳送或接收的資料速率要有一定的約定,我們通過軟體對MCS—51序列口程式設計可約定四種工作方式。其中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時器T1的溢位率決定。
序列口的四種工作方式對應著三種波特率。由於輸人的移位時鐘的來源不同,所以,各種方式的波特率計算公式也不同。
一、方式0的波特率
方式0時,移位時鐘脈衝由56(即第6個狀態週期,第12個節拍)給出,即每個機器週期產生一個移位時鐘,傳送或接收一位資料。所以,波特率為振盪頻率的十二分之一,並不受 PCON暫存器中SMOD的影響,即:
方式0的波特率=fosc/12