控制要求:
1. 用16盞小燈實現燈光變換,若有需要可另添加;
2.可以用輸入按鈕在幾種燈光效果間切換;
3. 可以通過暫停按鈕暫停彩燈效果,使小燈全亮,再按下后繼續之前效果;
4.自動、手動兩種模式,并通過按鈕可以在這兩個模式之間切換。模式說明:順時針逐一點亮、逆時針逐一點亮、奇偶交替點亮閃爍、順時針逐一點亮、順時針逐一熄滅、逆時針逐一點亮、逆時針逐一熄滅 、對角順序點亮、對角倒序點亮、二進制加法點亮。
設計要求:
本設計由16個發光二極管組成燈光電路,并且呈現心形樣式,設計其中工作模式不少五種并由定時中斷控制自由變化,并顯示第幾種燈光效果。
硬件電路設計LED燈顯示模塊(如圖2-1) 
圖3-1LED燈顯示模塊 類型顯示模塊(如圖2-2) 
圖3-2類型顯示模塊
按鍵顯示模塊(如圖2-3) 圖3-3按鍵顯示模塊
時鐘控制模塊(如圖2-4) 圖3-4時鐘控制模塊
總體電路(如圖2-5)圖3-5總體電路
4軟件設計4.1軟件設計思路流水燈采用的是發光二極管(Light-Emitting Diode),簡稱LED,是一種將電能轉換為光能的半導體器件,具有體積小、耗電低的優點,常被用作微型計算機與數字電路的輸出裝置。當LED兩端加上一定的正向電壓,使之流過一定的工作電流就會發光,其亮度隨流過的電流增加而增加,但電流過大LED的壽命也將縮短。普通LED正向電流一般為5~20mA。由于51的I/0是弱上拉的方式,在輸出高電平時,只能輸出幾十微安的電流,而在輸出低電平時,I/0最大可以輸入幾十毫安的電流。所以,通常采用灌電流的方式,即電流從電源經LED流向I/0口。為了不讓流過LED的電流太大而把它燒壞,還得串上限流電阻R,當P0和P2口輸出高電平(+5V)時,LED兩端沒有電壓降,所以熄滅:當P0和P2口輸出低電平(即P0/P2=0)時,LED正向導通發光。此時LED兩端電壓VD約為1.7V.則限流電阻R兩端將存在3.3V(即5-1.7=3.3V)。查閱AT89C5l技術手冊后發現,單個I/0口的輸入電流不能超過10mA:P0口的輸入電流總和不能超過26mA;P1、P2、P3的輸入電流總和不能超過15mA;所有I/0口的輸入電流總和不能超過71mA。 4.2軟件設計流程燈光控制設計: - 用16盞小燈實現燈光變換,若有需要可另添加。
- 可以用輸入按鈕在幾種燈光效果間切換。
- 可以通過暫停按鈕暫停彩燈效果,使小燈全亮,再次按下后繼續之前效果。
- 自動、手動兩種模式,并通過按鈕可以在這兩個模式之間切換。
- 至少有九種燈光模式,閃爍時顯示種類。
主程序框圖 
圖4-1 4.3軟件程序
#include <reg51.h>
#define false 0
#define true 1
#define uchar unsigned char
#define uint unsigned int
sbit pause_key=P3^0;
sbit auto_key= P3^1;
sbit change_key=P3^2;
sbit pauseLed=P3^6;
sbit autoLed = P3^7;
uint ledCode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint ledCode2[8]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
void displayLed (void);
void keyScan(void);
void Delay10ms(unsigned int n);
bit isPause = false;
bit isAuto = true;
bit isChange= false;
uchar time;
uchar a,flag,types;
uint counts;
//函數名稱:定時中斷函數
//函數功能:在時間判定后,更新數碼管顯示
void T0_INT(void) interrupt 1
{
TL0=(65536-50000)/256;
TH0=(65536-50000)%256;
time ++;
if (time>=10)
{
time=0;
if(isChange==true)
{
counts=0;
types++;
if(types>9)types=0;
P0=disCode[types];
isChange=false;
}
displayLed();
counts ++;
}
}
void main(void)
{
//函數名稱:主函數
TMOD=0x61;//0110 0001//方式一
TL0=(65536-50000)/256;//50ms
TH0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
time=0;
counts=0;
types=0;
pauseLed=0;
P0=disCode[types];
while(1)
{
keyScan();
}
}
函數名稱:displayLed
函數功能:LED燈的顯示,共有十種變化,分別為順時針逐一點亮、逆時針逐一點亮、奇偶交替點亮閃爍、順時針逐一點亮、順時針逐一熄滅、逆時針逐一點亮、逆時針逐一熄滅 、對角順序點亮、對角倒序點亮、二進制加法點亮。
void displayLed(void)
{
switch(types)
{
case 0:
{
if(counts>=16)counts=0;
if(counts>=15)
{
if(isAuto==true) isChange=true;
}
if(counts <8)
{
P1=0xff;
P2=ledCode[7-counts];
}
else
{
P1=ledCode[15-counts];
P2=0xff;
}
break;
}
case 1:
{
if(counts >=16)counts=0;
if(counts >=15)
if(isAuto==true)isChange=true;
}
if(counts<8)
{
P1=ledCode[counts];
P2=0xff;
}
else
{
P1=0xff;
P2=ledCode[counts-8];
}
break;
case 2:
{
if(counts>=16)counts=0;
if(counts>=15)
{
if(isAuto==true) isChange=true;
}
if(counts%2==0)
{
P1=0xaa;
P2=0xaa;
}
else
{
P1=0x55;
P2=0x55;
}
break;
case 3:
{
if (counts>=17) counts=0;
if(counts<8)
{
P1=~ledCode2[7-counts];
P2=0xff;
}
else if(counts <16)
{
P1=0x00;
P2=~ledCode2[15-counts];
}
else//全亮
{
P1=0x00;
P2=0x00;
if(isAuto==true)isChange=true;
}
break;
}
case 4:
{
if(counts>=17)counts=0;
if(counts<8)
{
P1=ledCode2[7-counts];
P2=0x00;
}
else if(counts<16)
{
P1=0xff;
P2=ledCode2[15-counts];
}
else//全滅
{
P1=0xff;
P2=0xff;
if(isAuto==true) isChange=true;
}
break;
}
case 5:
{
if(counts>=17)counts=0;
if(counts <8)
{
P1=0xff;
P2=ledCode2[counts];}
else if(counts<16)
{
P1= ledCode2[counts-7];
P2=0x00;
}
else
{
P1=0x00;
P2=0x00;
if(isAuto==true)isChange=true;
}
break;}
case 6:
{
if(counts>=17)counts=0;
if(counts<8)
{
P1=0x00;
P2=~ledCode2[counts];
}
else if(counts <16)
{
P1=~ledCode2[counts-7];
P2=0xff;
}
else
{
P1=0xff;
P2=0xff;
if(isAuto==true) isChange=true;
}
break;
}
case 7:
{
if(counts>=8)counts=0;
if(counts>=7){
if(isAuto==true)isChange=true;}
P1=ledCode[7-counts];
P2=ledCode[7-counts];
break;
}
case 8:
{
if(counts>=8)counts=0;
if(counts>=7)
{
if(isAuto==true)isChange=true;
}
P1=ledCode[counts];
P2=ledCode[counts];
break;
}
case 9:
{
if(counts>=255)counts=0;
if(counts==254&& isAuto==true)isChange=true;
P1=~counts;
P2=~counts;
break;
}
default:types=0;
P0=disCode[types];
}
}
}
void Delay10ms(uint n)
{
uchar a, b;
for(;n>0;n--)
{
for(b=38;b>0;b--)
{
for(a=130;a>0;a--);
}
}
}
5電路仿真調試  圖5-1 燈光控制設計 圖5-2 燈光控制設計仿真圖
結論 1、對于該設計是以AT-89C51單片機為主控芯片,通過程序控制彩燈流水花樣。本文所給程序實現的功能比較簡單,旨在拋磚引玉,可以在此基礎上擴展成更復雜的彩燈控制,比如鍵盤控制流水花樣、控制流水燈顯示數字或圖案等等。通過花樣彩燈的制作,給我最大的體會是對一個程序整體的把握和控制,只有將子程序有效的結合起來,才能完成設計的目的。另外,在程序的調試過程中,我也遇到了很多意想不到的困難
本人初學,僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬
以上圖文的Word格式文檔下載(內容和本網頁上的一模一樣,方便大家保存,切勿照搬):
燈光控制設計.docx
(255.76 KB, 下載次數: 11)
2021-12-19 14:52 上傳
點擊文件名下載附件
|