AVR單片機教程——數字輸出

從上一篇教程中咱們瞭解到,按鍵與開關的輸入本質上就是數字信號的讀取。這一篇教程要講的是,控制LED的原理是數字信號的輸出。數字IO是單片機編程之有別於桌面編程的各項內容中最簡單、最基礎的。編程

 

在講數字信號輸出以前,咱們先來了解一下它控制的器件。LED,是一種二極管,在理想模型中,加以正向電壓會發光,反向電壓則不會。在稍微實際一點的模型中,當正向電壓超過必定閾值時,二極管會發光,其電流會隨着正向電壓的增大而急劇增大;對反向電壓的耐受力也是有限的。現實中的LED的具體參數因生產廠家而異,通常紅色與黃色LED的導通壓降爲2V多,綠、藍、白色的爲3V左右或多一點;反向耐壓通常爲5V。函數

電流大到必定程度,任何器件都會燒燬,咱們最好要把LED的電壓控制在比導通壓降高一點,但直接得到這樣的電壓比較困難,並且與LED的參數和溫度等都是相關的。一種方案是用電流源來驅動LED,但因爲現代計算機,包括單片機,都以電壓方式來工做,在控制亮暗這種簡單應用中通常不會使用(大功率LED通常有專用的恆流電源來驅動)。常見的方案是將LED與一個電阻串聯。這個電阻能保證LED的電流不太大,所以稱爲限流電阻。至於這種接法下電流是多少,能夠經過「負載線」來求得。本系列教程不會專門講電路,你能夠本身搜索相關知識,遲早會用到的。ui

早期的單片機設計中,通常把LED和電阻接在引腳和正電源之間,這是由於TTL的拉電流能力強而灌電流能力很弱,只能這樣接。CMOS工藝的單片機沒必要在乎這一點,因爲咱們習慣讓1表明有而0表明無,所以通常將LED與電阻接在引腳與地之間。電阻接在LED的正極仍是負極是無所謂的。spa

以上都是對單個LED而言的。對於一些多色LED,好比RGB的,各個單色光源的一極是接在一塊兒的,以節省引腳。當正極接在一塊兒時,稱爲共陽接法:設計

爲了亮度均勻,須要爲每一個LED接一個限流電阻(阻值通常不一樣),這時電阻就必須接在LED負極上了,而後再鏈接單片機引腳,而LED的另外一端則鏈接正電源。引腳輸出低電平會讓對應顏色亮起。code

當負極接在一塊兒時,稱爲共陰接法:blog

LED的兩極稱爲正極負極,接法稱爲共陽和共陰,都是習慣而已,沒必要糾結其中的不一致性。教程

 

咱們的開發板上有一顆RGBW的LED,4種顏色的LED都有獨立的正負極,但我把它們的負極都接到了地,能夠理解爲共陰接法。LED右邊的4個針腳分別鏈接電阻,而後再鏈接LED的正極。所以,鏈接單片機引腳和LED的針腳後,使引腳輸出高電平能讓LED亮,反之則不亮。開發

將引腳4~7分別鏈接到RGBW上,咱們來實現一個略微複雜(相比以前)的效果:紅,紅+綠,綠,綠+藍,藍,藍+紅;而後重複,只是加上白色;循環。it

 1 #include <ee1/pin.h>
 2 #include <ee1/delay.h>
 3 
 4 #define RED   PIN_4
 5 #define GREEN PIN_5
 6 #define BLUE  PIN_6
 7 #define WHITE PIN_7
 8 
 9 void rgb_cycle()
10 {
11     for (uint8_t i = 0; i != 6; ++i)
12     {
13         pin_write(RED  , i == 5 || i == 0 || i == 1);
14         pin_write(GREEN, i == 1 || i == 2 || i == 3);
15         pin_write(BLUE , i == 3 || i == 4 || i == 5);
16         delay(500);
17     }
18 }
19 
20 int main()
21 {
22     uint8_t pins[] = {RED, GREEN, BLUE, WHITE};
23     for (uint8_t i = 0; i != sizeof(pins) / sizeof(pins[0]); ++i)
24         pin_mode(pins[i], OUTPUT);
25     while (1)
26     {
27         pin_write(WHITE, false);
28         rgb_cycle();
29         pin_write(WHITE, true);
30         rgb_cycle();
31     }
32 }

這段代碼雖然略長,但仍是比較容易理解的:rgb_cycle 即爲6種狀態的枚舉,包含了延時;main 函數中,先初始化,而後進入主循環;每一遍循環中先控制白色燈,而後調用 rgb_cycle ,對於白色燈的兩種狀態調用兩次;總體效果的循環週期爲12次改變。

 

另外,你也許已經發現,對於數字輸入的引腳,即便沒有調用 pin_mode 來配置模式,也能正常檢測輸入。這是由於輸入是單片機復位後默認的設置。那麼,對於輸出來講,就必須調用 pin_mode 將引腳配置爲輸出模式。若是沒有將引腳配置爲輸出而寫高電平會怎樣?本身試試吧。緣由咱們之後分析。

因爲今天的教程很是簡單,就沒有做業了。複習一下以前的內容,下一篇教程會比較難。

相關文章
相關標籤/搜索