說明:本文是掃盲教程的進階,是上一篇點亮LED燈閃爍的升級版,LED流水燈也就是讓LED像水流一樣流動起來,也是單片機非常重要的一個實驗,是前兩種控制方式的結合,本文重在夯實基礎,如果是大神,請自覺飄過。
好了,我們繼續說回正題,單片機控制LED流水燈,這個其實比上一個點亮LED的實驗複雜一點點,硬體上就是多幾個LED, 其實他的控制原理並不複雜只要弄明白其中的原理,有好多問題就會融會貫通,下面我們從硬體和軟體兩個維度來深入剖析一下。希望你看完能有所收穫。
硬體方面
發光二極體:我前面幾篇文章都寫得很細,這裡同樣不多贅述了,其實流水燈就是LED按照一定規律和間隔時間來閃爍。
單片機:單片機的點亮和工作原理,這裡同樣省略,如果不明白請移步掃盲教程:51單片機控制單個LED燈閃爍 適合新手 下面我要重點和大家說一下控制部分,例如我要用流水方式點亮0到7八個LED燈,方式為從左往右每隔0.5S依次點亮,控制代碼的思路如下:首先單片機P0口輸出高電平,其他輸出低電平,然後計數器開始計時,計時到0.5S後,P1口輸出高電平,其他輸出低電平(即第二個燈點亮), 依次類推,當第八個燈滅後,又從第一個燈開始亮,周而復始循環下去,這就是流水燈的代碼思路,好了了解完以後,下面我們就要實戰了。
電路仿真原理圖如下
註:本實驗為降低難度,沒有用計數器而是用延時函數實現。
下面附上軟體參考代碼及詳細注釋
#include //51系列單片機定義文件
#define uchar unsigned char //定義無符號字符
#define uint unsigned int //定義無符號整數
void delay(uint); //聲明延時函數
void main(void) //主函數
{uint i;
uchar temp; //定義兩個變量, I,temp
while(1) //循環語句
{temp=0x01; //給變量賦出值 ,如果這段看不懂,請自行充電C語言內容
for(i=0;i<8;i++) //8個流水燈逐個閃動 FOR循環語句
{P1=~temp;
delay(100); //調用延時函數,也可以用計數器實現 ,改變此函數的值可以改變流水燈點亮間隔
temp<<=1; //左移 }
temp=0x80; //賦值
for(i=0;i<8;i++) //8個流水燈反向逐個閃動
{ P1=~temp; //給P1賦值
delay(100); //調用延時函數
temp>>=1; }
temp=0xFE; //給TEMP賦值FE
for(i=0;i<8;i++) //8個流水燈依次全部點亮
{P1=temp;
delay(100); //調用延時函數,改變此函數的值可以改變流水燈點亮間隔
temp<<=1; }
temp=0x7F; //下面開始反向點亮程序
for(i=0;i<8;i++) //8個流水燈依次反向全部點亮
{ P1=temp;
delay(100); //調用延時函數,改變此函數的值可以改變流水燈點亮間隔
temp>>=1; }
void delay(uint t) //定義延時函數
{register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++); }
下面是我拷入代碼後的實驗結果,實驗成果!為降低難度我去掉了反向點亮的部分代碼。
好了,看完了以上的文章,我想你應該明白這個實驗的軟硬體控制原理了吧,其實沒有多難,只要理解了原理,然後多動動手就行了 很輕鬆就會掌握,其實這個實驗效果最少有三種方法可以實現,如果你也感興趣自己動動手用其他代碼方式試一下吧!
最後如果有什麼問題或者建議請給我留言或者私信啊,看到一定第一時間回復,如果你喜歡我的文章,歡迎關注轉發評論哦,我們下期再見!
專注基礎,從軟硬體兩個角度,從零開始帶你探尋單片機的神秘世界!
想了解更多精彩內容,快來關注從零開始學單片機設計