詳解單片機中的串行口

(此處已添加圈子卡片,請到今日頭條客戶端查看)

單片機內部有一個功能強大的全雙工串行口,該串行口有四種工作方式,以供不同場合使用。波特率可由軟件設置,由片內的定時器/計數器產生。串行口接收、發送均可工作在查詢方式或中斷方式,使用十分靈活。

單片機的串行口除了用於數據通信之外,還可以用來驅動單片機應用系統中的鍵盤和顯示器,這是其他微機系統所不能比擬的。

串行口的結構與控制

為了進行串行數據通信,單片機同樣也需要相應的串行接口電路。不過這個接口電路不是單獨的芯片,而是集成在單片機芯片的內部,成為單片機芯片的一個組成部分。

80C51單片機內部的串行口,由發送緩衝寄存器 SBUF、接收緩衝寄存器 SBUF、發送控制寄存器、接收控制寄存器、輸入移位寄存器和輸出控制門組成。控制單片機串行口的控制寄存器共有兩個:特殊功能寄存器 SCON 和 PCON,可以用軟件改變兩者的內容來控制串行口的工作方式和波特率。

緩衝寄存器SBUF

80C51單片機內部有一個全雙工的串行通信口,即串行接收和發送緩衝器SBUF,這兩個在物理上是獨立的接收發送器,既可以接收數據,也可以發送數據。但接收緩衝器只能讀出不能寫入,而發送緩衝器則只能寫入不能讀出,兩個緩衝器共用同一個地址(99H)。

這個通信口既可用於網絡通信,也可實現串行異步通信,還可以當成同步移位寄存器使用。如果在通信口的輸入輸出引腳上加上電平轉換器,還可方便地構成標準的RS-232和RS-485接口。

在邏輯上,SBUF只有一個,既表示發送寄存器,又表示接收寄存器,具有同一個地址(99H)。在物理上,SBUF有兩個,一個是發送寄存器,另一個是接收寄存器。

串行口控制寄存器SCON

該寄存器的字節地址為98H,有位尋址功能。

SCON格式如下:

詳解單片機中的串行口

SM0(SCON.7)、SM1(SCON.6):控制串行口的工作方式。

SM2(SCON.5):允許方式2和方式3進行多機通信控制位。在方式2或方式3中,如SM2=1,則接收到的第9位數據(RB8)為0時不激活RI。在方式1時,如SM2=1,則只有收到有效停止位時才會激活RI。若沒有接收到有效停止位,則RI清0。在方式0中,SM2必須置為0。

REN(SCON.4):允許串行接收控制位。REN=1允許串行接收,REN=0則禁止串行接收。該標誌由軟件來置1或清0。

TB8(SCON.3):是工作在方式2和方式3時,該位是要發送的第9位數據。在一些通信協議中該第9位用於奇偶校驗(補奇或補偶);而在MCS-51多處理機通信中,這一位是區別地址幀還是數據幀的標誌,需要時由軟件置位或復位。

RB8(SCON.2):是工作在方式2和方式3時,該位是已接收到的第9位數據,它是奇偶校驗位。在MCS-51多處理機通信中是區別地址幀/數據幀的標誌。在模式1中,若SM2=0,RB8存放的是已接收數據的停止位。在模式0中,RB8未用,需要時由軟件來置1或清0。

TI(SCON.1):發送中斷標誌位。在模式0中,發送完第8位數據時由硬件置位;在其他模式中發送停止位開始時刻由硬件置位。置位時TI=1,申請中斷,CPU響應中斷後,由軟件來清除TI再發送下一幀數據。

RI(SCON.0):接收中斷標誌位。在模式0中,接收完第8位數據時由硬件自動置位;在模式 1 中,SM2=1,只有接收到有效的停止位,才能對 RI 置位。在其他模式中,在接收停止位的半中間由硬件對RI置位。置位時申請中斷,CPU響應中斷後取走數據,清除RI標誌,必須由軟件清零。

SCON的所有位復位時被清零。

特殊功能寄存器PCON

其字節地址為87H,沒有位尋址功能。PCON的格式如下:

詳解單片機中的串行口

其中與串行接口有關的只有D7位。

SMOD:波特率選擇位。

串行口的工作方式

串行口有四種工作方式,它們是由串行口控制寄存器 SCON 的 SM0、SM1的狀態來定義的,編碼及功能如表2-3所示。在這四種工作方式中,串行通信只使用方式1、2、3。方式0主要用於擴展並行輸入/輸出口。

詳解單片機中的串行口

表2-3 串行口工作方式

表中:fosc為晶振頻率,UART為通用異步接收和發生器。

方式0

在方式 0 狀態下,串行口為同步移位寄存器輸入/輸出方式,其波特率是固定不變的,數據由RxD(P3.0)端輸入,同步移位脈衝由TxD(P3.1)端輸出。方式0主要用於擴展並行輸入輸出口(如串行LED數碼管顯示系統等)。

(1)方式0發送

當一個數據寫入串行口發送緩衝器SBUF時,串行口即將8位數據以fosc/12的波特率從RxD引腳輸出(從低位到高位),發送完8位數據時,將發送中斷標誌TI置1。TxD引腳輸出同步脈衝,波形如圖2-22所示。

(2)方式0接收

在滿足REN=1和RI=0的條件下,就會啟動一次接收過程,此時RxD為串行輸入端,TxD為同步脈衝輸出端。串行接收的波特率為fosc/12,其時序如圖2-23所示。當接收完一幀數據(8位)後,控制信號復位,中斷標誌 RI 被置 1,呈中斷申請狀態。當再次接收時,必須通過軟件將RI清零。

詳解單片機中的串行口

▲圖2-22 串行口“方式0”發送時序

詳解單片機中的串行口

▲圖2-23 串行口“方式0”接收時序

在方式0中,SCON中的TB8、RB8位沒用,多機通信控制位SM2位必須為0。在方式0下發送或接收完8位數據時,由硬件置1併發送中斷標誌TI或RI,向CPU申請中斷,CPU響應TI或RI中斷後,標誌TI或RI必須由用戶程序清0。

方式1

串行口以方式1工作時,SCON中的SM0、SM1兩位分別為0、1,則串行口被控制為波特率可變的8位異步通信接口。發送的每幀信息為10位:1位起始位,8位數據位(先低位後高位)和1位停止位。

(1)方式1發送

串行口以方式1發送時,數據由TxD端輸出,CPU執行一條數據寫入發送數據緩衝器SBUF的指令,數據字節寫入SBUF後,就啟動串行口發送器發送。發送完一幀信息的數據位後,發送中斷標誌置1,其時序如圖2-24所示。

詳解單片機中的串行口

▲圖2-24 串行口“方式1”發送時序

(2)方式1接收

當REN=1時,允許接收器接收,數據從RxD端輸入。接收器以所選波特率的16倍速率採樣RxD端的電平,當檢測到RxD端從1到0的跳變時,啟動接收器接收,並復位內部的16分頻計數器,以便實現同步。

在起始位,如果接收到的值不為0,則起始位無效,復位接收電路,當再次接收到一個由1到0的跳變時,重新啟動接收器。如果接收值為0,則起始位有效,接收器開始接收本幀的其餘信息(一幀信息為10位)。在方式1接收中,若同時滿足以下兩個條件:RI=0、SM2=0和接收到的停止位=1時,則接收數據有效,實現裝載SBUF、停止位進入PB8、接收中斷標誌RI置1。接收控制器再次採樣RxD的負跳變,以便接收下一幀數據。

若這兩個條件不能同時滿足,信息將丟失。中斷標誌RI必須由用戶的軟件清零,通常情況下,串行口以方式1工作時,SM2置為0。方式1的接收時序如圖2-25所示。

詳解單片機中的串行口

▲圖2-25 串行口“方式1”接收時序

方式2

當SM0、SMl兩位分別為1、0時,串行口工作在方式2,此時串行口被定義為9位異步通信接口。發送時可編程位(TB8)根據需要設置為0或1,接收時,可編程位被送入SCON中的RB8。

(1)方式2發送

在方式2發送時,數據由TxD端輸出,發送一幀信息由11位組成:1位起始位、8位數據位(低位在先、高位在後)、1位可編程位(第9位數據位)和1位停止位,附加的第9位數據為 SCON中的 TB8。TB8由軟件置 1 或清 0,可作為多機通信中的數據標誌位,也可作為數據的奇偶校驗位。

CPU在執行一條寫SBUF的指令後,便立即啟動發送器發送,送完一幀信息後,TI被置1,其時序如圖2-26所示。在發送下一幀信息之前,TI必須由中斷服務程序(或查詢程序)清0。

詳解單片機中的串行口

▲圖2-26 串行口“方式2”發送時序

(2)方式2接收

當 SM0、SMl兩位分別為1、0,且 REN=1 時,允許串行口以方式 2 接收數據。數據由 RxD端輸入,接收11位信息:1位起始位、8位數據位、1位可編程位(第9位數據)和1位停止位。當接收器採樣到RxD端從1到0的跳變,並判斷起始位有效後,便開始接收一幀信息。當接收器接收到第9位數據後,如果RI=0且SM2=0或接收到的第9位數據為1時,接收到的數據送入SBUF,第9位數據送入RB8,並置RI=1,其時序如圖2-27所示。若不能同時滿足這兩個條件,接收的信息將丟失。

詳解單片機中的串行口

▲圖2-27 串行口“方式2”接收時序

方式3

當SM0、SM1兩位為11時,串行口工作在方式3,方式3為波特率可變的9位異步通信方式,除了波特率外,方式3和方式2的發送時序和接收時序相同。

波特率的計算與串行口初始化

波特率的計算

在串行通信中,收發雙方的波特率必須保持一致。通過軟件可設定串行口的4種工作方式,並確定每種方式的波特率。

(1)方式0的波特率是固定的,為單片機晶振頻率fosc的1/12,即BR=fosc/12。

如fosc=6MHz,則波特率500kbit/s;如fosc=12MHz,則波特率為1Mbit/s。

(2)方式 2 的波特率也是固定的,且有兩種。一種是晶振頻率的 1/32,另一種是晶振頻率的1/64,即fosc/32和fosc/64。如用公式表示為:

詳解單片機中的串行口

式中,SMOD為特殊功能寄存器PCON串行口波特率係數的控制位,SMOD=1表示波特率加倍。注意,PCON不能使用位尋址,只能對其進行字節操作。

如12M晶振系統中,若SMOD=0,則波特率=187.5kbit/s;SMOD=1,則波特率375kbit/s。

(3)方式1和方式3的波特率是可變的,其波特率由定時器1的計數溢出(對80C52來說,也可使用定時器2的計數溢出)決定,公式為:

詳解單片機中的串行口

式中定時器1溢出率計算公式為:

詳解單片機中的串行口

各種方式波特率的計算如表2-4所示。

詳解單片機中的串行口

表2-4 波特率的計算公式

表中,若SMOD=0,則K=1;若SMOD=1,則K=2。

通常使用單片機的串行口時,選用的晶振頻率 fosc比較固定(一般為 6MHz , 12MHz 或11.0592MHz)。單片機和微機通信時,選用的波特率也相對固定。

實際使用中,經常根據已知波特率和時鐘頻率來計算定時器T1的初值。為方便使用,將常用的波特率和初值X間的關係列成表2-5。

詳解單片機中的串行口

表2-5 常用通信方式及其波特率

其中有以下三點需要注意。

(1)表2-5中僅為一些特定系統串口通信時的典型數據,對於其他一些未列出的波特率,應通過前述公式進行計算獲取。並可進行相關參數調整,以獲得需求的波特率。

(2)在使用的時鐘振盪頻率為12MHz或6MHz時,表中初值X和相應的波特率之間有一定誤差。例如,FDH的對應的理論值是10416波特(時鐘振盪頻率為6MHz時),與9600波特相差816波特,消除誤差可以通過調整時鐘振盪頻率 fosc來實現。例如,如果採用的時鐘振盪頻率為11.0592MHz,在要求串行通信的系統中,為保證串行通信準確,一般使用11.0592Hz的晶振。

(3)如果串行通信選用很低的波特率,可將定時器T1設置為方式1定時。但T1溢出時,需要在中斷服務程序中重新裝入初值。中斷響應時間和執行指令時間也會使波特率產生一定的誤差,可用改變初值的方法進行適當調整。

串行通信的校驗

異步通信時可能會出現幀格式錯、超時錯等傳輸錯誤。在具有串行口的單片機的開發中,應考慮在通信過程中對數據差錯進行校驗,因為差錯校驗是保證準確無誤通信的關鍵。常用差錯校驗方法有奇偶校驗(80C51系列單片機編程採用此法)、和校驗及循環冗餘碼校驗等。

(1)奇偶校驗

在發送數據時,數據位尾隨的一位數據為奇偶校驗位(1或0)。當設置為奇校驗時,數據中1的個數與校驗位1的個數之和應為奇數;當設置為偶校驗時,數據中1的個數與校驗位中1的個數之和應為偶數。接收時,接收方應具有與發送方一致的差錯檢驗設置,當接收一個字符時,對 1的個數進行校驗,若二者不一致,則說明數據傳送出現了差錯。

奇偶校驗是按字符校驗,數據傳輸速度將受到影響。這種特點使得它一般只用於異步串行通信中。

(2)和校驗

所謂和校驗,是指發送方將所發送的數據塊求和(字節數求和),併產生一個字節的校驗字符(校驗和)附加到數據塊末尾。接收方接收數據時也是先對數據塊求和,將所得結果與發送方的校驗和進行比較,相符則無差錯,否則即出現了差錯。這種和校驗的缺點是無法檢驗出字節位序的錯誤。

(3)循環冗餘碼校驗

這種校驗是對一個數據塊校驗一次。例如對磁盤信息的訪問、ROM或RAM存儲區的完整性等的檢驗。這種方法廣泛應用於串行通信方式。

串行口初始化

在使用單片機串行口之前,應對其進行編程初始化,主要是設置產生波特率的定時器1、串行口控制和中斷控制,具體步驟如下。

(1)確定定時器l的工作方式——編程TMOD寄存器。

(2)計算定時器l的初值——裝載THl、TLl。

(3)啟動定時器1——編程TCON中的TRl位。

(4)確定串行口的控制——編程SCON。

(此處已添加圈子卡片,請到今日頭條客戶端查看)


分享到:


相關文章: