數據通信的基本概念
串行通信有單工通信、半雙工通信和全雙工通信3種方式。
單工通信:數據只能單方向地從一端向另一端傳送。例如,目前的有線電視節目,只能單方向傳送。
半雙工通信:數據可以雙向傳送,但任一時刻只能向一個方向傳送。也就是說,半雙工通信可以分時雙向傳送數據。例如,目前的某些對講機,任一時刻只能一方講,另一方聽。
全雙工通信:數據可同時向兩個方向傳送。全雙工通信效率最高,適用於計算機之間的通信。
此外,通信雙方要正確地進行數據傳輸,需要解決何時開始傳輸,何時結束傳輸,以及數據傳輸速率等問題,即解決數據同步問題。
實現數據同步,通常有兩種方式,一種是異步通信,另一種是同步通信。
異步通信
在異步通信中,數據一幀一幀地傳送。每一幀由一個字符代碼組成,一個字符代碼由起始位、數據位、奇偶校驗位和停止位4部分組成。每一幀的數據格式如圖7-1所示。
一個串行幀的開始是一個起始位“0”,然后是5〜8位數據(規定低位數據在前,高位數據在后),接着是奇偶校驗位(此位可省略),最后是停止位“1”。
- 起始位
起始位"0”占用一位,用來通知接收設備,開始接收字符。通信線在不傳送字符時,一直保持為“1”。接收端不斷檢測線路狀態,當測到一個“0”電平時,就知道發來一個新字符,馬上進行接收。起始位還被用作同步接收端的時鍾,以保證以后的接收能正確進行。 - 數據位
數據位是要傳送的數據,可以是5位、6位或更多。當數據位是5位時,數據位為D0〜D4;當數據位是6位時,數據位為D0〜D5;當數據位是8位時,數據位為D0〜D7。 - 奇偶校驗位
奇偶校驗位只占一位,其數據位為D8。當傳送數據不進行奇偶校驗時,可以省略此位。此位也可用於確定該幀字符所代表的信息類型,“1"表明傳送的是地址幀,“0”表明傳送的是數據幀。 - 停止位
停止位用來表示字符的結束,停止位可以是1位、1.5位或2位。停止位必須是高電平。接收端接收到停止位后,就知道此字符傳送完畢。
圖7-1 (a)表示一個字符緊接一個字符的傳送情況,圖7-1 (b)表示兩個字符之間有空閑位的情況,空閑位為“1”,線路處於等待狀態。空閑位是異步通信的特征之一。
同步通信
在同步通信中,發送端首先發送同步字符,緊接着連續傳送數據(即數據塊),並由時鍾來實現發送端與接收端的同步。同步傳送時,字符與字符之間沒有間隙,僅在數據塊開始時用同步字符(SYNC)來指示,其數據格式如圖7-2所示。
同步通信傳送速度較快,但硬件結構比較復雜;異步通信的特點是硬件結構較簡單,但傳送速度較慢。
MCS-51單片機釆用異步通信方式。
波特率
波特率是數據傳送的速率,指每秒傳送二進制數據的位數,單位是位/秒(bps)。假設數據傳送速率是240字符/秒,而每個字符包含10個數據位
則傳送的波特率為10x240=2400bps
每一位代碼的傳送時間幾為波特率的倒數:
T=1/2400=0.4165ms
異步通信的波特率一般在50〜64000bps之間。
串行口的結構
MCS-51有一個可編程的全雙工串行通信接口,可作為通用異步接收/發送器UART,也可作為同步移位寄存器。
它的幀格式有8位、10位和11位,可以設置為固定波特率和可變波特率,給使用者帶來很大的靈活性。
80C51串行口的內部簡化結構如圖7-3所示。
圖中有兩個物理上獨立的接收、發送緩沖器SBUF,它們占用同一地址99H,可同時發送、接收數據。發送緩沖器只能寫入,不能讀出;接收緩沖器只能讀出,不能寫入。
串行發送與接收的速率與移位時鍾同步,定時器T1作為串行通信的波特率發生器,T1溢出率經2分頻(或不分頻)又經16分頻作為串行發送或接收的移位時鍾。移位時鍾的速率即波特率。
MCS-51單片機串行接口內部有一個發送數據緩沖器和一個接收數據緩沖器,簡稱串行數據緩沖器,共用一個地址99H;
一個串行口控制寄存器SCON,用來選擇串行口工作方式、控制數據接收和發送,並標示串行口的工作狀態等。
當串行口接收數據時,外界的串行信號通過單片機的引腳RXD (P3.0串行數據接收端),進入串行口的接收數據緩沖器。
當串行口發送數據時,CPU將數據寫入發送數據緩沖器,由發送數據緩沖器將數據通過引腳TXD (P3.1串行數據發送端),發送至外部的通信設備。
特殊功能寄存器PCON控制串行口的波特率。PCON中有一位是波特率倍增位。
串行口控制寄存器SCON
串行口控制寄存器SCON決定串行口通信工作方式,控制數據的接收和發送,並標示串行口的工作狀態等,其位格式為:
SMO、SM1:串行口工作方式控制位,對應4種工作方式,如表7-1所示(fosc是晶振頻率)。
SM2:多機通信控制位,主要用於工作方式2和工作方式3。
若SM2=1,則允許多機通信。
多機通信規定:第9位數據位為1 (即TB8=1),說明本幀數據為地址幀:第9位數據為0(即TB8=0),則本幀數據為數據幀。
當從機接收到的第9位數據(在RB8中)為1時,數據才裝入接收緩沖器SBUF,並置RI=1向CPU申請中斷;如果接收到的第9位數據(在RB8中)為0,則不置位中斷標志RL信息丟失。
當SM2=0時,則不管接收到第9位數據是否為1,都產生中斷標志RI,並將接收到的數據裝入SBUF。應用這一特點可以實現多機通信。
串行口工作在方式0時,SM2必須設置為0;工作在方式1時,如SM2=1,則只有接收到有效的停止位時才會激活RI。
REN:允許接收控制位。當REN=1時,允許接收;當REN=0時,禁止接收。此位由軟件置1或清零。
TB8:在方式2和方式3中,此位為發送數據的第9位,在多機通信中作為發送地址幀或數據幀的標志。TB8=1,說明該發送幀為地址幀;TB8=0,說明該發送幀為數據幀。在許多通信協議中,它可作為奇偶校驗位。此位由軟件置1或清零。在方式0和方式1中,此位未使用。
RB8:接收數據的第9位。在方式2和方式3中,接收到的第9位數據放在RB8中。它或是約定的奇/偶校驗位,或是約定的地址/數據標志位。在方式2和方式3多機通信中,若SM2=1且RB8=1,說明接收到的數據為地址幀。
TI:發送中斷標志位。在一幀數據發送完時置位。TI=1,申請中斷,說明發送緩沖器SBUF已空,CPU可以發送下一幀數據。中斷被響應后,TI不能自動清零,必須由軟件清零。 ,
RI:接收中斷標志位。在接收到一幀有效數據后,由硬件置位。RI=1.申請中斷,表示一幀數據接收結束,並已裝入接收緩沖器SBUF中,CPU響應中斷,取走數據。RI不能自動清零,必須由軟件清零。
串行口發送中斷標志TI和接收中斷標志RI共為一個中斷源。因此,CPU接收到中斷請求后,不知道是發送中斷TI還是接收中斷RI,必須用軟件來判別。單片機復位后,控制寄存器SCON的各位均清零。
特殊功能寄存器PCON
電源控制寄存器PCON中只有一位SMOD與串行口工作有關,它的位格式為:
SMOD:波特率倍增位。串行口工作在方式1、方式2、方式3時,若SMOD=1,則波特率提高一倍;
若SMOD=0,則波特率不提高一倍。單片機復位時,SMOD=0。
串行口的四種工作方式
MCS-51單片機串行口可設置4種工作方式,由SCON中的SMO、SM1進行定義。
方式0
方式0時,串行口為同步移位寄存器的輸入/輸出方式。主要用於擴展並行輸入或輸出口。數據由RXD (P3.0)引腳輸入或輸出,同步移位脈沖由TXD (P3.1)引腳輸出。發送和接收均為8位數據,低位在先,高位在后。波特率固定為focs/12。
方式0輸出
方式0時輸出時序如圖7-4所示。
對發送數據緩沖器SBUF寫入一個數據,就啟動了串行口的發送過程。內部的定時邏輯在SBUF寫入數據之后,經過一個完整的機器周期,輸出移位寄存器中輸出位的內容送RXD引腳輸出。移位脈沖由TXD引腳輸出,它使RXD引腳輸出的數據移入外部移位寄存器。當數據的最高位D7移至輸出移位寄存器的輸出位時,再移位一次后就完成了一字節的輸出,中斷標志TI置1。如要再發送下一字節數據,必須用軟件先將TI清零。
方式0輸入
方式0時輸入時序如圖7-5所示。
當SCON中的接收允許位REN=1,用指令使SCON中的RI為0時,就會啟動串行口接收過程。TXD引腳為串行輸入引腳,移位脈沖由TXD引腳輸出。當接收完一幀數據后,由硬件將輸入移位寄存器中的內容寫入SBUF,中斷標志RI置1。如要再接收數據,必須用軟件將RI清零。
方式0輸出時,串行口可以外接串行輸入並行輸出的移位寄存器,如74LS164、CD4094等,其接口邏輯如圖7-6所示。TXD引腳輸出的移位脈沖將RXD引腳輸出的數據(低位在先)逐位移入74LS164或CD4094。
方式0輸入時,串行口外接並行輸入串行輸出的移位寄存器,如74LS165,其接口邏輯如圖7-7所示。
方式1
串行口定義為方式1時,是10位數據的異步通信口。TXD為數據發送引腳,RXD為數據接收引腳,傳送一幀數據的格式如圖7-8所示。其中1位起始位、8位數據位、1位停止位。
方式1輸出
當執行一條寫SBUF的指令時,就啟動了串行口發送過程。在發送移位時鍾(由波特率確定)的同步下,從TXD引腳先送出起始位,然后是8位數據位,最后是停止位。一幀10位數據發送完后,中斷標志TI置1。方式1的發送時序如圖7-9所示。方式1的波特率由定時器1的溢出率決定。
方式1輸入
方式1的接收時序如圖7-10所示。
當用軟件置REN為1時,接收器以所選擇波特率的16倍速率釆樣RXD引腳電平,檢測到RXD引腳輸入電平發生負跳變時,則說明起始位有效,將其移入輸入移位寄存器,並開始接收這一幀信息的其余位。
在接收過程中,數據從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時,控制電路進行最后一次移位。當RI=0,且SM2=0 (或接收到的停止位為1)時,將接收到的9位數據的前8位數據裝入接收SBUF,第9位(停止位)進入RB8,並置RI=1,向CPU請求中斷。
方式2和方式3
串行口工作於方式2或方式3時,為11位數據的異步通信口。TXD為數據發送引腳,RXD為數據接收引腳,傳送一幀數據的格式如圖7-11所示。
由圖可見,串行口工作於方式2和方式3時起始位1位,數據位9位(含1位附加的第9位,發送時為SCON中的TB8,接收時為RB8)、停止位1位,一幀數據為11位。方式2的波特率固定為晶振頻率的1/64或1/32,方式3的波特率由定時器T1的溢出率決定。
方式2和方式3輸出
CPU向SBUF寫入數據時,就啟動了串行口的發送過程。SCON中的TB8寫入輸出移位寄存器的第9位,8位數據裝入SBUF。方式2和方式3的發送時序如圖7-12所示。
發送開始時,先把起始位0輸出到TXD引腳,然后發送移位寄存器的輸出位(D0)到TXD引腳。每一個移位脈沖都使輸出移位寄存器的各位右移一位,並由TXD引腳輸出。
第一次移位時,停止位“1”移入輸出移位寄存器的第9位上,以后每次移位,左邊都移入0。當停止位移至輸出位時,左邊其余位全為0,檢測電路檢測到這一條件時,使控制電路進行最后一次移位,並置TI=1,向CPU請求中斷。
方式2和方式3輸入
軟件使接收允許位REN為1后,接收器就以所選頻率的16倍速率開始取樣RXD引腳的電平狀態,當檢測到RXD引腳發生負跳變時,說明起始位有效,將其移入輸入移位寄存器,開始接收這一幀數據。方式2和方式3的接收時序如圖7-13所示。
接收時,數據從右邊移入輸入移位寄存器,在起始位。移到最左邊時,控制電路進行最后一次移位。當RI=0,且SM2=0 (或接收到的第9位數據為1)時,接收到的數據裝入接收緩沖器SBUF和RB8 (接收數據的第9位),置RI=1,向CPU請求中斷。如果條件不滿足,則數據丟失,且不置位RI,繼續搜索RXD引腳的負跳變。
多機通信的工作原理
MCS-51單片機具有多機通信功能。
串行口工作在方式2、方式3均可實現多機通信。串行控制寄存器SCON中的SM2和TB8、RB8相配合可以完成主從式多機通信。
多機通信規定:第9位數據位為1 (即TB8=1),說明本幀數據為地址幀;第9位數據為0 (即TB8=0)時,則本幀數據為數據幀。
若SM2=1,則僅當從機接收到的第9位數據為1時,數據才裝入接收緩沖器SBUF,並置RI=1,向CPU申請中斷;如果接收到的第9位數據為0,則不置位中斷標志RI,該幀信息丟棄。
主從式多機通信中,一台是主機,其余為從機,從機要服從主機的調度和支配。
在多機通信時,一台為主機,其他為從機,所有從機的SM2都必須置1。主機首先發送一幀地址數據中斷所有從機。從機接收到地址后,判斷主機發送地址是否為本機地址,若是本機地址,則將SM2清零,進入正式通信狀態,把本機的地址發送回主機作為應答信號,然后開始接收主機發來的數據或命令信息。其他從機由於地址不符,其SM2=1保持不變,不與主機通信,從中斷返回。
主從式多機通信遵循的通信協議為:
- 使所有從機的SM2=1,處於只接收地址幀的狀態。
- 主機向從機發送一幀地址信息,其中包括8位地址,且第9位為1,表示發送的是地址,中斷所有從機。
- 從機接收。
- 主機接收從機發回的應答地址信號后,與其發送的地址信息進行比較,如果相符,則使TB8=0,正式發送數據;如果不符,則發送錯誤信息。
- 通信的各機之間必須以相同的幀格式及波特率進行通信。
波特率的及算方法
在串行通信中,收發雙方對發送或接收的數據的波特率要有一個約定。
MCS-51單片機串行口有4種工作方式:方式0和方式2的波特率固定不變;方式1和方式3的波特率可以變化,由定時器T1的溢出速率決定。
下面介紹串行口 4種工作方式對應的波特率。
方式0的波特率
釆用工作方式0時,移位脈沖由機器周期的第6個狀態周期S6給出,每個機器周期產生一個移位脈沖,發送或接收一位數據。因此,波特率是固定的,為振盪頻率的1/12,不受PCON寄存器中SMOD的影響。用公式表示為
工作方式0的波特率 = fosc/12
方式2的波特率
釆用工作方式2時,移位脈沖由振盪頻率fosc的第二節拍P2時鍾(即fosc/2)給出,所以,方式2波特率取決於PCON中的SMOD位的值,當SMOD=0時,波特率為fosc/64;當SMOD=1時,波特率為人fosc/32。用公式表示為
工作方式2的波特率=(2^SMOD/64) * fosc
方式1和方式3的波特率
方式1和方式3的移位脈沖由定時器T1的溢出速率決定。因此,方式1和方式3的波特率由定時器T1的溢出速率與SMOD值同時決定。用公式表示為
方式1、方式3的波特率=(2*SMOD/32) x T1的溢出速率
其中,T1的溢出速率取決於T1的計數速率(在定時方式時,計數速率 = fosc/12)和T1的預置初值。
定時器T1作為波特率發生器時,通常選用定時器T1工作在方式2,並使其工作在定時方式(即C/T=0)。
此時,T1的計數速率為fosc/12 (這時應禁止T1中斷)。設定時器初值為X,則每過“256-X”個機器周期,定時器T1產生一次溢出。用公式表示為
T1 的溢出速率=(fosc/12) / (256-X)
當給出波特率后,可用下式計算出定時器T1工作在方式2的初始值為
X=256-(fosc * (SMOD+1) / (384*波特率)
當T1作為波特率發生器時,最典型的用法是使T1工作在自動再裝入的8位定時器方式(即方式2,且TCON的TR1=1,以啟動定時器)。這時溢出速率取決於TH1中的計數值。
在單片機應用中,常用的晶振頻率為12MHz和11.0592MHz。所以,選用的波特率也相對固定。常用的串行口波特率與各參數的關系如表7-2所示。
在使用串行口之前,應對其進行初始化,主要是設置產生波特率的定時器1、串行口控制和中斷控制。具體步驟如下。
- 確定T1的工作方式(編程TMOD寄存器);
- 計算T1的初值,裝載TH1、TL1;
- 啟動T1 (編程TCON中的TR1位);
- 確定串行口控制(編程SCON寄存器);
- 串行口在中斷方式工作時,要進行中斷設置(編程IE、IP寄存器)。