前面兩個(gè)章節(jié)全部講解了單片機(jī)串口的相關(guān)理論基礎(chǔ),本章節(jié)突出講解一下單片機(jī)串口通信的實(shí)際操作。這章寫(xiě)完才發(fā)現(xiàn),寫(xiě)的有點(diǎn)多?。?!但是這里面的東西確實(shí)值得大家學(xué)習(xí),有個(gè)思想特別重要,寫(xiě)代碼就是一個(gè)不斷完善的過(guò)程。下面請(qǐng)跟隨我的腳步,一步一步的來(lái)完善串口控制的程序。
其實(shí)不太想使用 51單片機(jī)的串口來(lái)作為講解的例子,因?yàn)樗拇谠O(shè)計(jì)的有點(diǎn)垃圾。功能上需要定時(shí)器來(lái)進(jìn)行相關(guān)的輔助。一個(gè)功能摻雜了兩塊硬件功能。這在程序上就叫做雜糅!但是苦于其他類(lèi)型的單片機(jī)對(duì)于首次編程的各位又不太友好。所以萬(wàn)般無(wú)奈之下還是強(qiáng)忍著巨大的難受使用 51 單片機(jī)作為本章主角。
如上圖:現(xiàn)在我們最關(guān)心的問(wèn)題就是:如何把 A 中的 110 數(shù)據(jù)傳遞到 B 當(dāng)中去???
上面這個(gè)問(wèn)題就是我們本次學(xué)習(xí)的重點(diǎn)。有人會(huì)問(wèn)?那如何把 B 的數(shù)據(jù)傳遞給 A 呢?傻小子,你把上面的問(wèn)題搞會(huì)了,反過(guò)來(lái)是不是就可以了?如果你不會(huì)反過(guò)來(lái),那我只能說(shuō)一句,你那么多頭發(fā)給我吧。
編程簡(jiǎn)介:
你和別人遠(yuǎn)程說(shuō)話,需要什么?(電話呀!)我擦咧,你怎么這么厲害?對(duì)了,你們需要一個(gè)交流的工具。好,51單片機(jī)也需要一個(gè)交流的工具:它就是 SBUF,SBUF,SBUF 重要的東西講三遍。它是個(gè)什么玩意呢?首先我先將上面的圖優(yōu)化一下
這幅圖怎么理解呢?A和自己的SBUF交流。B和SBUF交流。而(A的SBUF) 通過(guò) tx,rx 連接(B的SBUF)。這樣就間接的實(shí)現(xiàn)了 A 和 B 交流。
類(lèi)似于:小紅和小紅的iphone說(shuō)話,小明和小明的華為說(shuō)話。他們兩部手機(jī)通過(guò)電磁波連接在了一起。就間接的實(shí)現(xiàn)了小紅和小明說(shuō)話。 -------- 一般這里要跟上作者名字,卒于 xxxx 年。
很顯然,如果A想發(fā)數(shù)據(jù)給B,它就要告訴 SBUF 想發(fā)的數(shù)據(jù)是什么!比如發(fā)送 110 ,那么 A 的程序就應(yīng)該寫(xiě)成 SBUF = 110;而 B 想要知道 A 傳輸過(guò)來(lái)的數(shù)據(jù)是什么,它就要問(wèn) SBUF,剛剛傳過(guò)來(lái)的數(shù)字是多少,并且B需要給 SBUF 盛放數(shù)據(jù)的地方?程序就是:data = SBUF。這里的 data 就能讀取到剛剛 A 那邊發(fā)過(guò)來(lái)的數(shù)據(jù)了,也就是 110.
程序也就可以這么寫(xiě)。
是不是突然覺(jué)得很簡(jiǎn)單?那當(dāng)然啦,這種只能算是示意程序,就是有了大致功能,但是根本沒(méi)用。為什么呢?因?yàn)槟阋?jiàn)過(guò)一個(gè)手機(jī)沒(méi)有開(kāi)機(jī),就能和別人打電話的?千萬(wàn)別和我說(shuō)什么喬布斯的 iphone 1000 。我沒(méi)用過(guò),我也不知道。
下面,我們需要做的,就是讓 SBUF 可以正常開(kāi)機(jī)工作。怎么開(kāi)機(jī)呢?這就要說(shuō)到 51 單片機(jī)串口最奇葩的地方,它需要使用定時(shí)器來(lái)驅(qū)動(dòng)串口,跟個(gè)傻子似的?。?!一個(gè)一個(gè)來(lái)吧。
首先我們介紹以下 51 串口的控制器:
很簡(jiǎn)單,就一個(gè) SCON 控制單元。我們需要關(guān)注的就是 SM0 和 SM1 ,REN,TI,RI。
1,SM0 和 SM1 的設(shè)置
其實(shí)我們用的最多的就是方式 1 :10位異步收發(fā)器(8位數(shù)據(jù))。這是什么意思呢?還記得上節(jié)說(shuō)的,我們傳輸?shù)氖?個(gè)字節(jié)的數(shù)據(jù) = 8位,再加上起始,停止,一共 10 位,這樣,和方式 1 完全吻合。(那我們?nèi)绾未_定什么時(shí)候用哪一種呢?這就需要根據(jù)雙方的設(shè)置來(lái)確定了,雙方只要傳輸位數(shù)和采樣波特率兩個(gè)東西一致的話,就是可以進(jìn)行通訊的)。
2,REN ,
REN 代表這 rec enable :也就是說(shuō),如果打開(kāi)了 REN(REN = 1),那么串口就可以實(shí)現(xiàn)接受的功能了,這是什么意思呢?其實(shí) SBUF 上面的 tx 和 rx ,只有 tx 是默認(rèn)打開(kāi)可以直接用的,而 rx 默認(rèn)關(guān)閉,需要人為設(shè)置一下。
3,TI ,RI。
還記得A,B之間是如何通信的嗎?就是通過(guò)兩者的 SBUF 來(lái)進(jìn)行通信的。那么我們?cè)趺床拍苤?SBUF 到底有沒(méi)有發(fā)送完成或則接收到數(shù)據(jù)呢?這就要 TI 和 RI 的閃亮登場(chǎng)了。比如 A 給 B 發(fā)送 110,A先把110傳給SBUF,當(dāng) SBUF 把數(shù)據(jù)傳輸出去以后,A 的 TI 就被設(shè)置成了 1.(這個(gè)過(guò)程是自動(dòng)的,不需要管,你只要知道,TI變成1了就可以發(fā)送下一個(gè)數(shù)據(jù)了。)而 B 的 SBUF 在接受到數(shù)據(jù)之后就會(huì)把 RI 設(shè)置成 1.(這個(gè)過(guò)程也是自動(dòng)的,你只要知道,RI 變成 1,你就能讀取 SBUF 中接受的數(shù)據(jù)了)。
到這里我們就能再把程序進(jìn)行一下變形了:
這時(shí)候程序可以正常運(yùn)行了嗎? --- 當(dāng)然還差一點(diǎn)點(diǎn),就差給它點(diǎn)最核心的東西了,它的動(dòng)力源泉。
========================== 最?lèi)盒牡牟ㄌ芈试O(shè)置。
這里我還是在調(diào)侃一下,51 單片機(jī)這種硬件設(shè)計(jì)還是挺惡心的。好了,不扯了,我們?cè)賮?lái)看看什么叫波特率或則為什么要設(shè)置波特率。
講個(gè)簡(jiǎn)單的故事。上課做筆記的時(shí)候,老師在黑板上寫(xiě)字,你在往本子上記錄。會(huì)出現(xiàn)一下三種情況:
- 老師寫(xiě)字比你快,這樣擦黑板的時(shí)候,你就還沒(méi)寫(xiě)完。
- 老師寫(xiě)字和你一樣塊,這樣他寫(xiě)一個(gè)字,你寫(xiě)一個(gè)字,你們剛好同時(shí)結(jié)束。(最理想的情況)
- 老師寫(xiě)字比你慢,這樣你每次抬頭只能看到同一個(gè)字,你就會(huì)發(fā)現(xiàn),你的筆記上都是重復(fù)的字啥的,根本不是有效的信息。
波特率其實(shí)就是單片機(jī)之間通信的速率,它就是為了保證 A 和 B 之間可以同步進(jìn)行通信。這樣我們這么來(lái)講,最關(guān)鍵,最裝逼的地方要來(lái)了!注意,注意(重要的事情我說(shuō)三遍),我要開(kāi)始裝逼了。大家最長(zhǎng)看到波特率為 9600,38400,115200.這是什么意思呢?就是 1s 中傳輸 9600,38400,115200 個(gè)位。(1位 = 1個(gè)高低信號(hào))。
下面以 9600 的波特率來(lái)說(shuō)明:請(qǐng)記住這個(gè)公式:
暫時(shí)先讓 SMOD = 0,那么就可以變形為: 波特率 = T1 溢出率 / 32。那么簡(jiǎn)單了,我要開(kāi)始出題考試了,小學(xué)三年級(jí)的題目:已知波特率 9600,求 T1 的溢出率。(T1溢出率也就是定時(shí)器 1 每次運(yùn)行到最大值的時(shí)間)。T1溢出率 = 9600 * 32 = 307200。(T1 的溢出率也就是 T1運(yùn)行到最大值的頻率)。也就是說(shuō),T1運(yùn)行的時(shí)間 = 1 / T1頻率(T1的溢出率)。那么 T1 需要運(yùn)行的時(shí)間 t = 1 / 307200 = 3us。那好,還記得單片機(jī)每運(yùn)行一步是多久嗎?對(duì)于 12 Mhz 的晶振來(lái)說(shuō),就是 1us。至于為什么,這里補(bǔ)充說(shuō)明下:{51 單片機(jī)的晶振一般是 12Mhz 和 11.0592Mhz。不知道有沒(méi)有人知道一件事,51單片機(jī)的 CPU 時(shí)鐘是晶振的 12 分頻。(啥?不知道?去把你媽叫來(lái))。我們可以簡(jiǎn)單的理解為:如果使用 51單片機(jī),那么它的 CPU 頻率就是 1Mhz(此時(shí)晶振 12Mhz)。上狗頭鍘(錯(cuò)了,再來(lái),上公式:時(shí)間 = 1 / 周期),CPU運(yùn)行一步的時(shí)間 = 1 / 1Mhz = 1us (這個(gè)說(shuō)法有點(diǎn)不準(zhǔn)確,但是易于理解),而且我瞧瞧告訴你們,單片機(jī)的定時(shí)器走一步和CPU走一步時(shí)間是一樣的!??!}。那么我們最終的程序就是:
至此,經(jīng)過(guò)以上不懈的努力,我們終于讓 A , B 有情人終成眷屬了。