高級流水燈--水滴效果_第1頁
高級流水燈--水滴效果_第2頁
高級流水燈--水滴效果_第3頁
高級流水燈--水滴效果_第4頁
高級流水燈--水滴效果_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、高級流水燈-水滴效果(漸變帶拖尾效果)實現(xiàn)和講解 復(fù)制鏈接 spark5115主題0好友124積分注冊會員莫元111· 發(fā)消息電梯直達(dá)1樓發(fā)表于 2011-12-6 09:03:44|只看該作者|倒序瀏覽簡介學(xué)習(xí)嵌入式第一個例子通常都是控制一個LED亮滅,然后是花樣繁多的流水燈,但不管燈的花樣如何變化,單個LED的亮度沒有變化,只有亮、滅兩個狀態(tài),本章我們實現(xiàn)如何控制LED的亮度。1 什么是PWM脈沖寬度調(diào)制(Pulse Width Modulation,簡稱PWM),是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種技術(shù)。在本章的應(yīng)用中可以認(rèn)為PWM就是一種方波。比如圖1:(原文件

2、名:120611_0.png)圖1 方波是周期為10ms,占空比為60%的PWM。占空比:高電平在一個周期之內(nèi)所占的時間比率。2 硬件設(shè)計在例說51單片機(jī)的第三章,我們講過如何控制開發(fā)板上LED的亮滅。首先譯碼器輸出端LEDS6為低,T10導(dǎo)通,給8個LED供電,然后通過緩沖器8個輸出端BD0BD7的控制LED的亮滅(低亮高滅)。(原文件名:120611_1.png)圖2 LED硬件連接如果BD口輸出高低不斷變化,則LED會閃爍;如果這種高低電平變化非常快,由于人的視覺暫留現(xiàn)象,LED就會出現(xiàn)不同的亮度。3 軟件設(shè)計3.1 PWM能否控制亮度下面我們就用實踐驗證PWM是否能夠控制LED的亮度,

3、測試代碼如下:程序清單L1: 驗證PWM能否控制LED的亮度1 #include <reg52.h>2 #include "my_type.h"3 #include "hw_config.h"456 void main(void)7 8 u8 i = 0;910 /使能獨立LED的供電,即LEDS6輸出低電平11 LEDEN = 0;12 ADDR0 = 0;13 ADDR1 = 1;14 ADDR2 = 1;15 ADDR3 = 1;1617 /第一個LED亮18 P0 = 0xFE;1920 while(1)21 22 for(i=0;

4、i<250; i+)23 24 if(i<10)25 26 P0 &= 0xFD; /第二個燈亮27 28 else29 30 P0 |= 0x02; /第二個燈滅31 32 33 34 L1(22-32):這段代碼實現(xiàn)P0.1輸出占空比為96%的方波,而P0.0恒為低。P0.1輸出如圖3所示(受紙張限制,圖中高低電平長度比例和實際有偏差)。(原文件名:120611_2.png)圖3下載驗證:從開發(fā)板上可以看到運行效果,D1比D2亮。(這里說明一點:當(dāng)P0輸出低電平時,LED亮,所以,PWM的占空比越小越亮)。3.2 產(chǎn)生8個亮度級別3.1節(jié)的例子證實了我們的設(shè)想,PWM可

5、控制LED的亮度,下面我們設(shè)計幾組占空比不同的PWM,看看對LED亮度的控制效果。代碼如下:程序清單L2:不同占空比對LED亮度的控制1 #include <reg52.h>2 #include "hw_config.h"3 #include "my_type.h"456 /亮度級別表7 code u8 LightLevel8=0,1,2,4,8,16,32,64;89 void main(void)10 11 u8 i = 0;12 u8 j = 0;13 u8 k = 0;14 u8 temp = 0;1516 /使能獨立LED的供電,即

6、LEDS6輸出低電平17 LEDEN = 0;18 ADDR0 = 0;19 ADDR1 = 1;20 ADDR2 = 1;21 ADDR3 = 1;2223 /開始全滅24 P0 = 0xFF;2526 while(1)27 28 /P0端口輸出8組占空比不同的PWM29 for(i=0; i<64; i+)30 31 for(j=0; j<8; j+)32 33 if(LightLevelj <= i)34 35 temp |= (1<<j);36 37 else38 39 temp &= (1<<j);40 41 4243 P0 = te

7、mp;44 45 46 L2(29-45).此段程序是讓P0口輸出8組占空比不同的PWM,如圖4:(原文件名:120611_3.png)圖4下載驗證:從開發(fā)板上可以看到運行效果,從D1到D8的亮度逐漸增大。3.3 水滴下落效果根據(jù)PWM可控制LED亮度的原理,我們用8個LED實現(xiàn)水滴下落的效果。第一步,水滴逐漸變大,用D1從暗變亮模擬;第二步,水滴下落,帶有拖尾效果,LED逐個亮,移動速度加快,且越靠前的LED亮度越大。程序清單L3 水滴流水燈1 #include <reg52.h>2 #include "hw_config.h"3 #include "

8、;my_type.h"45 /亮度級別表6 code u8 LightLevel8=0,1,2,4,8,16,32,64;78 /水滴時間,實現(xiàn)加速效果9 code u8 LightTime16=16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1;101112 void main(void)13 14 u8 i,j,k;15 u8 temp,count;16 u8 state;1718 /使能獨立LED的供電,即LEDS6輸出低電平19 LEDEN = 0;20 ADDR0 = 0;21 ADDR1 = 1;22 ADDR2 = 1;23 ADDR3 = 1

9、;2425 while(1)26 27 /開始全滅28 P0 = 0xFF;2930 /-水滴逐漸變大(第一個LED亮度逐漸變大)-31 for(i=0; i<64; i+)32 33 /一個亮度級別發(fā)送64個脈沖34 for(j=0; j<64; j+)35 36 P0 = 0xFE;37 /以i為亮度級別,隨著i的增大,占空比增大38 for(k=0; k<64; k+)39 40 if(k > i)41 42 P0 = 0xFF;43 44 45 46 4748 /-水滴降落過程-49 for(state=0; state<16; state+)50 51

10、/每一狀態(tài)維持LightTimestate個脈沖52 for(count=0; count<=LightTimestate; count+)53 54 /temp記錄8個LED的狀態(tài),0代表亮,1代表滅55 temp = 0x00;5657 /一個脈沖長度j從0到6358 for(j=0; j<64; j+)59 60 /根據(jù)亮度表,依次確定8個LED當(dāng)前狀態(tài),亮或滅61 for(k=0; k<8; k+)62 63 /以j為亮度級別,每個LED亮度不一樣64 if(LightLevelk = j)65 66 temp |= (1 << k);67 68 6970

11、 if(state <= 7)71 72 P0 = (temp) >> (7-state);73 74 else75 76 P0 = (temp) << (state-7);77 78 79 80 81 82 L2(31-46).實現(xiàn)水滴變大效果,這段代碼的作用可用圖形表達(dá),如圖5:(原文件名:120611_4.png)圖5控制D1由暗變亮,用了64個亮度級別,每個級別發(fā)送64個脈沖。L2(49-81).實現(xiàn)水滴下落。代碼就不逐行解釋了,大家可根據(jù)注釋自己分析,主要說一下實現(xiàn)的方法。定義LED有8個亮度級別,若用開發(fā)板上的8個LED表示,如圖6:(原文件名:120

12、611_5.png)圖6圖中的紅色面積代表亮度程度。實現(xiàn)流水效果的方法就是:讓所有的亮度依次經(jīng)過在所有LED,如圖7:(原文件名:120611_6.png)圖7狀態(tài)的持續(xù)時間從0-15逐漸減小,以模擬水滴加速。下載驗證:下載到開發(fā)板上,可以看到水滴下落效果。3.4 定時器產(chǎn)生PWM前面3個例子中,我們用循環(huán)語句雖然能產(chǎn)生占空比不同的PWM,但PWM的周期不好控制,對此,我們學(xué)習(xí)如何用定時器產(chǎn)生特定周期PWM。關(guān)于8051定時器的使用方法,大家可以參考例說51單片機(jī)的4章和5章。我們用定時器0產(chǎn)生PWM,代碼如下:程序清單L4 定時器0產(chǎn)生PWM1 #include <reg52.h>

13、;2 #include "hw_config.h"3 #include "my_type.h"456 /亮度級別表7 code u8 LightLevel8=1,2,4,8,16,28,50,64;89 /函數(shù)聲明10 void timer0_init(void);1112 void main(void)13 14 /使能獨立LED的供電,即LEDS6輸出低電平15 LEDEN = 0;16 ADDR0 = 0;17 ADDR1 = 1;18 ADDR2 = 1;19 ADDR3 = 1;2021 timer0_init();2223 while(1)2

14、4 25 26 2728 /*29 函數(shù)名稱:timer0_init30 功 能:初始化定時器031 */32 void timer0_init(void)33 34 TMOD = 0x01; /運行模式135 TH0 = 0xFF; /10us中斷36 TL0 = 0xFA;37 EA = 1; /開啟中斷38 ET0 = 1;39 TR0 = 1; /啟動定時器4041 4243 /*44 函數(shù)名稱:timer0_overflow45 功 能:定時器0溢出中斷46 */47 void timer0_overflow(void) interrupt TIMER0_OVERFLOW48 49

15、u8 i,temp = 0;50 static u8 count = 0;5152 count+;53 count %= 64;5455 for(i=0; i<8; i+)56 57 if(LightLevel <= count)58 59 temp |= (1<<i);60 61 else62 63 temp &= (1<<i);64 65 66 67 P0 = temp;68 69 TR0 = 0;70 TH0 = 0xFF; /重新賦值71 TL0 = 0xF7;72 TR0 = 1;73 L4(32).初始化定時器0,沒10us產(chǎn)生一次中斷。

16、L4(55-65).控制輸出8組不同占空比的PWM。這段代碼功能和程序清單2中的功 能一致。下載驗證:下載到開發(fā)板上,可以看到D1到D8亮度逐漸增大。3.5 亮度不同的點陣學(xué)習(xí)了用定時器產(chǎn)生PWM,我們可以控制更多的LED,比如LED點陣的亮度。下面的例子實現(xiàn)LED點陣每行的亮度都不同。程序清單5 亮度不同的點陣1 #include <reg52.h>2 #include "hw_config.h"3 #include "my_type.h"4 5 6 /亮度級別表7 code u8 LightLevel8=1,2,4,8,16,32,50,

17、64;8 9 /函數(shù)聲明10 void timer0_init(void);11 12 void main(void)13 14 /使能控制點陣的譯碼器15 LEDEN = 0;16 ADDR3 = 0;17 18 timer0_init();19 20 while(1)21 22 23 24 /*25 函數(shù)名稱:timer0_init26 功 能:初始化定時器027 */28 void timer0_init(void)29 30 TMOD = 0x01; /運行模式131 TH0 = 0xFF; /中斷時間10us32 TL0 = 0xF733 EA = 1; /開啟中斷34 ET0 =

18、1;35 TR0 = 1; /啟動定時器36 37 38 /*39 函數(shù)名稱:timer0_overflow40 功 能:定時器0溢出中斷41 */42 void timer0_overflow(void) interrupt TIMER0_OVERFLOW43 44 u8 i;45 u8 p1_value = 0;46 static u8 state = 0; /點陣狀態(tài)(掃描行數(shù))47 static u8 count = 0;48 49 TR0 = 0;50 51 count+;52 if(count = 64)53 54 state+;55 state %= 8;56 count = 0

19、;57 58 59 if(count < LightLevelstate)60 61 P0 = 0x00;62 63 else64 65 P0 = 0xFF;66 67 68 p1_value = P1 & 0xf8;69 p1_value |= state;70 P1 = p1_value;71 72 TH0 = 0xFF; /重新賦值73 TL0 = 0xFA;74 TR0 = 1;75 L5(28).初始化定時器,每10us中斷一次。L5(51-57).每中斷64次,點陣掃描移動到下一行,用state記錄當(dāng)前行數(shù)。L5(59-66).掃描每一行輸出的PWM都不一樣,使用的方

20、式和處理獨立LED一致。L5(68-70).輸出點陣對應(yīng)的位碼。下載驗證:下載到開發(fā)板上,可以看到運行效果,點陣第一行最暗,越往下越亮。3.6 點陣模擬音樂頻譜分析效果在很多音樂播放軟件上,都有頻譜分析的圖形,如圖8:(原文件名:120611_7.png) 圖8我們用也可以模擬相似的圖形,代碼如下:程序清單6:點陣模擬音樂頻譜分析1 #include <reg52.h>2 #include "hw_config.h"3 #include "my_type.h"4 5 /頻譜波形表6 code u8 Wave168=7 8 0xFF,0xFF,

21、0xFF,0xFF,0xFE,0xBB,0xFE,0xAA,9 0xFF,0xFF,0xFF,0xFE,0xFB,0xAE,0xFA,0xAA,10 0xFF,0xFF,0xFF,0xFE,0xEB,0xBE,0xEA,0xAA,11 0xFF,0xFF,0xFE,0xFB,0xAF,0xFE,0xAA,0xAA,12 0xFF,0xFE,0xFB,0xBE,0xEA,0xBA,0xAA,0xAA,13 0xFF,0xFE,0xBB,0xEE,0xBA,0xBA,0xAA,0xAA,14 0xFE,0xBB,0xEE,0xBA,0xAA,0xAA,0xAA,0xAA,15 0xBA,0xEF,

22、0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,16 0xEE,0xBB,0xFE,0xAA,0xAA,0xAA,0xAA,0xAA,17 0xEE,0xBB,0xFE,0xEA,0xAA,0xAA,0xAA,0xAA,18 0xFE,0xEB,0xBE,0xFE,0xAA,0xAA,0xAA,0xAA,19 0xFF,0xEE,0xBB,0xFF,0xAE,0xAA,0xAA,0xAA,20 0xFF,0xFE,0xAF,0xFB,0xEE,0xAA,0xAA,0xAA,21 0xFF,0xFF,0xFE,0xBB,0xEF,0xBA,0xAA,0xAA,22 0xFF,0xFF

23、,0xFF,0xFE,0xAB,0xFF,0xEE,0xAA,23 0xFF,0xFF,0xFF,0xFF,0xFE,0xEB,0xBE,0xAA24 ;25 26 /亮度級別表27 code u8 LightLevel8=1,2,4,8,16,32,50,64;28 29 /函數(shù)聲明30 void timer0_init(void);31 32 void main(void)33 34 /使能控制點陣的譯碼器35 LEDEN = 0;36 ADDR3 = 0;37 38 timer0_init();39 40 while(1)41 42 43 44 45 /*46 函數(shù)名稱:timer0_init47 功 能:初始化定時器048 */49 void timer0_init(void)50 51 TMOD = 0x01; /運行模式152 TH0 = 0xFF; /10us中斷53 TL0 = 0xFA;54 EA = 1; /開啟中斷55 ET0 = 1;56 TR0 = 1; /啟動定時器57 58 59 60 /*61 函數(shù)名稱:timer0_overflow62 功 能:定時器0溢出中斷63 */64 void ti

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。