您好,登錄后才能下訂單哦!
WLGK-51單片機接口技術(shù)基礎(chǔ)實驗
——LED流水燈
當(dāng)我們已經(jīng)明白了LED燈的基本特性,我們就會對街頭上五光十色的LED燈的技術(shù)原理了然于胸。有小伙伴說,LED的使用感覺還是不太過癮,那么今天阿甘老師將帶領(lǐng)大家來實現(xiàn)一個LED的小應(yīng)用—LED流水燈。
快來感受一下吧,技術(shù)的世界里,其樂無窮!
萬立高科官網(wǎng):www.wanligaoke.com
萬立高科官方商城:http://www.wlgkbj.com
萬立高科淘寶直銷店鋪:https://robot-ds.taobao.com
萬立高科-單片機技術(shù)交流群:477250411
掌握以下方法:
1.掌握在實際使用環(huán)境下,如何配合硬件原理圖實現(xiàn)LED流水燈程序的編寫;
2.掌握如何將編譯生成的可執(zhí)行文件LED.HEX文件下載到單片機并運行起來看到試驗效果
1.個人微機一臺:Windows操作系統(tǒng)(Win xp或者win7均可以);
2.Keil 4集成開發(fā)環(huán)境;
3.串口下載線一根;
4.WLGK-51ZC開發(fā)板。
在做學(xué)習(xí)這個試驗之前,我首先給大家講一下什么叫LED流水燈??它是一個什么樣的效果:顧名思義,多個LED燈點亮的效果好像流水一樣在流。再具體一點:比如現(xiàn)在有8路LED燈并排,如果每次只點亮1個LED燈,那么效果就應(yīng)該是:每次正好點亮相鄰的一個LED燈,而其他燈熄滅。
下面我們將沿著這個思路一步一步帶你實現(xiàn)這個過程和現(xiàn)象。具體的可以拆分成下面幾步:
首先我們學(xué)習(xí)在系統(tǒng)上電后如何點亮1個LED燈,而其他LED燈熄滅;
然后我們學(xué)習(xí)將8路LED燈都按照這個效果依次實現(xiàn),并循環(huán)起來;
這里我們可以看到“WLGK-51ZC開發(fā)板”中共有8路LED燈。這8路是并列的,也就是說我們學(xué)會控制一路LED燈,就可以學(xué)會控制8路LED燈。
LED點亮的條件:當(dāng)陽極與陰極之間電壓的壓降到達一定參考值時,LED就會發(fā)光點亮,下面是一個壓降的參考值。這里我們可以看到上圖VCC在JP4端子用短線帽接上后,電壓為5V,然后每一路LED串聯(lián)了一個電阻(排阻),這個LED兩端的壓降(LED陽極電壓-LED陰極電壓)只要滿足下面的值,就可以點亮。
所以我們當(dāng)我們給P00端0V的電壓的時候,經(jīng)過二極管的電流就可以點亮LED。
我們先來實驗一下控制P00路LED燈(D2)亮,其他路燈(D3-D9)熄滅。
OK,下面看一下完整的程序:
/****************************************************************** * * WLGK-51ZC開發(fā)板接口技術(shù)基礎(chǔ)實驗-LED流水燈-演示程序 * * 版本: V1.0 (2015/9/27) * 作者: 阿甘 (單片機技術(shù)交流群:477250411 ) * 網(wǎng)站: www.wanligaoke.com(萬立高科) * * ******************************************************************/
#include<reg52.h> /***************************************************************** 第一行是一個"文件包含"處理。 所謂"文件包含"是指一個文件將另外一個文件的內(nèi)容全部包含進來 這里的程序雖然只有短短幾行,但C編譯器在處理的時候卻要處理幾十或幾百行 *******************************************************************/ sbit dat0=P0^0; //定義IO口,P00對應(yīng)的IO控制口 sbit dat1=P0^1; //定義IO口,P01對應(yīng)的IO控制口 sbit dat2=P0^2; //定義IO口,P02對應(yīng)的IO控制口 sbit dat3=P0^3; //定義IO口,P03對應(yīng)的IO控制口 sbit dat4=P0^4; //定義IO口,P04對應(yīng)的IO控制口 sbit dat5=P0^5; //定義IO口,P05對應(yīng)的IO控制口 sbit dat6=P0^6; //定義IO口,P06對應(yīng)的IO控制口 sbit dat7=P0^7; //定義IO口,P07對應(yīng)的IO控制口
void delay02s(void) //約延時0.2秒子程序 { unsigned char i,j,k; //定義3個無符號字符型數(shù)據(jù)。 for(i=20;i>0;i--)//作循環(huán)延時 { for(j=20;j>0;j--) { for(k=240;k>0;k--); } } }
void main(void) //每一個C語言程序有且只有一個主函數(shù), { while(1) //循環(huán)條件永遠為真,以下程序一直執(zhí)行下去。 { dat0=0; // I/O口P0.0輸出高電平,小燈點亮。 dat1=1; // I/O口P0.0輸出高電平,小燈點滅。 dat2=1; // I/O口P0.0輸出高電平,小燈點滅。 dat3=1; // I/O口P0.0輸出高電平,小燈點滅。 dat4=1; // I/O口P0.0輸出高電平,小燈點滅。 dat5=1; // I/O口P0.0輸出高電平,小燈點滅。 dat6=1; // I/O口P0.0輸出高電平,小燈點滅。 dat7=1; // I/O口P0.0輸出高電平,小燈點滅。
delay02s(); //延時經(jīng)過0.2秒。
//這里加上全部熄滅的控制,主要是為了效果觀察更明顯 dat0=1; // I/O口P0.0輸出高電平,小燈點亮。 dat1=1; // I/O口P0.0輸出高電平,小燈點滅。 dat2=1; // I/O口P0.0輸出高電平,小燈點滅。 dat3=1; // I/O口P0.0輸出高電平,小燈點滅。 dat4=1; // I/O口P0.0輸出高電平,小燈點滅。 dat5=1; // I/O口P0.0輸出高電平,小燈點滅。 dat6=1; // I/O口P0.0輸出高電平,小燈點滅。 dat7=1; // I/O口P0.0輸出高電平,小燈點滅。
while(1); //程序停止在這里,不再往下循環(huán) } } |
實現(xiàn)現(xiàn)象:LED燈D2常亮,其他LED燈(D3-D9)熄滅。即已經(jīng)達到了我們的實現(xiàn)目的。
多步控制LED燈,怎么控制了?小伙伴很容易就容易聯(lián)想到將上面的代碼復(fù)制一下稍作修改就可以完成了:
/****************************************************************** * * WLGK-51ZC開發(fā)板接口技術(shù)基礎(chǔ)實驗-LED流水燈-演示程序 * * 版本: V1.0 (2015/9/27) * 作者: 阿甘 (單片機技術(shù)交流群:477250411 ) * 網(wǎng)站: www.wanligaoke.com(萬立高科) * * ******************************************************************/
#include<reg52.h> /***************************************************************** 第一行是一個"文件包含"處理。 所謂"文件包含"是指一個文件將另外一個文件的內(nèi)容全部包含進來 這里的程序雖然只有短短幾行,但C編譯器在處理的時候卻要處理幾十或幾百行 *******************************************************************/ sbit dat0=P0^0; //定義IO口,P00對應(yīng)的IO控制口 sbit dat1=P0^1; //定義IO口,P01對應(yīng)的IO控制口 sbit dat2=P0^2; //定義IO口,P02對應(yīng)的IO控制口 sbit dat3=P0^3; //定義IO口,P03對應(yīng)的IO控制口 sbit dat4=P0^4; //定義IO口,P04對應(yīng)的IO控制口 sbit dat5=P0^5; //定義IO口,P05對應(yīng)的IO控制口 sbit dat6=P0^6; //定義IO口,P06對應(yīng)的IO控制口 sbit dat7=P0^7; //定義IO口,P07對應(yīng)的IO控制口
void delay02s(void) //約延時0.2秒子程序 { unsigned char i,j,k; //定義3個無符號字符型數(shù)據(jù)。 for(i=20;i>0;i--)//作循環(huán)延時 { for(j=20;j>0;j--) { for(k=240;k>0;k--); } } }
void main(void) //每一個C語言程序有且只有一個主函數(shù), { while(1) //循環(huán)條件永遠為真,以下程序一直執(zhí)行下去。 { dat0=0; // I/O口P0.0輸出高電平,小燈點亮。 dat1=1; // I/O口P0.0輸出高電平,小燈點滅。 dat2=1; // I/O口P0.0輸出高電平,小燈點滅。 dat3=1; // I/O口P0.0輸出高電平,小燈點滅。 dat4=1; // I/O口P0.0輸出高電平,小燈點滅。 dat5=1; // I/O口P0.0輸出高電平,小燈點滅。 dat6=1; // I/O口P0.0輸出高電平,小燈點滅。 dat7=1; // I/O口P0.0輸出高電平,小燈點滅。 delay02s(); //延時經(jīng)過0.2秒。
dat0=1; dat1=0; dat2=1; dat3=1; dat4=1; dat5=1; dat6=1; dat7=1; delay02s(); //延時經(jīng)過0.2秒。
dat0=1; dat1=1; dat2=0; dat3=1; dat4=1; dat5=1; dat6=1; dat7=1; delay02s(); //延時經(jīng)過0.2秒。
dat0=1; dat1=1; dat2=1; dat3=0; dat4=1; dat5=1; dat6=1; dat7=1; delay02s(); //延時經(jīng)過0.2秒。
dat0=1; dat1=1; dat2=1; dat3=1; dat4=0; dat5=1; dat6=1; dat7=1; delay02s(); //延時經(jīng)過0.2秒。
dat0=1; dat1=1; dat2=1; dat3=1; dat4=1; dat5=0; dat6=1; dat7=1; delay02s(); //延時經(jīng)過0.2秒。
dat0=1; dat1=1; dat2=1; dat3=1; dat4=1; dat5=1; dat6=0; dat7=1; delay02s(); //延時經(jīng)過0.2秒。
dat0=1; dat1=1; dat2=1; dat3=1; dat4=1; dat5=1; dat6=1; dat7=0; delay02s(); //延時經(jīng)過0.2秒。
//這里注釋掉停頓,單片機就會循環(huán)執(zhí)行程序指令 //while(1); //程序停止在這里,不再往下循環(huán) } } |
通過上面的兩個例子我們發(fā)現(xiàn)單片機程序?qū)懫饋聿⒉皇俏覀兿胂蟮哪敲蠢щy,如果調(diào)試不出結(jié)果怎么辦?加1個while(1);語句就可以調(diào)試,這是很簡單實用的辦法,當(dāng)然更高級的就是單步調(diào)試和仿真器,大家可以自行研究下,我們只要掌握了它的本質(zhì),萬變不離其宗。
但是我們感覺上面的程序雖然邏輯上十分簡單明了,寫起來還挺費勁的…嗯,的確是這樣,有兩種方式:
第一種方式:我們將LED燈的編號控制寫成一個函數(shù),即一個模塊,這個是一種思路,這個隨著大家軟件編程能力的提高,自然而然的會掌握;我不在這里單獨給大家講。
第二種方式:是LED燈的另外一種控制方式,準(zhǔn)備的說是單片機的IO還可以有另外一種控制方式:除了我們在LED閃爍燈實驗里降到的位控制(sbit),還有字節(jié)控制方式,一次就可以控制8位IO口,也就是說可以一次控制8路LED燈。
阿甘老師給出參考程序如下,大家仔細(xì)體會一下:
/****************************************************************** * * WLGK-51ZC開發(fā)板接口技術(shù)基礎(chǔ)實驗-LED流水燈-演示程序 * * 版本: V1.0 (2015/9/27) * 作者: 阿甘 (單片機技術(shù)交流群:477250411 ) * 網(wǎng)站: www.wanligaoke.com(萬立高科) * * ******************************************************************/
#include<reg52.h> /***************************************************************** 第一行是一個"文件包含"處理。 所謂"文件包含"是指一個文件將另外一個文件的內(nèi)容全部包含進來 這里的程序雖然只有短短幾行,但C編譯器在處理的時候卻要處理幾十或幾百行 *******************************************************************/
void delay02s(void) //約延時0.2秒子程序 { unsigned char i,j,k; //定義3個無符號字符型數(shù)據(jù)。 for(i=20;i>0;i--)//作循環(huán)延時 { for(j=20;j>0;j--) { for(k=240;k>0;k--); } } }
void main(void) //每一個C語言程序有且只有一個主函數(shù), { while(1) //循環(huán)條件永遠為真,以下程序一直執(zhí)行下去。 { P0 = 0xfe; //即十六進制的0xfe對應(yīng)二進制11111110 delay02s(); //延時經(jīng)過0.2秒。
//這里加上全部熄滅的控制,主要是為了效果觀察更明顯 P0 = 0xff; //即十六進制的0xfe對應(yīng)二進制11111111
while(1); //程序停止在這里,不再往下循環(huán) } } |
很簡單吧:這里阿甘老師要提醒大家的是P0的P一定要大寫,這個是在頭文件里面標(biāo)注的一個單片機寄存器標(biāo)號。
好的,下面大家自己將這個程序改成流水燈的效果,程序的編寫邏輯是一致的。
好了,到這里了,相信小伙伴對LED的使用十分熟練了,留給大家一個任務(wù):
任務(wù):如何實現(xiàn)2路或多路LED的流水效果?? |
這應(yīng)該是一個很簡單的任務(wù),但是大家一定要動手去做看到效果,做IT行業(yè)什么作重要,嗯,邏輯能力的確很重要,但要想爬上高山,努力和實踐最為重要,我們應(yīng)該從一開始就養(yǎng)成一個實干的態(tài)度,不要紙上談兵。
萬立高科-阿甘老師 感謝您的參與,精彩一路相隨?。?!
萬立高科官網(wǎng):www.wanligaoke.com
萬立高科官方商城:http://www.wlgkbj.com
萬立高科淘寶直銷店鋪:https://robot-ds.taobao.com
萬立高科單片機技術(shù)交流群:477250411
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。