性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

暴揍單片機(jī)(進(jìn)階篇) 1 —— 流水燈(上)動一動

總算開始了第一個 so easy 的項目了。你猜,我們準(zhǔn)備做的這個項目簡單嘛?話不多說,分享開始。
項目分析(流水燈)
  1. 功能:何為流水燈?其實就很簡單,就是一群燈像水流一樣。簡單兩個字:一直會動的燈。
  2. 具體做法劃分:(最簡單的兩步)
  • 在 proteus 上面搭建一個簡單的模擬電路:單片機(jī) + 一群燈。
  • 在 keil 上面編寫代碼,讓燈動起來。
實際電路分析和編碼前的邏輯分析
實際的效果如下,我們來分析一下如何讓下面圖片的燈依次動起來?有沒有看不懂的?

我簡單舉個例子,比如圖片中左下方的 D6,左端接在 GND 上面,右端接在 P1.6 上面,那么只要 P1.6 提供高電平(1),也就是俗稱的 VCC,那么 D6 就能亮起來了。但是要是 P1.6 提供一個低電平(0),也就是俗稱的 GND,那么 D6 兩端都是 GND 也就滅了。濃縮一下上面的內(nèi)容也就是兩行編程思維:
  • P1.6 = 0; (相當(dāng)于燈滅了)
  • P1.6 = 1; (相當(dāng)于燈亮了)
  • 留一個思考的問題(如何讓 P1.6 = 0 控制燈亮?也就是兩條語句實際的效果調(diào)換一下,不會的也別想了,就這么看看吧——正確答案:把上圖中接在 GND 的地方換成 VCC)。
硬件開發(fā)提供了底層硬件基礎(chǔ),才有了我們邏輯實現(xiàn)的平臺。我們只是根據(jù)實際的電路圖來分析相關(guān)引腳到底需要怎么操作。一個好的硬件工程師會簡化單片機(jī)開發(fā)人員的編碼工作量。我建議大家硬件軟件一手抓。
其他控制引腳如下:
  • P1.1 控制一個 D1
  • P1.6 控制一個 D2
  • P2.1 控制一個 D3
  • P2.6 控制一個 D4
  • P3.1 控制一個 D5
  • P3.6 控制一個 D6
我們現(xiàn)在的工作就是讓這些燈能依次的亮起來實現(xiàn)一個動畫的效果。也就是對應(yīng)的控制引腳依次可以輸出高低電平就可以了。
上面這么一分析。是不是突然發(fā)現(xiàn),怎么這么簡單。
實際編碼過程和問題分析
現(xiàn)在燈準(zhǔn)備好了,如何讓它“流水”起來呢?
有了上面的分析,下面寫得這段代碼你是不是就能看懂了? 6 - 11行:讓燈全部亮起來。 13 - 19 行:讓燈又滅掉了。好了,這樣一份簡單的功能就做完了。下面我們編譯生產(chǎn) HEX 文件。

當(dāng)你點(diǎn)完編譯按鈕之后,你應(yīng)該就可以得到和我一樣的編譯報錯了。

首先解釋一下,為什么會出現(xiàn)這些報錯信息呢?最根本的原因就是 Keil 這個編譯器啊,它不認(rèn)識 P1 和 .1(其實就是沒有定義!無定義不允許使用),那么,我們這里需要考慮的應(yīng)該是:通過什么來控制 P2.6 這個引腳呢?那當(dāng)然是自己定義了??纯聪旅孢@個代碼和實際的運(yùn)行結(jié)果。

好了,我們依次解釋一下,上面這個是什么意思。第一行:sbit P2_6 = 0xA6 這句話就是我們本章的重重之重。具體什么意思呢?其實你可以這么理解:0xA6 是芯片的控制開關(guān),P2_6 是我們軟件的控制開關(guān)。sbit 相關(guān)于讓兩個開關(guān)發(fā)生關(guān)系。當(dāng)他們發(fā)生關(guān)系之后,我們就可以通過 P2_6 這個符號控制 0xA6 對應(yīng)的引腳了。(除了寫成 P2_6 的樣子,你也可以寫成 abc,sbit abc = 0xA6,那么 abc 就也可以控制 P2.6 的引腳了)。
好了,那我們依次把全部的引腳定義一下吧,把代碼重新整理一下就是下面這個樣子了。到了這一步,我們總算控制了全部的引腳。

現(xiàn)在大家是不是很疑惑?難道這些什么 0xA1,0x96 的都需要背下來?是的,確實有些牛人都全部記下來了。51 芯片自己也已經(jīng)幫我們把這些全部統(tǒng)一定義好了。那我們怎么才能用呢?我們就需要把 51 給我們寫的 reg52.h 文件(有些喜歡用 reg51.h,兩個只是差了部分寄存器,基本一樣)。#include "reg52.h" 就可以了。如果感興趣,你們可以打開 reg52.h 這個文件看看,它幫我們把全部寄存器都定義好了專門的標(biāo)簽,那么我們就可以直接用了。
好了,下面我準(zhǔn)備變形了,注意了!

同樣的功能,更精簡的代碼。但是你們發(fā)現(xiàn)沒有,好像其他引腳的狀態(tài)也被意外修改了?這不就尷尬了,就好像拆了東墻補(bǔ)西墻。比如我只想修改其中某一個引腳該怎么辦呢?我給你們總結(jié)出了兩個標(biāo)準(zhǔn)公式。(先記公式吧,用個兩天再百度原因,這種效率才是最高的)。

代碼又進(jìn)一步的優(yōu)化了。至此,我們總算將所有引腳都可以做到隨心所欲的控制了。

好了,我們現(xiàn)在讓燈能夠亮和滅了,如何讓它動起來呢?

理論上講,是不是這樣,小燈是不是就該閃起來了?但是當(dāng)你打開仿真的時候,你會發(fā)現(xiàn),其實燈只是一直亮著,根本沒有閃過,這是什么原因呢?我明明寫好了呀!這時候有些所謂的程序員就開始找硬件的麻煩了,可是事實真的是這樣嗎?
大家好好看下程序,滅 -> 亮 -> 滅 -> 亮,程序流程確實是對的,但是它忽略了一個最重要的問題,我們?nèi)搜圩羁煲残枰g隔 2ms 以上,才能分辨出兩個狀態(tài)。很簡單的一個道理,就是你的大腦反應(yīng)不過,當(dāng)然你也可以嘗試修煉一下自己的大腦,讓它能觀察出us級別的變化間隔,然后你就能看到,哇!真的閃爍起來了。但是作為一個正常的地球人,我們還是老老實實的改程序吧!最主要原因就是由滅到亮的時間太快了唄?那好,我們讓它慢一點(diǎn)。

我們在每次狀態(tài)變化的后面,增加一個計算,讓它滅完以后,經(jīng)過大量的計算,再到亮的狀態(tài)。然后在經(jīng)過大量的計算,再到滅的狀態(tài),這樣就相當(dāng)于有了一定的延時。讓它多個狀態(tài)之間有了時間的間隔,這樣眼睛就可以區(qū)分了。實際動態(tài)效果如下:

竟然真的動起來!本篇文章就寫到這里,下一篇我再進(jìn)一步地講解。
聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯的朋友,別忘了一鍵三連哦!
贊 4
收藏 2
關(guān)注 54
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧