文章插圖

文章插圖
單片機內部有一個功能強大的全雙工串行口,該串行口有四種工作方式,以供不同場合使用 。波特率可由軟件設置,由片內的定時器/計數器產生 。串行口接收、發送均可工作在查詢方式或中斷方式,使用十分靈活 。
單片機的串行口除了用于數據通信之外,還可以用來驅動單片機應用系統中的鍵盤和顯示器,這是其他微機系統所不能比擬的 。
串行口的結構與控制
為了進行串行數據通信,單片機同樣也需要相應的串行接口電路 。不過這個接口電路不是單獨的芯片,而是集成在單片機芯片的內部,成為單片機芯片的一個組成部分 。
80C51單片機內部的串行口,由發送緩沖寄存器 SBUF、接收緩沖寄存器 SBUF、發送控制寄存器、接收控制寄存器、輸入移位寄存器和輸出控制門組成 。控制單片機串行口的控制寄存器共有兩個:特殊功能寄存器 SCON 和 PCON,可以用軟件改變兩者的內容來控制串行口的工作方式和波特率 。
緩沖寄存器SBUF
80C51單片機內部有一個全雙工的串行通信口,即串行接收和發送緩沖器SBUF,這兩個在物理上是獨立的接收發送器,既可以接收數據,也可以發送數據 。但接收緩沖器只能讀出不能寫入,而發送緩沖器則只能寫入不能讀出,兩個緩沖器共用同一個地址(99H) 。
這個通信口既可用于網絡通信,也可實現串行異步通信,還可以當成同步移位寄存器使用 。如果在通信口的輸入輸出引腳上加上電平轉換器,還可方便地構成標準的RS-232和RS-485接口 。
在邏輯上,SBUF只有一個,既表示發送寄存器,又表示接收寄存器,具有同一個地址(99H) 。在物理上,SBUF有兩個,一個是發送寄存器,另一個是接收寄存器 。
串行口控制寄存器SCON
該寄存器的字節地址為98H,有位尋址功能 。
SCON格式如下:
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的格式如下:
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 。如用公式表示為:
如12M晶振系統中,若SMOD=0,則波特率=187.5kbit/s;SMOD=1,則波特率375kbit/s 。
(3)方式1和方式3的波特率是可變的,其波特率由定時器1的計數溢出(對80C52來說,也可使用定時器2的計數溢出)決定,公式為:
表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 。
- 蘋果手機聯通移動哪個信號好 iphone用移動還是聯通信號好
- 單片機協議都有哪些? 單片機通訊協議有哪些
- 常用的隧道協議有哪些 不屬于隧道協議的是?
- 基于單片機的溫度自動控制系統 基于單片機的溫度控制器
- pic單片機編程入門 pic單片機編程語言
- 藍牙通信的基本原理 藍牙通信的工作原理
- 線程間通信的方式有哪幾種 線程通信的三種方式
- android線程間通信方式 Android線程通信
- 實時通信技術 即時通信架構
- 單片機keil軟件使用 單片機編程軟件keil4
