目錄
1 概述
1.1 并行通信和串行通信
1.2 串行通信的兩種方式
1.2.1 異步通信
1.2.2 同步通信
1.3 串行通信的資料傳送方向
2 串行通信口的結構與原理
2.1 串行通信口的結構
2.2 串行通信口的工作原理
2.2.1 接收資料過程
2.2.2 發送資料過程
3 串行通信口的控制寄存器
3.1 串行控制寄存器(SCON)
3.2 電源控制寄存器(PCON)
4 四種工作方式與波特率的設定
4.1 方式0
4.1.1 方式0-發送資料
4.1.2 方式0-接收資料
4.2 方式1
4.2.1 方式1-發送資料
4.2.2 方式1-接收資料
4.3 方式2
4.3.1 方式2-發送資料
4.3.2 方式2-接收資料
4.4 方式3
4.5 波特率的設定
4.5.1 方式0的波特率
4.5.2 方式2的波特率
4.5.3 方式1和方式3的波特率
1 概述
通信的概念比較廣泛,在單片機技術中,單片機與單片機或單片機與其他裝置之間的資料傳輸稱為通信。
1.1 并行通信和串行通信
根據資料傳輸方式的不同,可将通信分并行通信和串行通信兩種。同時傳輸多位資料的方式稱為并行通信。同時傳輸一位資料的方式稱為串行通信。
如圖1(a)所示,在并行通信方式下,單片機中的8位資料10011101通過8條資料線同時送到外部裝置中。并行通信的特點是資料傳輸速度快,但由于需要的傳輸線多,故成本高,隻适合近距離的資料通信。逐位傳輸資料的方式稱為串行通信。
如圖1(b)所示,在串行通信方式下,單片機中的8位資料10011101通過一條資料線逐位傳送到外部裝置中。串行通信的特點是資料傳輸速度慢,但由于隻需要一條傳輸線,故成本低,适合遠距離的資料通信。
圖1 通信方式
1.2 串行通信的兩種方式
串行通信又可分為異步通信和同步通信兩種。51系列單片機采用異步通信方式。
1.2.1 異步通信
在異步通信中,資料是一幀一幀傳送的。異步通信如圖2 所示,這種通信是以幀為機關進行資料傳輸,一幀資料傳送完成後,可以接着傳送下一幀資料,也可以等待,等待期間為空閑位(高電平)。圖2 異步通信
(1)幀資料格式
在串行異步通信時,資料是以幀為機關傳送的。異步通信的幀資料格式如圖3所示。從圖中可以看出,一幀資料由起始位、資料位、奇偶校驗位和停止位組成。
圖3 異步通信的幀資料格式
① 起始位。
表示一幀資料的開始,起始位一定為低電平。當單片機要發送資料時,先送一個低電平(起始位)到外部裝置,外部裝置接收到起始信号後,馬上開始接收資料。
② 資料位。
它是要傳送的資料,緊跟在起始位後面。資料位的資料可以是5~8位,傳送資料時是從低位到高位逐位進行的。
③ 奇偶校驗位。
該位用于檢驗傳送的資料有無錯誤。奇偶校驗是檢查資料傳送過程中是否發生錯誤的一種校驗方式,分為奇校驗和偶校驗。奇校驗是指資料位和校驗位中“1”的總個數為奇數,偶校驗是指資料位和校驗位中“1”的總個數為偶數。以奇校驗為例,若單片機傳送的資料位中有偶數個“1”,為保證資料和校驗位中“1”的總個數為奇數,奇偶校驗位應為“1”,如果在傳送過程中資料位中有資料産生錯誤,其中一個“1”變為“0”,那麼傳送到外部裝置的資料位和校驗位中“1”的總個數為偶數,外部裝置就知道傳送過來的資料發生錯誤,會要求重新傳送資料。資料傳送采用奇校驗或偶校驗均可,但要求發送端和接收端的校驗方式一緻。在幀資料中,奇偶校驗位也可以不用。
④ 停止位。
它表示一幀資料的結束。停止位可以是1位、1.5位或2位,但一定為高電平。一幀資料傳送結束後,可以接着傳送第二幀資料,也可以等待,等待期間資料線為高電平(空閑位)。如果要傳送下一幀,隻要讓資料線由高電平變為低電平(下一幀起始位開始),接收器就開始接收下一幀資料。
(2)51系列單片機的幾種幀資料方式
51 系列單片機在串行通信時,根據設定的不同,其傳送的幀資料有以下四種方式:
① 方式0。
稱為同步移位寄存器輸入/輸出方式,它是單片機通信中較特殊的一種方式,通常用于并行I/O接口的擴充,這種方式中的一幀資料隻有8位(無起始位、停止位)。
② 方式1。
在這種方式中,一幀資料中有1位起始位、8位資料位和1位停止位,共10位。
③ 方式2。
在這種方式中,一幀資料中有1位起始位、8位資料位、1位可程式設計位和1位停止位,共11位。
④ 方式3。
這種方式與方式2相同,一幀資料中有1位起始位、8位資料位、1位可程式設計位和1位停止位,它與方式2的差別僅在于波特率(資料傳送速率)設定不同。
1.2.2 同步通信
在異步通信中,每一幀資料發送前要用起始位,結束時要用停止位,這樣會占用一定的時間,導緻資料傳輸速度較慢。為了提高資料傳輸速度,在計算機與一些高速裝置進行資料通信時,常采用同步通信。同步通信的幀資料格式如圖4所示。圖4 同步通信的幀資料格式
從圖中可以看出,同步通信的資料後面取消了停止位,前面的起始位用同步信号代替,在同步信号後面可以跟很多資料,是以同步通信傳輸速度快。但由于在通信時要求發送端和接收端嚴格保持同步,這需要用複雜的電路來保證,是以單片機很少采用這種通信方式。
1.3 串行通信的資料傳送方向
串行通信根據資料的傳送方向可分為三種方式:單工方式、半雙工方式和全雙工方式。這三種傳送方式如圖5所示。圖5 資料傳送方式
① 單工方式。在這種方式下,資料隻能向一個方向傳送。單工方式如圖5(a)所示,資料隻能由發送端傳輸給接收端。
② 半雙工方式。在這種方式下,資料可以雙向傳送,但同一時間内,隻能向一個方向傳送,隻有一個方向的資料傳送完成後,才能往另一個方向傳送資料。半雙工方式如圖5(b)所示,通信的雙方都有發送器和接收器,一方發送時,另一方接收,由于隻有一條資料線,是以雙方不能在發送的同時進行接收。
③ 全雙工方式。在這種方式下,資料可以雙向傳送,通信的雙方都有發送器和接收器,由于有兩條資料線,是以雙方在發送資料的同時可以接收資料。全雙工方式如圖5(c)所示。
2 串行通信口的結構與原理
單片機通過串行通信口可以與其他裝置進行資料通信,将資料傳送給外部裝置或接受外部裝置傳送來的資料,進而實作更強大的功能。
2.1 串行通信口的結構
51單片機的串行通信口的結構如圖6所示。圖6 串行通信口的結構
與串行通信口有關的部件主要有:
① 兩個資料緩沖器SBUF。
SBUF是可以直接尋址的特殊功能寄存器(SFR),它包括發送SBUF和接收SBUF,發送SBUF用來發送串行資料,接收SBUF用來接收資料,兩者共用一個位址(99H)。在發送資料時,該位址指向發送SBUF;而在接收資料時,該位址指向接收SBUF。
② 輸入移位寄存器。
在接收控制器的控制下,将輸入的資料逐位移入接收SBUF。
③ 串行控制寄存器 SCON。
SCON 的功能是控制串行通信口的工作方式,并反映串行通信口的工作狀态。
④ 定時器T1。
T1用作波特率發生器,用來産生接收和發送資料所需的移位脈沖,移位脈沖的頻率越高,接收和傳送資料的速率越快。
2.2 串行通信口的工作原理
串行通信口有接收資料和發送資料兩個工作過程,下面以圖6所示的串行通信口結構為例來說明這兩個工作過程。
2.2.1 接收資料過程
在接收資料時,若RXD端(與P3.2引腳共用)接收到一幀資料的起始信号(低電平),SCON寄存器馬上向接收控制器發出允許接收信号,接收控制器在定時器/計數器T1産生的移位脈沖信号控制下,控制輸入移位寄存器,将 RXD 端輸入的資料由低到高逐位移入輸入移位寄存器中,資料全部移入輸入移位寄存器後,移位寄存器再将全部資料送入接收 SBUF中,同時接收控制器通過或門向CPU發出中斷請求,CPU馬上響應中斷,将接收SBUF中的資料全部取走,進而完成了一幀資料的接收。後面各幀的資料接收過程與上述相同。
2.2.2 發送資料過程
相對于接收過程來說,串行通信口發送資料的過程較簡單。當CPU要發送資料時,隻要将資料直接寫入發送SBUF中,就啟動了發送過程。在發送控制器的控制下,發送門打開,先發送一位起始信号(低電平),然後依次由低到高逐位發送資料,資料發送完畢,最後發送一位停止位(高電平),進而結束一幀資料的發送。一幀資料發送完成後,發送控制器通過或門向CPU發出中斷請求,CPU響應中斷,将下一幀資料送入SBUF,開始發送下一幀資料。
3 串行通信口的控制寄存器
串行通信口的工作受串行控制寄存器SCON和電源控制寄存器PCON的控制。
3.1 串行控制寄存器(SCON)
SCON 寄存器用來控制串行通信的工作方式及反映串行通信口的一些工作狀态。SCON寄存器是一個8位寄存器,它的位址為98H,其中每位都可以位尋址。SCON寄存器各位的名稱和位址如下。① SM0、SM1位:串行通信口工作方式設定位。
通過設定這兩位的值,可以讓串行通信口工作在四種不同的方式,具體見表1,這幾種工作方式在後面将會詳細介紹。
表1 串行通信口工作方式設定位及其功能
② SM2位:用來設定主-從式多機通信。
當一個單片機(主機)要與其他幾個單片機(從機)通信時,就要對這些位進行設定。當SM2=1時,允許多機通信;當SM2=0時,不允許多機通信。
③ REN位:允許/禁止資料接收的控制位。
當REN=1時,允許串行通信口接收資料;當REN=0時,禁止串行通信口接收資料。
④ TB8位:方式2、3中發送資料的第9位。
該位可以用軟體規定其作用,可用作奇偶校驗位,或在多機通信時,用作位址幀或資料幀的标志位,在方式0和方式1中,該位不用。
⑤ RB8位:方式2、3中接收資料的第9位。
該位可以用軟體規定其作用,可用作奇偶校驗位,或在多機通信時,用作位址幀或資料幀的标志位,在方式1中,若SM2=0,則RB8是接收到的停止位。
⑥ TI位:發送中斷标志位。
當串行通信口工作在方式0時,發送完8位資料後,該位自動置“1”(即硬體置“1”),向CPU發出中斷請求,在CPU響應中斷後,必須用軟體清0;在其他幾種工作方式中,該位在停止位開始發送前自動置“1”,向CPU發出中斷請求,在CPU響應中斷後,也必須用軟體清0,以準備開始發送下一幀資料。
⑦ RI位:接收中斷标志位。
當串行通信口工作在方式0時,接收完8位資料後,該位自動置“1”,向CPU發出接收中斷請求,在CPU響應中斷後,必須用軟體清0;在其他幾種工作方式中,該位在接收到停止位期間自動置“1”,向CPU發出中斷請求,在CPU響應中斷取走資料後,必須用軟體對該位清0,以準備開始接收下一幀資料。在上電複位時,SCON各位均為“0”。
3.2 電源控制寄存器(PCON)
PCON寄存器是一個8位寄存器,它的位元組位址為87H,不可位尋址,并且隻有最高位SMOD與串行通信口控制有關。PCON寄存器各位的名稱和位元組位址如下。SMOD位:波特率設定位。
在串行通信口工作在方式1~3時起作用。若SMOD=0,波特率不變;當SMOD=1時,波特率加倍。在上電複位時,SMOD=0。
4 四種工作方式與波特率的設定
串行通信口有四種工作方式,工作在何種方式受SCON寄存器的控制。在串行通信時,要改變資料傳送速率(波特率),可對波特率進行設定。
4.1 方式0
當SCON寄存器中的SM0=0、SM1=0時,串行通信口工作在方式0。
方式0稱為同步移位寄存器輸入/輸出方式,常用于擴充I/O端口。在單片機發送或接收串行資料時,通過RXD端發送資料或接收資料,而通過TXD端送出資料傳輸所需的移位脈沖。
在方式0時,串行通信口又分兩種工作情況:發送資料和接收資料。
4.1.1 方式0-發送資料
當串行通信口工作在方式0時,若要發送資料,通常在外部接8位串/并轉換移位寄存器74LS164,具體連接配接電路如圖7所示。其中RXD端用來輸出串行資料,TXD端用來輸出移位脈沖,P1.0端用來對74LS164進行清0。圖7 串行通信在方式0時的資料發送電路
在單片機發送資料前,先從P1.0引腳發出一個清0信号(低電平)到74LS164的CLR引腳,對其進行清0,讓D7~D0全部為“0”,然後單片機在内部執行寫SBUF指令,開始從RXD端(P3.0引腳)送出8位資料,與此同時,單片機的TXD端輸出移位脈沖到74LS164的CLK引腳,在移位脈沖的控制下,74LS164接收單片機RXD端送到的8位資料(先低位後高位),資料發送完畢,在74LS164的D7~D0端輸出8位資料。另外,在資料發送結束後,SCON寄存器的發送中斷标志位TI自動置“1”。
4.1.2 方式0-接收資料
當串行通信口工作在方式0時,若要接收資料,一般在外部接8位并/串轉換移位寄存器74LS165,具體連接配接電路如圖8 所示。在這種方式時,RXD端用來接收輸入的串行資料,TXD端用來輸出移位脈沖,P1.0端用來對74LS165的資料進行鎖存。圖8 串行通信口在方式0時的資料接收電路
在單片機接收資料前,先從 P1.0 引腳發出一個低電平信号到74LS165 的
引腳,讓74LS165鎖存由D7~D0端輸入的8位資料,然後單片機内部執行讀SBUF指令,與此同時,單片機的TXD端送移位脈沖到74LS165的CLK1引腳,在移位脈沖的控制下,74LS165中的資料逐位從RXD端送入單片機,單片機接收資料完畢,SCON寄存器的接收中斷标志位RI自動置“1”。
在方式0中,串行通信口發送和接收資料的波特率都是fosc/12。
4.2 方式1
當SCON寄存器中的SM0=0、SM1=1時,串行通信口工作在方式1。
在方式1時,串行通信口可以發送和接收每幀10位的串行資料。其中TXD端用來發送資料,RXD端用來接收資料。
在方式1中,一幀資料中有10位,包括1位起始位(低電平)、8位資料位(低位在前)和1位停止位(高電平)。在方式1時,串行通信口又分兩種工作情況:發送資料和接收資料。
4.2.1 方式1-發送資料
在發送資料時,若執行寫SBUF指令,發送控制器在移位脈沖(由定時器/計數器T1産生的信号再經16或32分頻而得到)的控制下,先從TXD端送出一個起始位(低電平),然後再逐位将8位資料從 TXD 端送出,當最後一位資料發送完成,發送控制器馬上将SCON的TI位置“1”,向CPU發出中斷請求,同時從TXD端輸出停止位(高電平)。
4.2.2 方式1-接收資料
在方式1時,需要設定SCON中的REN=1,串行通信口才允許接收資料。由于不知道外部裝置何時會發送資料,是以串行通信口會不斷檢測RXD端,當檢測到RXD端有負跳變(由“1”變為“0”)時,說明外部裝置發來了資料的起始位,于是啟動RXD端接收,将輸入的8位資料逐位移入内部的輸入移位寄存器。8位資料全部進入輸入移位寄存器後,如果滿足RI位為“0”、SM2位為“0”(若SM2不為“0”,但接收到的資料停止位為“1”也可以)的條件,輸入移位寄存器中的8位資料才可以放入SBUF,停止位的“1”才能送入SCON的RB8位中,RI位就會被置“1”,向CPU發出中斷請求,讓CPU取走SBUF中的資料,如果條件不滿足,輸入移位寄存器中的資料将無法送入SBUF而丢棄,重新等待接收新的資料。
4.3 方式2
當SCON寄存器中的SM0=1、SM1=0時,串行通信口工作在方式2。
在方式2時,串行通信口可以發送和接收每幀11位的串行資料,其中1位起始位、8位資料位、1位可程式設計位和1位停止位。TXD端用來發送資料,RXD端用來接收資料。
在方式2時,串行通信口又分兩種工作情況:發送資料和接收資料。
4.3.1 方式2-發送資料
在方式2時,發送的一幀資料有11位,其中有9位資料,第9位資料取自SCON中的TB8位。在發送資料前,先用軟體設定TB8位的值,然後執行寫SBUF指令(如MOV SBUF,A),發送控制器在内部移位脈沖的控制下,從TXD端送出一個起始位(低電平),然後逐位送出8位資料,再從TB8位中取出第9位并送出,當最後一位資料發送完成,發送控制器馬上将SCON的TI位置“1”,向CPU發出中斷請求,同時從TXD端輸出停止位(高電平)。
4.3.2 方式2-接收資料
在方式2時,同樣需設定SCON的REN=1,串行通信口才允許接收資料,然後不斷檢測RXD端是否有負跳變(由“1”變為“0”),若有,說明外部裝置發來了資料的起始位,于是啟動RXD端接收資料。當8位資料全部進入輸入移位寄存器後,如果RI位為“0”、SM2位為“0”(若SM2不為“0”,但接收到的第9位資料為“1”也可以),輸入移位寄存器中的8位資料才可以送入SBUF,第9位會放進SCON的RB8位,同時RI位置“1”,向CPU發出中斷請求,讓CPU取走SBUF中的資料,否則輸入移位寄存器中的資料将無法送入SBUF而丢棄。
4.4 方式3
當SCON中的SM0=1、SM1=1時,串行通信口工作在方式3。方式3與方式2一樣,傳送的一幀資料都為11位,工作原理也相同,兩者的差別僅在于波特率不同,方式2的波特率固定為fosc/64或fosc/32,而方式3的波特率則可以設定。
4.5 波特率的設定
在串行通信中,為了保證資料的發送和接收成功,要求發送方發送資料的速率與接收方接收資料的速率相同,而将雙方的波特率設定相同就可以達到這個要求。在串行通信的四種方式中,方式0的波特率是固定的,而方式1~方式3的波特率則是可變的。波特率是資料傳送的速率,它用每秒傳送的二進制數的位數來表示,機關符号是bit/s。
4.5.1 方式0的波特率
方式0的波特率固定為時鐘振蕩頻率的1/12,即方式0的波特率 = fosc/12
4.5.2 方式2的波特率
方式2的波特率由PCON寄存器中的SMOD位決定。
當SMOD = 0時,方式2的波特率為時鐘振蕩頻率的1/64;
當SMOD = 1時,方式2的波特率加倍,為時鐘振蕩頻率的1/32,即
方式2的波特率 =
4.5.3 方式1和方式3的波特率
方式1和方式3的波特率除了與SMOD位有關,還與定時器/計數器T1的溢出率有關。方式1和方式3的波特率可用下式計算:
方式1、3的波特率 = T1的溢出率·
/32
T1的溢出率是指定時器/計數器T1在機關時間内計數産生的溢出次數,也即溢出脈沖的頻率。
在将定時器/計數器T0設作工作方式3時,T1可以工作在方式0、方式1或方式2三種方式下。
當T1工作于方式0時,它對脈沖信号(由時鐘信号fosc經12分頻得到)進行計數,計到
時會産生一個溢出脈沖到串行通信口作為移位脈沖;
當T1工作于方式1和2時,則分别要計到
和−X(X為T1的初值,可以設定)才産生溢出脈沖。
如果要提高串行通信口的波特率,可讓T1工作在方式2,因為該方式計數時間短,溢出脈沖頻率高,并且能通過設定T1的初值來調節計數時間,進而改變T1産生的溢出脈沖的頻率(又稱T1的溢出率)。
當T1工作在方式2時,T1兩次溢出的時間間隔,也即T1的溢出周期為
T1的溢出周期 = (
− X)·12/ fosc
T1的溢出率為溢出周期的倒數,即
T1的溢出率 = fosc/[12·(
− X)]
故當T1工作在方式2時,串行通信口工作方式1、3的波特率為
方式1、3的波特率 = (
/32)·fosc/[12·(− X)]
由上式可推導出T1在方式2時,其初值X為
X =
− (·fosc)/(384·波特率)
舉例:單片機的時鐘頻率fosc=11.0592MHz,現要讓串行通信的波特率為2400bit/s,可将串行通信口的工作方式設為1、T1的方式設為2,并求出T1應設的初值。
求T1初值的過程如下。
先進行寄存器設定:為了讓波特率不倍增,将 PCON 寄存器中的資料設為00H,這樣SMOD位就為“0”;設定TMOD寄存器中的資料為20H,這樣T1就工作在方式2。再計算并設定T1的初值:
X =
− ·fosc/384·波特率 = 256 −( × 11.0592 ×)/(384 × 2400)= 244
十進制數244轉換成十六進制數為F4H,将T1的初值設為F4H。
由于設定波特率和初值需要計算,比較麻煩,一般情況下可查表來進行設定。常見的波特率設定見表2。
表2 常用的波特率設定