UART串口通訊的根本使用

常用的通訊從傳輸偏向上可以分爲單工通訊、半雙工通訊、全雙工通訊三類。
單工通訊就是指只許可一偏向別的一方傳送信息,而另一方不克不及回傳信息。比方電視遙控器、收音機播送等,多是單工通訊技巧。
半雙工通訊是指數據可以在單方之間互相傳達,然則統一時辰只能箇中一方發給別的一方,比方我們的對講機就是典型的半雙工。
全雙工通訊就發送數據的同時也可以接納數據,兩者同步停止,就好像我們的德律風一樣,我們措辭的同時也可以聽到對方的聲響。

UART 模塊引見

IO 口模仿串口通訊,讓人人理解了串口通訊的實質,然則我們的單片機程序卻需求一直的檢測掃描單片機 IO 口收到的數據,少量佔用了單片機的運轉工夫。這時分就會有聰慧人想了,其實我們並不是很關懷通訊的進程,我們只需求一個通訊的後果,最終失掉接納到的數據就行了。如許我們可以在單片機外部做一個硬件模塊,讓它主動接納數據,接納完了,告訴我們一下就可以了,我們的 51 單片機外部就存在如許一個 UART 模塊,要準確運用它,當然還得先把對應的特別功用存放器設置裝備擺設好。
51 單片機的 UART 串口的構造由串行口掌握存放器 SCON、發送和接納電路三局部組成,先來理解一下串口掌握存放器 SCON。如表 11-1 表 11-2 所示。
表 11-1 SCON——串行掌握存放器的位分派(地址 0x98、可位尋址)

76543210
符號SM0SM1SM2RENTB8RB8TIRI
復位值00000000


表 11-2  SCON——串行掌握存放器的位描繪

符號描繪
7SM0這兩位配合決議了串口通訊的形式 0~形式 3 共 4 種形式。我們最常用的
就是形式 1,也就是 SM0=0,SM1=1,下邊我們重點就講形式 1,其它模
式從略。
6SM1
5SM2多機通訊掌握位(少少用),形式 1 直接清零。
4REN使能串行接納。由軟件置位使能接納,軟件清零則制止接納。
3TB8形式 2 和 3 中要發送的第 9 位數據(很罕用)。
2RB8形式 2 和 3 中接納到的第 9 位數據(很罕用),形式 1 用來接納中止位。
1TI發送中綴標記位,當發送電路發送到中止位的兩頭地位時,TI 由硬件置 1,
必需經過軟件清零。
0RI接納中綴標記位,當接納電路接納到中止位的兩頭地位時,RI 由硬件置 1,
必需經過軟件清零。


前邊學了那麼多存放器的設置裝備擺設,置信 SCON 這個中央,關於大多半同窗來說曾經不是難點了,應當能看懂而且可以本人設置裝備擺設了。關於串口的四種形式,形式 1 是最常用的,就是我們前邊提到的 1 位肇端位,8 位數據位和 1 位中止位。下面我們就具體引見形式 1 的任務細節和運用辦法,至於其它 3 種形式與此也是大同小異,真正碰到需求運用的時分人人再去查閱相干材料就行了。
在我們運用 IO 口模仿串口通訊的時分,串口的波特率是運用準時器 T0 的中綴表現出來的。在硬件串口模塊中,有一個專門的波特率發作器用來掌握髮送和接納數據的速度。關於STC89C52 單片機來講,這個波特率發作器只能由準時器 T1 或準時器 T2 發生,而不克不及由準時器 T0 發生,這和我們模仿的通訊是完整分歧的概念。
假如用準時器 2,需求設置裝備擺設額定的存放器,默許是運用準時器 1 的,我們本章內容次要就運用準時器 T1 作爲波特率發作器來解說,方法 1 下的波特率發作器必需運用準時器 T1 的形式 2,也就是主動重裝載形式,準時器的重載值盤算公式爲:
    TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
和波特率有關的還有一個存放器,是一個電源治理存放器 PCON,他的最高位可以把波特率進步一倍,也就是假如寫 PCON |= 0x80 今後,盤算公式就成了:
    TH1 = TL1 = 256 - 晶振值/12 /16 /波特率
公式中數字的寄義這裏說明一下,256 是 8 位準時器的溢出值,也就是 TL1 的溢出值,晶振值在我們的開闢板上就是 11059200,12 是說 1 個機械週期等於 12 個時鐘週期,值得存眷的是這個 16,我們來重點闡明。在 IO 口模仿串口通訊接納數據的時分,採集的是這一位數據的兩頭地位,而實踐上串口模塊比我們模仿的要複雜和準確一些。他採用的方法是把一位旌旗燈號採集 16 次,箇中第 7、8、9 次掏出來,這三次中箇中兩次假如是高電平,那麼就認定這一位數據是 1,假如兩次是低電平,那麼就認定這一位是 0,如許一旦遭到不測攪擾讀錯一次數據,也仍然可以包管最終數據的準確性。
理解了串口採集形式,在這裏要給人人留一個考慮題。“晶振值/12/2/16/波特率”這個中央盤算的時分,呈現不克不及除盡,或許呈現小數怎樣辦,許可呈現多大的偏向?把這局部瞭解了,也就瞭解了我們的晶振爲何運用 11.0592M 了。
串口通訊的發送和接納電路在物理上有 2 個名字相反的 SBUF 存放器,它們的地址也多是 0x99,然則一個用來做發送緩衝,一個用來做接納緩衝。意思就是說,有 2 個房間,兩個房間的門商標是一樣的,箇中一個只出人不進人,別的一個只進人不出人,如許的話,我們就可以完成 UART 的全雙工通訊,互相之間不會發生攪擾。然則在邏輯上呢,我們每次只操作 SBUF,單片時機主動依據對它履行的是“讀”照樣“寫”操作來選擇是接納 SBUF 照樣發送 SBUF,後邊經過程序,我們就會徹底理解這個成績。

UART 串口程序

普通狀況下,我們編寫串口通訊程序的根本步調如下所示:

  1. 設置裝備擺設串口爲形式 1。

  2. 設置裝備擺設準時器 T1 爲形式 2,即主動重裝形式。

  3. 依據波特率盤算 TH1 和 TL1 的初值,假如有需求可以運用 PCON 停止波特率加倍。

  4. 翻開準時器掌握存放器 TR1,讓準時器跑起來。


這裏還要特殊留意一下,就是在運用 T1 做波特率發作器的時分,萬萬不要再使能 T1 的中綴了。
我們先來看一下由 IO 口模仿串口通訊直接改爲運用硬件 UART 模塊時的程序代碼,看看程序是不是複雜了許多,由於大局部的任務硬件模塊都替我們做了。程序功用和 IO 口模仿的是完整一樣的。

			#include <reg52.h> void ConfigUART(unsigned int baud); void main(){ ConfigUART(9600); //設置裝備擺設波特率爲 9600 while (1){ while (!RI); //等候接納完成 RI = 0; //清零接納中綴標記位 SBUF = SBUF + 1; //接納到的數據+1 後,發送歸去 while (!TI); //等候發送完成 TI = 0; //清零發送中綴標記位 } } /* 串口設置裝備擺設函數,baud-通訊波特率 */ void ConfigUART(unsigned int baud){ SCON = 0x50; //設置裝備擺設串口爲形式 1 TMOD &= 0x0F; //清零 T1 的掌握位 TMOD |= 0x20; //設置裝備擺設 T1 爲形式 2 TH1 = 256 - (11059200/12/32)/baud; //盤算 T1 重載值 TL1 = TH1; //初值等於重載值 ET1 = 0; //制止 T1 中綴 TR1 = 1; //啓動 T1 }

當然了,這個程序照樣用在主輪迴裏等候接納中綴標記位和發送中綴標記位的辦法來編寫的,而實踐工程開闢中,當然就不克不及這麼幹了,我們也只是爲了用直不雅的比照來通知同窗們硬件模塊可以大大簡化程序代碼,那麼實踐運用串口的時分就用到串口中綴了,來看一下用中綴完成的程序。請留意一點,由於接納和發送觸發的是統一個串口中綴,所以在串口中綴函數中就必需先判別是哪一種中綴,然後再作出響應的處置。

			#include <reg52.h> void ConfigUART(unsigned int baud); void main(){ EA = 1; //使能總中綴 ConfigUART(9600); //設置裝備擺設波特率爲 9600 while (1); } /* 串口設置裝備擺設函數,baud-通訊波特率 */ void ConfigUART(unsigned int baud){ SCON = 0x50; //設置裝備擺設串口爲形式 1 TMOD &= 0x0F; //清零 T1 的掌握位 TMOD |= 0x20; //設置裝備擺設 T1 爲形式 2 TH1 = 256 - (11059200/12/32)/baud; //盤算 T1 重載值 TL1 = TH1; //初值等於重載值 ET1 = 0; //制止 T1 中綴 ES = 1; //使能串口中綴 TR1 = 1; //啓動 T1 } /* UART 中綴效勞函數 */ void InterruptUART() interrupt 4{ if (RI){ //接納到字節 RI = 0; //手動清零接納中綴標記位 SBUF = SBUF + 1; //接納的數據+1 後發還,右邊是發送 SBUF,左邊是接納 SBUF } if (TI){ //字節發送終了 TI = 0; //手動清零發送中綴標記位 } }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章