![高級(jí)流水燈水滴效果_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/24847cbc-0d1b-406f-a13a-866a4ae19c68/24847cbc-0d1b-406f-a13a-866a4ae19c681.gif)
![高級(jí)流水燈水滴效果_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/24847cbc-0d1b-406f-a13a-866a4ae19c68/24847cbc-0d1b-406f-a13a-866a4ae19c682.gif)
![高級(jí)流水燈水滴效果_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/24847cbc-0d1b-406f-a13a-866a4ae19c68/24847cbc-0d1b-406f-a13a-866a4ae19c683.gif)
![高級(jí)流水燈水滴效果_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/24847cbc-0d1b-406f-a13a-866a4ae19c68/24847cbc-0d1b-406f-a13a-866a4ae19c684.gif)
![高級(jí)流水燈水滴效果_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/3/24847cbc-0d1b-406f-a13a-866a4ae19c68/24847cbc-0d1b-406f-a13a-866a4ae19c685.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、高級(jí)流水燈-水滴效果(漸變帶拖尾效果)實(shí)現(xiàn)和講解 復(fù)制鏈接 spark5115主題0好友124積分注冊(cè)會(huì)員莫元111· 發(fā)消息電梯直達(dá)1樓發(fā)表于 2011-12-6 09:03:44|只看該作者|倒序?yàn)g覽簡(jiǎn)介學(xué)習(xí)嵌入式第一個(gè)例子通常都是控制一個(gè)LED亮滅,然后是花樣繁多的流水燈,但不管燈的花樣如何變化,單個(gè)LED的亮度沒有變化,只有亮、滅兩個(gè)狀態(tài),本章我們實(shí)現(xiàn)如何控制LED的亮度。1 什么是PWM脈沖寬度調(diào)制(Pulse Width Modulation,簡(jiǎn)稱PWM),是利用微處理器的數(shù)字輸出來對(duì)模擬電路進(jìn)行控制的一種技術(shù)。在本章的應(yīng)用中可以認(rèn)為PWM就是一種方波。比如圖1:(原文件
2、名:120611_0.png)圖1 方波是周期為10ms,占空比為60%的PWM。占空比:高電平在一個(gè)周期之內(nèi)所占的時(shí)間比率。2 硬件設(shè)計(jì)在例說51單片機(jī)的第三章,我們講過如何控制開發(fā)板上LED的亮滅。首先譯碼器輸出端LEDS6為低,T10導(dǎo)通,給8個(gè)LED供電,然后通過緩沖器8個(gè)輸出端BD0BD7的控制LED的亮滅(低亮高滅)。(原文件名:120611_1.png)圖2 LED硬件連接如果BD口輸出高低不斷變化,則LED會(huì)閃爍;如果這種高低電平變化非常快,由于人的視覺暫留現(xiàn)象,LED就會(huì)出現(xiàn)不同的亮度。3 軟件設(shè)計(jì)3.1 PWM能否控制亮度下面我們就用實(shí)踐驗(yàn)證PWM是否能夠控制LED的亮度,
3、測(cè)試代碼如下:程序清單L1: 驗(yàn)證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 /使能獨(dú)立LED的供電,即LEDS6輸出低電平11 LEDEN = 0;12 ADDR0 = 0;13 ADDR1 = 1;14 ADDR2 = 1;15 ADDR3 = 1;1617 /第一個(gè)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; /第二個(gè)燈亮27 28 else29 30 P0 |= 0x02; /第二個(gè)燈滅31 32 33 34 L1(22-32):這段代碼實(shí)現(xiàn)P0.1輸出占空比為96%的方波,而P0.0恒為低。P0.1輸出如圖3所示(受紙張限制,圖中高低電平長(zhǎng)度比例和實(shí)際有偏差)。(原文件名:120611_2.png)圖3下載驗(yàn)證:從開發(fā)板上可以看到運(yùn)行效果,D1比D2亮。(這里說明一點(diǎn):當(dāng)P0輸出低電平時(shí),LED亮,所以,PWM的占空比越小越亮)。3.2 產(chǎn)生8個(gè)亮度級(jí)別3.1節(jié)的例子證實(shí)了我們的設(shè)想,PWM可
5、控制LED的亮度,下面我們?cè)O(shè)計(jì)幾組占空比不同的PWM,看看對(duì)LED亮度的控制效果。代碼如下:程序清單L2:不同占空比對(duì)LED亮度的控制1 #include <reg52.h>2 #include "hw_config.h"3 #include "my_type.h"456 /亮度級(jí)別表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 /使能獨(dú)立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下載驗(yàn)證:從開發(fā)板上可以看到運(yùn)行效果,從D1到D8的亮度逐漸增大。3.3 水滴下落效果根據(jù)PWM可控制LED亮度的原理,我們用8個(gè)LED實(shí)現(xiàn)水滴下落的效果。第一步,水滴逐漸變大,用D1從暗變亮模擬;第二步,水滴下落,帶有拖尾效果,LED逐個(gè)亮,移動(dòng)速度加快,且越靠前的LED亮度越大。程序清單L3 水滴流水燈1 #include <reg52.h>2 #include "hw_config.h"3 #include "
8、;my_type.h"45 /亮度級(jí)別表6 code u8 LightLevel8=0,1,2,4,8,16,32,64;78 /水滴時(shí)間,實(shí)現(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 /使能獨(dú)立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 /-水滴逐漸變大(第一個(gè)LED亮度逐漸變大)-31 for(i=0; i<64; i+)32 33 /一個(gè)亮度級(jí)別發(fā)送64個(gè)脈沖34 for(j=0; j<64; j+)35 36 P0 = 0xFE;37 /以i為亮度級(jí)別,隨著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個(gè)脈沖52 for(count=0; count<=LightTimestate; count+)53 54 /temp記錄8個(gè)LED的狀態(tài),0代表亮,1代表滅55 temp = 0x00;5657 /一個(gè)脈沖長(zhǎng)度j從0到6358 for(j=0; j<64; j+)59 60 /根據(jù)亮度表,依次確定8個(gè)LED當(dāng)前狀態(tài),亮或滅61 for(k=0; k<8; k+)62 63 /以j為亮度級(jí)別,每個(gè)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).實(shí)現(xiàn)水滴變大效果,這段代碼的作用可用圖形表達(dá),如圖5:(原文件名:120611_4.png)圖5控制D1由暗變亮,用了64個(gè)亮度級(jí)別,每個(gè)級(jí)別發(fā)送64個(gè)脈沖。L2(49-81).實(shí)現(xiàn)水滴下落。代碼就不逐行解釋了,大家可根據(jù)注釋自己分析,主要說一下實(shí)現(xiàn)的方法。定義LED有8個(gè)亮度級(jí)別,若用開發(fā)板上的8個(gè)LED表示,如圖6:(原文件名:120
12、611_5.png)圖6圖中的紅色面積代表亮度程度。實(shí)現(xiàn)流水效果的方法就是:讓所有的亮度依次經(jīng)過在所有LED,如圖7:(原文件名:120611_6.png)圖7狀態(tài)的持續(xù)時(shí)間從0-15逐漸減小,以模擬水滴加速。下載驗(yàn)證:下載到開發(fā)板上,可以看到水滴下落效果。3.4 定時(shí)器產(chǎn)生PWM前面3個(gè)例子中,我們用循環(huán)語(yǔ)句雖然能產(chǎn)生占空比不同的PWM,但PWM的周期不好控制,對(duì)此,我們學(xué)習(xí)如何用定時(shí)器產(chǎn)生特定周期PWM。關(guān)于8051定時(shí)器的使用方法,大家可以參考例說51單片機(jī)的4章和5章。我們用定時(shí)器0產(chǎn)生PWM,代碼如下:程序清單L4 定時(shí)器0產(chǎn)生PWM1 #include <reg52.h>
13、;2 #include "hw_config.h"3 #include "my_type.h"456 /亮度級(jí)別表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 /使能獨(dú)立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 功 能:初始化定時(shí)器031 */32 void timer0_init(void)33 34 TMOD = 0x01; /運(yùn)行模式135 TH0 = 0xFF; /10us中斷36 TL0 = 0xFA;37 EA = 1; /開啟中斷38 ET0 = 1;39 TR0 = 1; /啟動(dòng)定時(shí)器4041 4243 /*44 函數(shù)名稱:timer0_overflow45 功 能:定時(shí)器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).初始化定時(shí)器0,沒10us產(chǎn)生一次中斷。
16、L4(55-65).控制輸出8組不同占空比的PWM。這段代碼功能和程序清單2中的功 能一致。下載驗(yàn)證:下載到開發(fā)板上,可以看到D1到D8亮度逐漸增大。3.5 亮度不同的點(diǎn)陣學(xué)習(xí)了用定時(shí)器產(chǎn)生PWM,我們可以控制更多的LED,比如LED點(diǎn)陣的亮度。下面的例子實(shí)現(xiàn)LED點(diǎn)陣每行的亮度都不同。程序清單5 亮度不同的點(diǎn)陣1 #include <reg52.h>2 #include "hw_config.h"3 #include "my_type.h"4 5 6 /亮度級(jí)別表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 /使能控制點(diǎn)陣的譯碼器15 LEDEN = 0;16 ADDR3 = 0;17 18 timer0_init();19 20 while(1)21 22 23 24 /*25 函數(shù)名稱:timer0_init26 功 能:初始化定時(shí)器027 */28 void timer0_init(void)29 30 TMOD = 0x01; /運(yùn)行模式131 TH0 = 0xFF; /中斷時(shí)間10us32 TL0 = 0xF733 EA = 1; /開啟中斷34 ET0 =
18、1;35 TR0 = 1; /啟動(dòng)定時(shí)器36 37 38 /*39 函數(shù)名稱:timer0_overflow40 功 能:定時(shí)器0溢出中斷41 */42 void timer0_overflow(void) interrupt TIMER0_OVERFLOW43 44 u8 i;45 u8 p1_value = 0;46 static u8 state = 0; /點(diǎn)陣狀態(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).初始化定時(shí)器,每10us中斷一次。L5(51-57).每中斷64次,點(diǎn)陣掃描移動(dòng)到下一行,用state記錄當(dāng)前行數(shù)。L5(59-66).掃描每一行輸出的PWM都不一樣,使用的方
20、式和處理獨(dú)立LED一致。L5(68-70).輸出點(diǎn)陣對(duì)應(yīng)的位碼。下載驗(yàn)證:下載到開發(fā)板上,可以看到運(yùn)行效果,點(diǎn)陣第一行最暗,越往下越亮。3.6 點(diǎn)陣模擬音樂頻譜分析效果在很多音樂播放軟件上,都有頻譜分析的圖形,如圖8:(原文件名:120611_7.png) 圖8我們用也可以模擬相似的圖形,代碼如下:程序清單6:點(diǎn)陣模擬音樂頻譜分析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 /亮度級(jí)別表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 /使能控制點(diǎn)陣的譯碼器35 LEDEN = 0;36 ADDR3 = 0;37 38 timer0_init();39 40 while(1)41 42 43 44 45 /*46 函數(shù)名稱:timer0_init47 功 能:初始化定時(shí)器048 */49 void timer0_init(void)50 51 TMOD = 0x01; /運(yùn)行模式152 TH0 = 0xFF; /10us中斷53 TL0 = 0xFA;54 EA = 1; /開啟中斷55 ET0 = 1;56 TR0 = 1; /啟動(dòng)定時(shí)器57 58 59 60 /*61 函數(shù)名稱:timer0_overflow62 功 能:定時(shí)器0溢出中斷63 */64 void ti
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人租房合同的(31篇)
- 2024-2025學(xué)年北京市房山區(qū)高一上學(xué)期期中考試歷史試卷
- 2025年公共設(shè)施配套建設(shè)項(xiàng)目房屋征收合同
- 2025年住宅銷售策劃合同模板規(guī)定
- 2025年官方離婚協(xié)議范本策劃(雙方同意版)
- 2025年全球貿(mào)易合同制定原則及合規(guī)要求解析
- 2025年債權(quán)轉(zhuǎn)讓與貸款合作協(xié)議
- 2025年車輛所有權(quán)變更策劃協(xié)議書模板
- 2025年農(nóng)村土地利用合作協(xié)議
- 2025年人事檔案授權(quán)委托協(xié)議
- 4地球-我們的家園《我們共同的責(zé)任》說課稿 -2023-2024學(xué)年道德與法治六年級(jí)下冊(cè)統(tǒng)編版
- 2024版房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)內(nèi)容解讀
- GB 21258-2024燃煤發(fā)電機(jī)組單位產(chǎn)品能源消耗限額
- 2024三農(nóng)新政策解讀
- 好書推薦——《三毛流浪記》
- 方菱F2100B中文系統(tǒng)說明書
- 人教版動(dòng)手動(dòng)腦學(xué)物理答案 八下
- 九宮格數(shù)獨(dú)題目(打印版)
- 內(nèi)燃機(jī)基本知識(shí)
- 2019.2青島版五四制五年級(jí)下冊(cè)數(shù)學(xué)教學(xué)計(jì)劃(附教學(xué)進(jìn)度表)
- Ⅲ類壓力容器風(fēng)險(xiǎn)評(píng)估報(bào)告樣本
評(píng)論
0/150
提交評(píng)論