總算開始了第一個 so easy 的項目了。你猜,我們準備做的這個項目簡單嘛?話不多說,分享開始。
項目分析(流水燈)
-
功能:何為流水燈?其實就很簡單,就是一群燈像水流一樣。簡單兩個字:一直會動的燈。
-
具體做法劃分:(最簡單的兩步)
- 在 proteus 上面搭建一個簡單的模擬電路:單片機 + 一群燈。
- 在 keil 上面編寫代碼,讓燈動起來。
實際電路分析和編碼前的邏輯分析
實際的效果如下,我們來分析一下如何讓下面圖片的燈依次動起來?有沒有看不懂的?
我簡單舉個例子,比如圖片中左下方的 D6,左端接在 GND 上面,右端接在 P1.6 上面,那么只要 P1.6 提供高電平(1),也就是俗稱的 VCC,那么 D6 就能亮起來了。但是要是 P1.6 提供一個低電平(0),也就是俗稱的 GND,那么 D6 兩端都是 GND 也就滅了。濃縮一下上面的內容也就是兩行編程思維:
- P1.6 = 0; (相當于燈滅了)
- P1.6 = 1; (相當于燈亮了)
- 留一個思考的問題(如何讓 P1.6 = 0 控制燈亮?也就是兩條語句實際的效果調換一下,不會的也別想了,就這么看看吧——正確答案:把上圖中接在 GND 的地方換成 VCC)。
硬件開發提供了底層硬件基礎,才有了我們邏輯實現的平臺。我們只是根據實際的電路圖來分析相關引腳到底需要怎么操作。一個好的硬件工程師會簡化單片機開發人員的編碼工作量。我建議大家硬件軟件一手抓。
其他控制引腳如下:
- P1.1 控制一個 D1
- P1.6 控制一個 D2
- P2.1 控制一個 D3
- P2.6 控制一個 D4
- P3.1 控制一個 D5
- P3.6 控制一個 D6
我們現在的工作就是讓這些燈能依次的亮起來實現一個動畫的效果。也就是對應的控制引腳依次可以輸出高低電平就可以了。
上面這么一分析。是不是突然發現,怎么這么簡單。
實際編碼過程和問題分析
現在燈準備好了,如何讓它“流水”起來呢?
有了上面的分析,下面寫得這段代碼你是不是就能看懂了? 6 - 11行:讓燈全部亮起來。 13 - 19 行:讓燈又滅掉了。好了,這樣一份簡單的功能就做完了。下面我們編譯生產 HEX 文件。
當你點完編譯按鈕之后,你應該就可以得到和我一樣的編譯報錯了。
首先解釋一下,為什么會出現這些報錯信息呢?最根本的原因就是 Keil 這個編譯器啊,它不認識 P1 和 .1(其實就是沒有定義!無定義不允許使用),那么,我們這里需要考慮的應該是:通過什么來控制 P2.6 這個引腳呢?那當然是自己定義了。看看下面這個代碼和實際的運行結果。
好了,我們依次解釋一下,上面這個是什么意思。第一行:sbit P2_6 = 0xA6 這句話就是我們本章的重重之重。具體什么意思呢?其實你可以這么理解:0xA6 是芯片的控制開關,P2_6 是我們軟件的控制開關。sbit 相關于讓兩個開關發生關系。當他們發生關系之后,我們就可以通過 P2_6 這個符號控制 0xA6 對應的引腳了。(除了寫成 P2_6 的樣子,你也可以寫成 abc,sbit abc = 0xA6,那么 abc 就也可以控制 P2.6 的引腳了)。
好了,那我們依次把全部的引腳定義一下吧,把代碼重新整理一下就是下面這個樣子了。到了這一步,我們總算控制了全部的引腳。
現在大家是不是很疑惑?難道這些什么 0xA1,0x96 的都需要背下來?是的,確實有些牛人都全部記下來了。51 芯片自己也已經幫我們把這些全部統一定義好了。那我們怎么才能用呢?我們就需要把 51 給我們寫的 reg52.h 文件(有些喜歡用 reg51.h,兩個只是差了部分寄存器,基本一樣)。#include "reg52.h" 就可以了。如果感興趣,你們可以打開 reg52.h 這個文件看看,它幫我們把全部寄存器都定義好了專門的標簽,那么我們就可以直接用了。
好了,下面我準備變形了,注意了!
同樣的功能,更精簡的代碼。但是你們發現沒有,好像其他引腳的狀態也被意外修改了?這不就尷尬了,就好像拆了東墻補西墻。比如我只想修改其中某一個引腳該怎么辦呢?我給你們總結出了兩個標準公式。(先記公式吧,用個兩天再百度原因,這種效率才是最高的)。
代碼又進一步的優化了。至此,我們總算將所有引腳都可以做到隨心所欲的控制了。
好了,我們現在讓燈能夠亮和滅了,如何讓它動起來呢?
理論上講,是不是這樣,小燈是不是就該閃起來了?但是當你打開仿真的時候,你會發現,其實燈只是一直亮著,根本沒有閃過,這是什么原因呢?我明明寫好了呀!這時候有些所謂的程序員就開始找硬件的麻煩了,可是事實真的是這樣嗎?
大家好好看下程序,滅 -> 亮 -> 滅 -> 亮,程序流程確實是對的,但是它忽略了一個最重要的問題,我們人眼最快也需要間隔 2ms 以上,才能分辨出兩個狀態。很簡單的一個道理,就是你的大腦反應不過,當然你也可以嘗試修煉一下自己的大腦,讓它能觀察出us級別的變化間隔,然后你就能看到,哇!真的閃爍起來了。但是作為一個正常的地球人,我們還是老老實實的改程序吧!最主要原因就是由滅到亮的時間太快了唄?那好,我們讓它慢一點。
我們在每次狀態變化的后面,增加一個計算,讓它滅完以后,經過大量的計算,再到亮的狀態。然后在經過大量的計算,再到滅的狀態,這樣就相當于有了一定的延時。讓它多個狀態之間有了時間的間隔,這樣眼睛就可以區分了。實際動態效果如下:
竟然真的動起來!本篇文章就寫到這里,下一篇我再進一步地講解。