單片機原理與應用KFIL C項目教程(西電版)項目八 串行口通信_第1頁
單片機原理與應用KFIL C項目教程(西電版)項目八 串行口通信_第2頁
單片機原理與應用KFIL C項目教程(西電版)項目八 串行口通信_第3頁
單片機原理與應用KFIL C項目教程(西電版)項目八 串行口通信_第4頁
單片機原理與應用KFIL C項目教程(西電版)項目八 串行口通信_第5頁
已閱讀5頁,還剩161頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、項目八 串行口通信 項目八 串行口通信 8.1 項目說明項目說明 8.2 基礎知識基礎知識 8.3 項目實施項目實施 8.4 項目評價項目評價 8.5 拓展與提高拓展與提高項目八 串行口通信 8.1 項項 目目 說說 明明 項目任務項目任務利用2個hot-51單片機實驗板實現雙機通信,一個作為發送方,另一個作為接收方。將發送方實驗板上矩陣式鍵盤中的16個按鍵均設置為數字鍵,當檢測到有鍵閉合時,將閉合鍵的鍵號顯示在接收方實驗板的數碼管上。項目八 串行口通信 知識培養目標知識培養目標(1) 掌握基本通信方式、串行通信方式及制式。(2) 掌握51單片機串行口的結構及工作方式。(3) 掌握51單片機串

2、行口波特率的設置。(4) 掌握方式0的應用。(5) 掌握雙機通信。項目八 串行口通信 能力培養目標(1) 能利用所學知識畫出實現該任務的原理圖。(2) 能利用所學知識正確地實現雙機通信連接。(3) 能利用keil c編寫實現雙機通信任務的源程序。(4) 培養解決問題的能力。(5) 培養溝通表達、團隊協作的能力。項目八 串行口通信 8.2 基基 礎礎 知知 識識8.2.1 串行通信概述串行通信概述1. 通信概述通信概述在單片機控制系統中,單片機與外部設備、單片機與單片機或者計算機與單片機之間經常要進行信息交換,這些信息交換稱為通信?;镜耐ㄐ欧绞接胁⑿型ㄐ藕痛型ㄐ艃煞N。項目八 串行口通信 (1

3、) 并行通信:待傳送n位數據用n條數據線同時傳送(發送或接收)的通信方式。在并行通信中,一個并行數據占多少位二進制數,就要用多少根傳輸線,此外還需要一條地線和若干條控制信號線。這種方式的特點是通信速度快,但傳輸線較多,成本較高,僅適用于短距離的數據傳輸。圖8-1所示為傳送8位數據11110100時并行通信示意圖。項目八 串行口通信 圖8-1 并行通信 項目八 串行口通信 圖8-2 串行通信 項目八 串行口通信 (2) 串行通信:待傳送數據的各位在一條數據線上按一定的順序分時傳送(發送或接收)。串行通信中不管傳送多少位二進制數,都只需1條數據線,再加上1條公共信號地線或若干條控制信號線,故在遠距

4、離傳輸數據時比較經濟,但由于它每次只能傳送1位二進制數,故傳送速度較慢。圖8-2所示為傳送8位數據11110100時串行通信示意圖。51單片機內有4個并行i/o口用于并行通信、一個全雙工uart(異步串行通信接口)用于串行通信。項目一項目七中主要介紹并行口p0p3的應用,本項目主要介紹串行口的應用。項目八 串行口通信 2. 串行通信方式串行通信方式串行通信有異步串行通信和同步串行通信兩種方式。1) 異步串行通信異步串行通信是指通信的發送方與接收方使用各自的時鐘控制數據的發送和接收,為使雙方收、發協調,要求發送和接收設備的時鐘盡可能一致。異步通信時只需要一條通信線路就可以實現從一方到另一方的數據

5、傳送,兩條線路則可以實現數據的雙向傳輸。項目八 串行口通信 在異步通信中,數據通常是以字符為單位進行傳送的,1個字符完整的通信格式,通常稱為幀或幀格式。發送端逐幀發送,接收端逐幀接收。異步串行通信中幀格式一般由起始位、數據位、奇偶校驗位和停止位四部分組成,如圖8-3所示。異步通信時,發送方先發送1位起始位“0”,然后是58位數據,規定低位在前,高位在后,其后是奇偶校驗位(可無),最后是停止位“1”。從起始位開始到停止位結束,構成完整的1幀字符。項目八 串行口通信 圖8-3 異步串行通信數據格式 項目八 串行口通信 (1) 異步串行通信各位的作用。起始位:起始位在一幀數據的開始位置,占1位,為低

6、電平“0”,用于表示1幀數據的開始。通信線上沒有數據傳送時,為高電平1,接收端不斷檢測通信線的狀態,當連續若干個“1”之后檢測到一個“0”時,就知道發送方發送了一個新的字符,準備接收。數據位:起始位之后的若干位就是數據位。數據位可以是5、6、7或8位(不同計算機的規定不同)。傳送時先是低位,后是高位。 項目八 串行口通信 奇偶校驗位:數據位之后是奇偶校驗位,占1位。奇偶校驗是通過對數據進行奇偶性檢查,來判斷字符傳送的正確性。有奇校驗、偶校驗、無校驗三種選擇,用戶可根據需要選擇(在有的格式中,該位可省略)。通信雙方須事先約定是采用奇校驗,還是偶校驗。停止位:一幀字符的末尾是停止位,用于表示一幀字

7、符的結束。停止位是高電平“1”,占用1位、1.5位或2位,不同計算機的規定有所不同。這里的“位”對應于一定的發送時間,因此可以有半位。項目八 串行口通信 異步串行通信是逐幀進行數據傳輸的,一幀中各位之間的時間間隔應該相同,所以必須保證兩個單片機之間有相同的傳輸波特率,如果傳輸波特率不同,則時間間隔不同,當誤差超過5%時,就不能正常進行通信;但是由于在信息傳輸時,各字符可以連續傳送,也可以斷續傳送,因而幀與幀之間的時間間隔可以是不固定的,幀與幀之間是高電平。項目八 串行口通信 (2) 異步串行通信的主要特點。異步串行通信的各單片機時鐘相互獨立,其時鐘頻率可以不相同,在通信時不要求有同步時鐘信號,

8、易實現;異步串行通信以幀為單位進行傳輸,而幀有固定格式,通信雙方只須按約定的幀格式來發送和接收數據,因此,硬件結構比同步串行通信方式簡單;此外,它還能利用校驗位檢測錯誤,所以在單片機與單片機、單片機與計算機之間仍廣泛采用異步串行通信。異步串行通信的缺點是傳輸效率低。當采用1位起始位、8位數據位、1位奇偶位與1位停止位的幀格式時,有效數據僅占到了1幀字符的73%。數據位減少時,傳輸效率更低。項目八 串行口通信 2) 同步串行通信同步串行通信時由發送方對接收方進行時鐘的直接控制,從而使雙方達到完全同步。同步通信是以數據塊的形式進行數據的傳輸。每個數據塊包括同步字符、數據和校驗字符,如圖8-4所示。

9、同步字符:同步字符位于數據塊的開始處,有12個字符,以實現發送端和接收端同步。一旦檢測到約定的同步字符,就開始連續地發送和接收數據。數據:數據是傳送的正文內容,由多個字符組成。校驗字符:校驗字符位于數據塊的最后,用于檢驗傳送的數據是否正確。項目八 串行口通信 圖8-4 同步串行通信數據格式 項目八 串行口通信 同步串行通信的主要特點:同步串行通信以數據塊為單位傳送,去掉了每個字符都必須具有的開始和結束標志,且一次可以發送一個數據塊(多個數據),因此,同步通信的速度高于異步通信。由于這種方式易于進行串行外圍擴展,所以目前很多型號的單片機都增加了串行同步通信接口,如目前已得到廣泛應用的i2c串行總

10、線和spi串行接口等。短距離同步通信時發送、接收方均采用兩條通信線,其中一條用于由發送方向接收方提供時鐘信號,另一條用于傳送數據。再多加兩條通信線,可以實現數據的雙向傳輸,51單片機不支持數據的雙向同步傳輸,只能分時復用兩條通信線。項目八 串行口通信 同步通信要求發送方和接收方時鐘嚴格保持同步,在通信時通常要求有同步時鐘信號,對硬件結構要求較高,所以較少使用。3. 串行通信的制式串行通信的制式在串行通信中,根據兩機之間數據的傳送方向,分為單工制式、半雙工制式和全雙工制式三種。三種制式的示意圖分別如圖8-5(a)、(b)、(c)所示。 (1) 單工制式。在單工制式下,數據在甲機和乙機之間只允許單

11、方向傳送。例如,甲機發送、乙機接收,因而兩機之間只需1條數據線。項目八 串行口通信 圖8-5 串行通信的三種制式 項目八 串行口通信 (2) 半雙工制式。在半雙工制式下,數據在甲機和乙機之間允許雙方向傳送,但它們之間只有一個通信回路,接收和發送不能同時進行,只能分時發送和接收(即甲機發送、乙機接收,或者乙機發送、甲機接收),因而兩機之間也只需1條數據線。(3) 全雙工制式。在全雙工制式下,甲、乙兩機之間數據的發送和接收可以同時進行,稱為全雙工傳送。全雙工制式的串行通信必須使用2條數據線。不管哪種制式的串行通信,在兩機之間均應有公共地線。項目八 串行口通信 4. 串行通信的傳送速率串行通信的傳送

12、速率傳送速率是指數據傳送的速度,即每秒鐘傳送二進制數的位數。在串行通信中,數據傳送速率的單位用b/s或bps表示,稱為波特率。假設每秒要傳送120幀字符,每幀由1個起始位、8個數據位和1個停止位共10位組成,則波特率為(1+8+1)b120/s = 1200 b/s每一位的傳送時間為波特率的倒數,即t= 1/1200 = 0.833 ms項目八 串行口通信 國際規定的標準波特率系列為110、300、600、1200、1800、2400、4800、9600、19200,常用于計算機crt終端,以及雙機或多機之間的通信等。51單片機的串行口的波特率可以通過程序進行設置。5. 通信協議通信協議在雙機

13、或多機通信時,通常要遵守一定的通信協議。通信協議是指通信雙方進行數據傳輸時的一些約定,包括數據格式、同步方式、通信方式、波特率、雙機之間握手信號等問題的約定等。為保證通信雙方能夠準確、可靠地通信,相互之間必須遵循在通信之前約定的通信協議。項目八 串行口通信 8.2.2 51單片機串行口簡介單片機串行口簡介51系列單片機芯片內部有一個uart串行接口,它是一個可編程的全雙工異步串行通信接口,占用p3.0(串行數據接收端rxd)和p3.1(串行數據發送端txd)兩個引腳。通過軟件編程可以設置為通用異步接收和發送器,也可設置為同步移位寄存器,還可實現多機通信。有8位、10位和11位三種幀格式,并能設

14、置各種波特率,使用靈活、方便。1. 51單片機串行口結構單片機串行口結構51單片機串行口結構框圖如圖8-6所示。它主要由發送/接收緩沖寄存器sbuf、輸入移位寄存器、發送控制器、接收控制器以及串行口控制寄存器scon等組成。項目八 串行口通信 圖8-6 串行口結構框圖 項目八 串行口通信 串行口控制寄存器scon用于設置串行口的工作方式、接收/發送控制以及設定狀態標志等;發送緩沖寄存器sbuf用于存放準備串行發送的數據;接收緩沖寄存器sbuf用于接收由外設輸入到輸入移位寄存器中的數據;定時器t1作為波特率發生器。在進行串行通信時,外部數據通過引腳rxd(p3.0,串行數據接收端)輸入,輸入數據

15、首先逐位進入輸入移位寄存器,將串行數據轉換為并行數據,然后再送入接收緩沖寄存器sbuf。接收時,由輸入移位寄存器和接收緩沖sbuf構成雙緩沖結構,以避免在接收到第2幀數據時,cpu未及時響應接收寄存器前一幀的中斷請求,沒把前一幀數據讀走,而造成2幀數據重疊的錯誤。項目八 串行口通信 在發送數據時,串行數據通過引腳txd(p3.1,串行數據發送端)輸出。由于cpu是主動的,因此不會產生寫重疊問題,不需要雙緩沖器結構。要發送的數據通過發送控制器控制邏輯門電路逐位輸出。2. 51單片機串行口的特殊功能寄存器單片機串行口的特殊功能寄存器與串行口工作有關的特殊功能寄存器有sbuf、scon、pcon;與

16、串行口中斷有關的特殊功能寄存器有ie和ip。項目八 串行口通信 1) 發送/接收緩沖寄存器sbuf發送與接收緩沖寄存器sbuf在特殊功能寄存器中共用同一個字節地址99h,且共用一個名稱,但在物理上是兩個獨立的寄存器,可以同時發送、接收數據。cpu通過指令決定訪問哪一個寄存器,執行寫指令時,訪問發送緩沖寄存器;執行讀指令時,訪問接收緩沖寄存器。該寄存器只能字節尋址,單片機復位后,sbuf=0。項目八 串行口通信 2) 串行口控制寄存器scon串行口控制寄存器scon用于串行口工作方式設定、接收和發送控制等。在特殊功能寄存器中,scon的字節地址為98h,位地址(由低位到高位)分別是98h9fh,

17、該寄存器可以位尋址。單片機復位后,scon=0。scon格式如表8-1所示。sm0、sm1串行口工作方式選擇位。串行口有四種工作方式,由用戶設置,如表8-2所示。項目八 串行口通信 表表8-1 串行口控制寄存器串行口控制寄存器scon(98h) 項目八 串行口通信 表表8-2 串行口的工作方式串行口的工作方式 項目八 串行口通信 sm2多機通信控制位,由用戶設置。用于方式2和方式3。sm2=0時,單片機通信;sm2=1時,多機通信。當sm2=1,允許多機通信時,如果接收到的第9位rb8為0,則ri不置1,不接收主機發來的數據;只有當sm2=1,且rb8為1時,才能夠將ri置1,產生中斷請求,將

18、接收到的8位數據送入sbuf。當sm2=0時,不論rb8為0還是1,都將接收到的8位數據送入sbuf,并產生中斷。ren接收允許位,由用戶設置。ren=1時,允許接收;ren=0時,禁止接收。項目八 串行口通信 tb8發送數據的第9位,由用戶設置。用于方式2或方式3。雙機通信時,約定為奇偶校驗位;多機通信時,用以區分地址幀或數據幀,tb8=1時,發送的是地址幀,tb8=0時,發送的是數據幀。方式0和方式1中未用該位。rb8接收數據的第9位,由用戶設置。用于方式2或方式3。雙機通信時,約定為奇偶校驗位;多機通信時,用以區分地址幀或數據幀,rb8=1時,接收到的是地址幀,rb8=0時,接收到的是數

19、據幀。方式0中未用該位;方式1中,如果sm2=0,則rb8為接收到的停止位。 ti發送中斷標志位,由硬件置位、用戶清除。方式0中,發送完8位數據后,由硬件置位;其他方式中,在發送停止位之初,由硬件置位。ti=1時,可向cpu申請中斷,也可供軟件查詢。無論任何方式,都必須由用戶軟件清除ti。項目八 串行口通信 ri接收中斷標志位,由硬件置位、用戶清除。方式0中,接收完8位數據后,由硬件置位;其他方式中,在接收停止位的中間,由硬件置位。ri=1時,可向cpu申請中斷,也可供軟件查詢用。無論任何方式,都必須由用戶軟件清除ri。例如,設置串行口為方式1,允許接收數據時,scon應為50h,即字節尋址:

20、scon=0 x50;位尋址:sm0=0;sm1=1;ren=1; 項目八 串行口通信 3) 電源控制寄存器pcon電源控制寄存器pcon主要用于電源控制。在特殊功能寄存器中,pcon的字節地址為87h,該寄存器不能位尋址。單片機復位后,pcon=0。pcon格式如表8-3所示,在電源控制寄存器pcon中只有最高位smod對串行通信有影響。smod波特率倍增控制位,由用戶設置。當smod=1時,波特率加倍;當smod=0時,波特率不變。項目八 串行口通信 表表8-3 電源控制寄存器電源控制寄存器pcon(87h) 項目八 串行口通信 4) 中斷允許控制寄存器ie中斷允許控制寄存器ie用于控制與

21、管理單片機的中斷系統,可以位尋址,由用戶設置。ie中的es位用于設置串行口是否允許中斷,當es=0時,串行口關中斷;當es=1時,串行口開中斷。5) 中斷優先級寄存器ip中斷優先級寄存器ip用于管理單片機中各中斷源的中斷優先級,可以位尋址,由用戶設置。ip中的ps位用于設置串行口中斷優先級,當ps=0時,設置串行口為低優先級中斷;當ps=1時,設置串行口為高優先級中斷。項目八 串行口通信 8.2.3 串行通信工作方式串行通信工作方式如前所述,51單片機的串行口有四種工作方式,由串行口控制寄存器scon中sm0、sm1兩位進行設置。1. 方式方式0采用方式0時,串行口作為8位同步移位寄存器,在發

22、送數據時,sbuf相當于一個并行輸入、串行輸出的移位寄存器;在接收數據時,sbuf相當于一個串行輸入、并行輸出的移位寄存器。方式0時l幀字符為8位,先發送或接收最低位,其幀格式為項目八 串行口通信 這種方式常用于擴展i/o口,波特率固定為fosc/12。由不同的指令實現輸入或輸出,串行數據由rxd(p3.0)輸入或輸出,由txd(p3.1)提供同步移位脈沖。發送與接收過程如下。(1) 發送。將某一字節數據寫入sbuf時,由txd輸出同步移位脈沖,由rxd發送sbuf中的數據(低位在前),波特率為fosc/12;8位數據發送完成后,由硬件將發送中斷標志位ti置1,中斷方式時向cpu申請中斷;在中

23、斷服務函數中,先由用戶將ti清0,然后再給sbuf送入下一個待發送的字符。項目八 串行口通信 (2) 接收。由于ren是串行口允許接收控制位,在ri=0時,先要由用戶軟件置ren為1,允許接收數據。然后讀取sbuf,由txd輸出同步移位脈沖,cpu從rxd端接收串行數據(低位在前),波特率為fosc/12;當接收到8位數據時,由硬件將接收中斷標志ri置為1,中斷方式時向cpu申請中斷;在中斷服務函數中,先由用戶將ri清0,然后讀取sbuf。采用方式0時,串行口控制寄存器scon中的sm2位必須為0、tb8和rb8位未使用。每當發送或接收完8位數據時,由硬件將發送中斷ti或接收中斷ri標志置位,

24、不管是中斷方式還是查詢方式,硬件都不會清除ti或ri標志,必須由用戶軟件清0。方式0主要用于擴展單片機的并行i/o口。項目八 串行口通信 2. 方式方式1采用方式1時,串行口為10位通用異步通信接口。發送或接收的1幀字符,包含1位起始位0、8位數據位和1位停止位1。其幀格式為波特率由t1的溢出率決定,由用戶設置。采用方式1時txd為數據發送端,rxd為數據接收端,發送與接收過程如下。項目八 串行口通信 (1) 發送。將某一字節數據寫入發送緩沖寄存器sbuf時,數據從引腳txd(p3.1)端異步發送。發送完1幀數據后,由硬件將發送中斷標志位ti置1,中斷方式時向cpu申請中斷,通知cpu發送下一

25、個數據;在中斷服務函數中,先由用戶將ti清0,然后再給sbuf送入下一個待發送的字符。(2) 接收。在ri=0時,先要由用戶軟件置ren為1,允許接收數據;串行口采樣引腳rxd(p3.0),當采樣到1至0的跳變時,表示接收起始位0,開始接收1幀數據,當停止位到來時,將停止位送至rb8,同時,由硬件將接收中斷標志ri為1,中斷方式時向cpu申請中斷,通知cpu從sbuf取走接收到的1個數據;在中斷服務函數中,先由用戶將ri清0,然后讀取sbuf。項目八 串行口通信 不管是中斷方式,還是查詢方式,都不會清除ti或ri標志,必須由用戶軟件清0。通常在單片機與單片機雙機串行口通信、單片機與計算機串行口

26、通信、計算機與計算機串行口通信時,都可以選擇方式1。項目八 串行口通信 3. 方式方式2和方式和方式3方式2和方式3均為11位異步串行通信方式,除了波特率的設置方法不同外,其余完全相同。方式2的波特率固定,由pcon中的smod位選擇;方式3的波特率由t1溢出率控制。這兩種方式發送/接收的1幀字符為11位,包含1位起始位0、8位數據位、1位可編程位(tb8/rb8)和1位停止位1。其幀格式為采用方式2和方式3時,txd為數據發送端,rxd為數據接收端,發送與接收過程如下。項目八 串行口通信 (1) 發送。發送前,首先根據通信協議由軟件設置tb8(如作奇偶校驗位或地址/數據標識位),然后將要發送

27、的數據寫入發送緩沖寄存器sbuf。在發送時,串行口自動將已定義的tb8位加入待發送的8位數據之后作為第9位,組成一幀完整字符后,由txd端異步發送。發送完l幀數據后,由硬件將發送中斷標志位ti置1,中斷方式時向cpu申請中斷,通知cpu發送下一個數據;在中斷服務函數中,先由用戶將ti清0,然后再給sbuf送入下一個待發送的字符。(2) 接收。當ri=0時,先要由用戶軟件置ren為1,允許接收數據,將接收數據的第9位送入rb8。由sm2和rb8決定該數據能否接收。項目八 串行口通信 當sm2=0時,不管rb8為0還是為1,ri都置1,串行口無條件接收。 當sm2=1時,是多機通信方式,接收到的r

28、b8是地址/數據標志位。當rb8=1時,表示接收的是地址幀,此時由硬件將ri置1,串行口將接收發來的地址;當rb8=0時,表示接收的是數據幀。對于sm2=1的從機,ri不置1,數據丟失;對于sm2=0的從機,串行口自動接收數據。在方式2和方式3中,不管是中斷方式,還是查詢方式,都不會清除ti或ri標志。在發送和接收之后,必須由用戶軟件清除ti和ri。方式2和方式3主要用于多機通信。項目八 串行口通信 8.2.4 51單片機串行口波特率的設置單片機串行口波特率的設置在串行通信前,首先要約定收/發雙方的數據傳送速率,即波特率。通過軟件編程可將51單片機的串行口設定為4種工作方式,這4種方式波特率的

29、計算方法不相同:方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時器t1或t2(at89s52)的溢出率控制。項目八 串行口通信 1. 方式方式0和方式和方式2的波特率的波特率采用方式0時,每個機器周期發送或接收1位數據,因此,波特率固定為時鐘頻率的1/12,且不受smod的影響。方式2的波特率取決于pcon中最高位smod,它是串行口波特率倍增位。復位后,smod=0。當smod=1時,波特率加倍,為fosc的1/32;當smod=0時,波特率為fosc的1/64。即:方式2的波特率 = (2smod/64)fosc項目八 串行口通信 2. 方式方式1和方式和方式3的波

30、特率的波特率串行口方式1和方式3的波特率是由定時器t1的溢出率與smod值共同決定的,即:方式1和方式3的波特率=(2smod/32)t1溢出率其中,t1的溢出率就是t1定時器溢出的頻率,只要計算出t1定時器每溢出一次所需的時間t,那么1/t就是t1的溢出率。例如,t1每10 ms溢出一次時,它的溢出率就是100 hz,將100代入方式1和方式3的波特率計算公式,就可以計算出相應的波特率。但是在串行口應用時,常常需要根據波特率計算計數器t1的初值。項目八 串行口通信 當定時器t1作波特率發生器使用時,通常是選用8位自動重裝載方式,即方式2。在方式2中,tl1用作計數,而th1用于存放自動重裝載

31、所需的初值,因此初始化時裝入th1、tl1的初值必須是相同的,然后啟動定時器t1,tl1寄存器便在時鐘的作用下開始加1,當tl1計滿溢出后,cpu會自動將th1中的初值重新裝入tl1,繼續計數。當定時器t1作波特率發生器時,溢出后中斷服務函數中并無任何事情可做,因此為了避免因溢出而產生不必要的中斷,可禁止t1中斷。項目八 串行口通信 溢出周期t為t = (12/fosc)(256-初值)溢出率為溢出周期之倒數,所以則定時器t1方式2的初值為 例如,系統晶振頻率為11.0592 mhz,波特率為9600 bps,當smod=0時,定時器t1的初值為)256(12f322oscmods初值波特率波

32、特率初值3842f256smodosc項目八 串行口通信 51單片機控制系統中,當晶振為11.0592 mhz時,不管串行口波特率為何值,只要是標準通信速率,計算出的定時器t1初值都會非常準確。若采用12 mhz或6 mhz的晶振,定時器t1的定時初值不會是一個整數。常用串行口波特率與定時器初值如表8-4所示。fdh25396003842100592.112563842f25606smodosc波特率初值項目八 串行口通信 表表8-4 常用串行口波特率及定時器初值常用串行口波特率及定時器初值 項目八 串行口通信 8.2.5 雙機通信和多機通信雙機通信和多機通信1. 雙機通信雙機通信單片機的雙機

33、通信根據發送方與接收方之間的距離可分為短距離和長距離通信。1米之內為短距離通信,1000米左右為長距離通信。若要更長距離,如幾十千米或更長,則需要借助其他無線設備方可實現通信。單片機雙機通信有ttl電平通信、rs-232c通信、rs-422通信、rs-485通信四種實現方式。項目八 串行口通信 1) ttl電平通信ttl電平通信是指直接將發送方單片機的txd(p3.1)端與接收方單片機的rxd(p3.0)端相連,發送方單片機的rxd(p3.0)與接收方單片機的txd(p3.1)直接相連,而且兩個單片機控制系統必須共地,即把它們的電源地線連在一起。共地是初學者在硬件設計上最易忽視的一個問題。tt

34、l電平通信連接圖如圖8-7所示。項目八 串行口通信 圖8-7 ttl電平雙機通信連接圖 項目八 串行口通信 單片機的ttl電平雙機通信多用在同一個控制系統中,當一個控制系統中使用一個單片機不能實現控制要求時,可再添加一個或幾個單片機,兩個單片機之間構成雙機通信,多個單片機就形成了多機通信,多機通信中只能有一個主機,其余單片機均為從機。ttl電平通信在雙機或多機通信時,是將一個控制系統中的多個單片機直接相連,因此盡可能縮短各單片機之間的距離,距離越短,通信時就越可靠。項目八 串行口通信 2) rs-232c通信rs-232c是美國電子工業協會1969年制定的通信標準,它定義了數據終端設備與數據通

35、信設備之間的物理接口標準。rs-232c標準接頭有9個引腳,但是將它用于兩個單片機通信時,只需要用到rxd、txd、gnd三條線。rs-232雙機通信連接圖如圖8-8所示。 項目八 串行口通信 圖8-8 rs-232c雙機通信連接圖 項目八 串行口通信 rs-232c通信比ttl電平通信距離要遠,但不能超過15米,最高傳送速率為20 kb/s。rs-232c要求通信雙方必須共地,通信距離越大,由于收、發雙方的電位差較大,在地上會產生較大的地電流并產生壓降,最終形成電平偏移。另外,rs-232c在電平轉換時采用單端輸入/單端輸出,在傳輸過程中,干擾和噪聲會混在有用的信號中,為了提高信噪比,rs-

36、232c通信要求采用較大的電壓擺幅。項目八 串行口通信 3) rs-422通信、rs-485通信rs-422采用雙端平衡驅動器,相比單端不平衡驅動器而言,電壓放大倍數要增大一倍,可以避免地線干擾和電磁干擾的影響,當傳輸速率為90 kb/s時,傳輸距離可達1200米。rs-485是rs-422的變型,rs-422用于全雙工,rs-485用于半雙工。它的抗干擾能力非常好,傳輸速率達1 mb/s,傳輸距離可達1200米。項目八 串行口通信 2. 多機通信多機通信方式2和方式3可用于多機通信,這一功能使它可以方便地應用于集散式分布系統中。集散式分布系統含一臺主機和多臺從機,從機要服從主機的調度和支配。

37、多機通信時主、從機的連接方式如圖8-9所示。項目八 串行口通信 圖8-9 多機通信連接圖 項目八 串行口通信 編程前,首先定義各從機地址編號,如分別為00h、01h、02h等。當主機需要給其中一個從機發送一個字符幀時,首先送出該從機的地址幀,主機發送地址幀時,地址幀/數據幀標志位tb8應設置為1。主機源程序中實現該設置的語句為scon=0 xd8;/設置串行口為方式3,tb8置l,準備發地址所有從機初始化時均置sm2=1,使它們處于接收地址幀狀態。從機源程序中實現該設置的語句為scon=0 xf0;/設置串行口為方式3,sm2=1,允許接收項目八 串行口通信 當從機接收到主機發來的信息時,第9

38、位rb8若為1,則置位中斷標志ri,并在中斷后比較接收的地址與本從機地址是否相符。若相符,則被尋址的從機清除其sm2標志,即sm2=0,準備接收即將從主機送來的數據幀;未被選中的從機仍保持sm2=1。當主機發送數據幀時,應置tb8為0。此時,雖然各從機都處于接收狀態,但由于tb8=0,所以只有sm2=0的那個被尋址的從機才能接收到數據,其他未被選中的從機不理睬傳送至串行口的數據,繼續進行各自的工作,直到一個新的地址字節到來,這樣就實現了主機控制的主、從機之間的通信。項目八 串行口通信 綜上所述,進行多機通信時,要充分利用寄存器scon中的多機通信控制位sm2。當從機的sm2=1時,從機只接收主

39、機發送的地址幀(第9位tb8為1),對數據幀不予理睬;當從機的sm2=0時,從機才能夠接收主機發來的所有數據幀。單片機的多機通信只能在主、從機之間進行,各從機之間的通信只有經主機才能實現。多機之間的通信過程可歸納如下:(1) 主、從機均初始化為方式2或方式3,置sm2=1,允許多機通信,且所有從機都只能接收地址幀。項目八 串行口通信 (2) 主機置tb8=1,發送待尋址從機的地址(前8位是從機地址,第9位是1,表示該幀是地址幀)。(3) 所有從機均接收到主機發送的地址幀后,轉去執行中斷服務函數,目的是將所接收到的地址與從機自身地址進行比較。若相同,則該從機的sm2清0,可以接收主機隨后發來的數

40、據幀,并向主機返回該從機地址,供主機核對;若不相同,從機仍保持sm2=1,無法接收主機隨后發來的數據幀。項目八 串行口通信 (4) 主機對從機返回的地址核對無誤后,主機向被尋址的從機發送命令,通知從機接收或發送數據。(5) 通信只能在主、從機之間進行,2個從機之間的通信須通過主機作中介才可實現。(6) 本次通信結束后,主、從機重置sm2=1,恢復多機通信的初始狀態。項目八 串行口通信 在實際應用中,由于單片機功能有限,因而在較大的測控系統中,常常把單片機應用系統作為前端機(也稱為下位機或從機),直接用于控制對象的數據采集與控制,而把pc機作為中央處理機(也稱為上位機或主機),用于數據處理和對下

41、位機的監控管理。它們之間的信息交換主要是采用串行通信,此時單片機可直接利用其串行接口,而pc機可利用其配備的8250、8251或16450等可編程串行接口芯片(具體使用方法可查看有關手冊)。實現單片機與pc機串行通信的關鍵是在通信協議的約定上要一致,例如設定相同的波特率及幀格式等。在正式工作之前,雙方應先互發聯絡信號,以確保通信收/發數據的準確性。項目八 串行口通信 8.2.6 串行口初始化串行口初始化應用串行口時,首先要初始化串行口。1. 方式方式0初始化初始化方式0的初始化步驟為:(1) 對scon賦值(字節尋址或位尋址),確定串行口的工作方式等相關內容。初始化為方式0,寄存器scon為0

42、;或sm0、sm1均為0。(2) 串行口工作在中斷方式時,對ie賦值開中斷;查詢方式時,不需開中斷。項目八 串行口通信 2. 方式方式1方式方式3初始化初始化方式1方式3的初始化較為復雜,主要包括設置產生波特率的定時/計數器t1、串行口的工作方式、串行口控制與中斷控制。方式1方式3初始化的具體步驟為:(1) 對tmod賦值(只能字節尋址),確定定時/計數器t1工作在方式2;(2) 根據波特率計算t1的初值,并同時將其寫入th1、tl1;(3) 置位tr1,啟動定時/計數器t1;(4) 對scon賦值(字節尋址或位尋址),確定串行口的工作方式等相關內容;(5) 串行口工作在中斷方式時,對ie賦值

43、開中斷;在查詢方式時,不需開中斷。項目八 串行口通信 8.2.7 串行口應用舉例串行口應用舉例串行口的工作方式0并不是一個同步串行口通信方式,它的主要用途是與同步移位寄存器相連,擴展單片機的并行i/o口,同步移位脈沖由txd(p3.1)端輸出。典型應用圖如圖8-10所示。74ls164是一個8位串行輸入、并行輸出的移位寄存器。clr用于清0,a、b兩個輸入端可并在一起使用,也可單獨使用,由單片機的rxd將數據送至a、b端,然后在clk同步時鐘脈沖作用下,8位串行數據就可以全部移至8位并行輸出口上,實現數據的串、并轉換,用以擴展單片機的并行輸出口。項目八 串行口通信 圖8-10 方式0擴展并行口

44、原理圖 項目八 串行口通信 74ls165是一個8位并行輸入、串行輸出的移位寄存器。qh為串行數據輸出端,s/端為啟動移位信號端,加入低脈沖時啟動移位操作,與51單片機串行口相連,用以擴展單片機的并行輸入口。例1 51單片機串行口工作于方式0時,利用74ls164擴展并行i/o口,在74ls164的8個輸出端連接8個led,采用中斷方式編程使8個led閃爍,閃爍規律為每次點亮 1個led,先下移1次,再上移1次,最后所有的led閃爍2次;然后重新開始,閃爍的間隔時間為200 ms。解:(1) 硬件設計。由題意可知,需將8個led連接在74ls164的輸出端,led仍連接為灌電流負載,如圖8-1

45、1所示。項目八 串行口通信 圖8-11 方式0擴展并行輸入口應用電路 項目八 串行口通信 (2) 軟件設計。根據led的閃爍規律,可知所需代碼如表8-5所示。采用數組方式實現led閃爍,即定義數組led 按閃爍規律存放表8-5所示代碼。在主函數中實現串行口的初始化,然后就不斷地將數組led中序號為i的代碼發送至74ls164。每發送完一個代碼,由硬件自動置位ti,向cpu申請中斷,cpu響應后轉去執行串行口的中斷服務函數(串行口中斷號為4)。在串行口的中斷服務函數中,由用戶清除ti,然后延時200 ms,再修改變量i,返回主函數中繼續發送下一個代碼。項目八 串行口通信 表表8-5 方式方式0時

46、時led閃爍代碼閃爍代碼 項目八 串行口通信 (3) 源程序。#include #define uchar unsigned char#define uint unsigned int/*必要的全局變量定義*/uchar code led =0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe,0 xff,0 x00,0 xff,0 x00;/*定義數組led存放閃爍代碼,第一行代碼下移1次、第二行代碼上移1次,第三行代碼閃爍2次*/項目八 串行口通信 uchar i=

47、0;/*延時函數*/void delay200ms() uint k,j;for(k=0;k20;k+)for(j=0;j18)/控制i的變化范圍i=0;項目八 串行口通信 8.3 項項 目目 實實 施施8.3.1 硬件設計方案硬件設計方案本項目要求雙機通信,兩個單片機實驗板之間的通信距離很短,為了方便驗證,采用ttl電平實現兩個單片機實驗板之間的通信,依照圖8-7進行連接。將發送方的rxd與接收方的txd、發送方的txd與接收方的rxd用短導線相連,并將發送方與接收方的地線相連,滿足共地要求,就可以實現雙機通信。發送方的矩陣鍵盤電路、接收方的數碼管顯示電路均采用hot-51實驗板上的電路,大

48、家可參考項目三與項目四的實驗板電路分析相關內容。項目八 串行口通信 8.3.2 軟件設計方案軟件設計方案雙機通信時,建立兩個項目分別編寫發送方與接收方源程序。為了保證發送方與接收方正確的通信,必須保證兩個單片機系統的波特率完全一致,否則接收方會收不到正確的結果。發送方與接收方的波特率均為9600 b/s,smod=0不倍增時,查表8-4可知定時/計數器t1的初值為fdh,初始化時將其同時送入th1與tl1中,啟動后,tl1就會在初值上加1計數。定時/計數器t1在這里是作為波特率發生器使用的,將其設置為方式2,定時溢出時由硬件自動將保存在th1中的初值重新裝入tl1,中斷后沒有任何事情可做,因此

49、定時/計數器t1就不需要開中斷了。項目八 串行口通信 雙機通信時,發送方與接收方的兩個串行口應工作在方式1,區別在于發送方的串行口工作在查詢方式,因此不需要開中斷;而接收方的串行口工作在中斷方式,要開中斷并編寫串行口中斷服務函數,特別注意的是接收方的允許接收控制位ren應設置為1,否則接收不到發送方發送的鍵號。 發送方主要完成矩陣鍵盤掃描、發送等任務。當有鍵閉合時,由行列反轉法獲取閉合鍵的鍵號,然后將閉合鍵的鍵號由串行口發送至接收方,發送完成后,繼續掃描鍵盤。鍵盤掃描函數uchar keyscan()是無參有返回值的函數,調用它可以獲得閉合鍵的鍵號;發送函數void send (uchar j

50、ianhao)是有參無返回值函數,它的作用是采用查詢方式由串行口項目八 串行口通信 發送閉合鍵的鍵號,調用它時,必須將閉合鍵的鍵號作為實參;主函數main()中首先要完成對串行口、定時/計數器t1的初始化,然后就是無限次地判斷有無鍵按下,有鍵按下時調用鍵盤掃描函數uchar keyscan()得到閉合鍵的鍵號,再調用發送函數void send (uchar jianhao)由串行口發送閉合鍵的鍵號。項目八 串行口通信 接收方主要完成數據的接收、顯示等任務。若采用中斷方式工作,當接收方的ren=1時,接收器就以所選波特率的16倍速率采樣rxd引腳,檢測到rxd引腳發生負跳變時,將接收到的8位數據

51、裝入接收緩沖寄存器sbuf,并置位接收中斷標志ri,向cpu請求中斷。在串行口中斷服務函數void chuan0 () interrupt 4中取出接收緩沖寄存器sbuf中的鍵號,并將其段碼發送至p0口,就實現了顯示閉合鍵鍵號的要求。項目八 串行口通信 (1) 發送方單片機源程序。#include #define uchar unsigned char#define uint unsigned int/*必要的全局變量定義*/uchar code jianzhibiao = 0 xee,0 xde,0 xbe,0 x7e,0 xed,0 xdd,0 xbd,0 x7d,0 xeb,0 xdb,

52、0 xbb,0 x7b,0 xe7,0 xd7,0 xb7,0 x77;/定義鍵值表項目八 串行口通信 /*延時函數*/void delay (uint i)/延時時間約為i1 ms uchar j, x;for(j=0;ji;j+)for(x=0;x=130;x+);項目八 串行口通信 /*發送函數*/void send (uchar jianhao) sbuf=jianhao;/將閉合鍵的鍵號送入發送緩沖寄存器sbuf,進行發送while(!ti);/查詢ti,等待發送結束ti=0;/發送結束后,清除發送中斷標志ti,為下一次發送作準備項目八 串行口通信 /*鍵盤掃描函數*/uchar k

53、eyscan() uchar lie,jianzhi,jianhao,i;/定義按鍵識別所需局部變量lie=p1;/有鍵閉合時,暫存列值p1=0 x0f;/置行1、列0 jianzhi=lie|p1;/讀入行值,與列值“位或”得鍵值并賦給jianzhifor(i=0;i16;i+)/查找鍵值表,最多需要比較16次 if(jianzhi=jianzhibiaoi)/將閉合鍵鍵值與鍵值表的元素一一作比較項目八 串行口通信 jianhao=i; /如果if為真,找到鍵值,將i賦給變量jianhaobreak;/找到鍵號后,結束查找while(p1!=0 x0f);/等待按鍵釋放delay(10);/

54、去除按鍵的后沿抖動return(jianhao);/返回閉合鍵的鍵號項目八 串行口通信 /*主函數*/void main() uchar jianhao;tmod=0 x20;/定時/計數器t1為方式2,字節尋址th1=0 xfd;/用于存放初值fdh,smod=0,波特率為9600 b/stl1=0 xfd;/用于加1計數,初值為fdhtr1=1;/啟動定時/計數器t1,位尋址sm0=0;sm1=1;/串行口初始化為方式1,位尋址while(1)項目八 串行口通信 p1=0 xf0;/置行0、列1if(p1!=0 xf0)/讀入列值,檢測有無按鍵閉合delay(10);/延時10 ms,去除

55、按鍵的前沿抖動if(p1!=0 xf0)/再次檢測,如果if語句仍為真,確定有鍵閉合jianhao=keyscan();send(jianhao);項目八 串行口通信 (2) 接收方單片機源程序。#include #define uchar unsigned char#define uint unsigned int/*必要的全局變量定義*/uchar code seg7 =0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;/定義共陰型數碼管段碼表項目八

56、 串行口通信 /*延時函數*/void delay (uint i)/延時時間約為i1 ms uchar j, x;for(j=0;ji;j+)for(x=0;x=130;x+);/*主函數*/void main()項目八 串行口通信 tmod=0 x20;/定時/計數器t1為方式2,字節尋址th1=0 xfd;/用于存放初值fdh,smod=0,波特率為9600 b/stl1=0 xfd;/用于加1計數,初值為fdhtr1=1;/啟動定時/計數器t1,位尋址sm0=0;sm1=1;/串行口初始化為方式1,位尋址ren=1;es=1;/串行口開中斷,位尋址ea=1;/cpu開中斷,位尋址whi

57、le(1);/等待串行口中斷項目八 串行口通信 /*串行口中斷服務函數*/void chuan0 () interrupt 4 uchar jianhao;ri=0;/清除接收中斷標志rijianhao=sbuf;/讀取接收緩沖寄存器sbuf p0=seg7jianhao;/顯示發送方矩陣鍵盤中閉合鍵的鍵號項目八 串行口通信 (3) 分析。發送方的串行口采用查詢方式,因此在發送函數void send (uchar jianhao)中,當執行語句“sbuf=jianhao;”后便自動開始將串行口發送緩沖寄存器sbuf中的數據一位接著一位從串口發送出去;語句“while(!ti);”的作用是查詢一

58、幀字符是否發送完成,未發送完成時,ti=0、!ti=1,while的表達式永遠為真,一直在該語句處等待,只有當發送完成置位ti后,!ti=0,while的表達式永遠為假,結束等待,執行while的下一條語句;清除發送中斷標志ti,若用戶不清除ti,下一次就無法正常發送。項目八 串行口通信 void send (uchar jianhao) sbuf=jianhao;/將閉合鍵的鍵號送入發送緩沖寄存器sbuf,進行發送while(!ti);/查詢ti,等待發送結束ti=0;/發送結束后,清除發送中斷標志ti,為下一次發送作準備項目八 串行口通信 接收方的串行口采用中斷方式,在中斷服務函數void

59、 chuan0() interrupt 4中首先清除接收中斷標志ri,因為cpu只要開始執行該中斷服務函數,就表示產生了串口中斷,而且肯定是發送或接收了數據,若接收方源程序并沒有發送任何數據,那就必然是接收到了數據,硬件會自動地將ri置1。進入中斷服務函數后,必須由用戶將ri清0,這樣才能產生下一次中斷;然后將接收緩沖寄存器sbuf中的數據讀出送給變量jianhao,再由語句“p0=seg7jianhao;”將鍵號顯示出來,這才是進入中斷服務函數中最重要的目的。 項目八 串行口通信 void chuan0 () interrupt 4 uchar jianhao;ri=0;/清除接收中斷標志r

60、ijianhao=sbuf;/讀取接收緩沖寄存器sbuf p0=seg7jianhao;/顯示發送方矩陣鍵盤中閉合鍵的鍵號從發送方與接收方的發送與接收過程中可以清晰地看出,sbuf是共用一個地址的兩個獨立寄存器,單片機識別操作哪個寄存器的關鍵語句是“sbuf=jianhao;”和“jianhao=sbuf;”。項目八 串行口通信 8.3.3 程序調試程序調試1. 實驗板電路分析實驗板電路分析將發送方單片機實驗板中的rxd(p3.0)、txd(p3.1)分別與接收方單片機實驗板中的txd(p3.1)、rxd(p3.0)用短接線相連,然后再用短導線將兩個單片機實驗板的地線連接到一起,即兩個實驗板要

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論