找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3434|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)16led心形燈閃爍程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:619899 發(fā)表于 2021-12-19 14:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
控制要求:                                                      
    1. 用16盞小燈實現(xiàn)燈光變換,若有需要可另添加;              
    2.可以用輸入按鈕在幾種燈光效果間切換;                     
    3. 可以通過暫停按鈕暫停彩燈效果,使小燈全亮,再按下后繼續(xù)之前效果;                                                                                                            
    4.自動、手動兩種模式,并通過按鈕可以在這兩個模式之間切換。模式說明:順時針逐一點亮、逆時針逐一點亮、奇偶交替點亮閃爍、順時針逐一點亮、順時針逐一熄滅、逆時針逐一點亮、逆時針逐一熄滅 、對角順序點亮、對角倒序點亮、二進(jìn)制加法點亮。                                                                                                                                                                                                           
    設(shè)計要求:                                                  
    本設(shè)計由16個發(fā)光二極管組成燈光電路,并且呈現(xiàn)心形樣式,設(shè)計其中工作模式不少五種并由定時中斷控制自由變化,并顯示第幾種燈光效果。

硬件電路設(shè)計

LED燈顯示模塊(如圖2-1)

圖3-1LED燈顯示模塊

類型顯示模塊(如圖2-2)

圖3-2類型顯示模塊


按鍵顯示模塊(如圖2-3)

圖3-3按鍵顯示模塊


時鐘控制模塊(如圖2-4)

圖3-4時鐘控制模塊


總體電路(如圖2-5)

圖3-5總體電路


4軟件設(shè)計4.1軟件設(shè)計思路

流水燈采用的是發(fā)光二極管(Light-Emitting Diode),簡稱LED,是一種將電能轉(zhuǎn)換為光能的半導(dǎo)體器件,具有體積小、耗電低的優(yōu)點,常被用作微型計算機(jī)與數(shù)字電路的輸出裝置。當(dāng)LED兩端加上一定的正向電壓,使之流過一定的工作電流就會發(fā)光,其亮度隨流過的電流增加而增加,但電流過大LED的壽命也將縮短。普通LED正向電流一般為5~20mA。由于51的I/0是弱上拉的方式,在輸出高電平時,只能輸出幾十微安的電流,而在輸出低電平時,I/0最大可以輸入幾十毫安的電流。所以,通常采用灌電流的方式,即電流從電源經(jīng)LED流向I/0口。為了不讓流過LED的電流太大而把它燒壞,還得串上限流電阻R,當(dāng)P0和P2口輸出高電平(+5V)時,LED兩端沒有電壓降,所以熄滅:當(dāng)P0和P2口輸出低電平(即P0/P2=0)時,LED正向?qū)òl(fā)光。此時LED兩端電壓VD約為1.7V.則限流電阻R兩端將存在3.3V(即5-1.7=3.3V)。查閱AT89C5l技術(shù)手冊后發(fā)現(xiàn),單個I/0口的輸入電流不能超過10mA:P0口的輸入電流總和不能超過26mA;P1、P2、P3的輸入電流總和不能超過15mA;所有I/0口的輸入電流總和不能超過71mA。                                             

4.2軟件設(shè)計流程

燈光控制設(shè)計:

  • 用16盞小燈實現(xiàn)燈光變換,若有需要可另添加。
  • 可以用輸入按鈕在幾種燈光效果間切換。
  • 可以通過暫停按鈕暫停彩燈效果,使小燈全亮,再次按下后繼續(xù)之前效果。
  • 自動、手動兩種模式,并通過按鈕可以在這兩個模式之間切換。
  • 至少有九種燈光模式,閃爍時顯示種類。

主程序框圖

圖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;
//函數(shù)名稱:定時中斷函數(shù)
//函數(shù)功能:在時間判定后,更新數(shù)碼管顯示
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)
{
//函數(shù)名稱:主函數(shù)
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();
}
}
函數(shù)名稱:displayLed
函數(shù)功能:LED燈的顯示,共有十種變化,分別為順時針逐一點亮、逆時針逐一點亮、奇偶交替點亮閃爍、順時針逐一點亮、順時針逐一熄滅、逆時針逐一點亮、逆時針逐一熄滅 、對角順序點亮、對角倒序點亮、二進(jìn)制加法點亮。                                                                                                                                 
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電路仿真調(diào)試

      

5-1  燈光控制設(shè)計

5-2  燈光控制設(shè)計仿真圖


結(jié)論

1、對于該設(shè)計是以AT-89C51單片機(jī)為主控芯片,通過程序控制彩燈流水花樣。本文所給程序?qū)崿F(xiàn)的功能比較簡單,旨在拋磚引玉,可以在此基礎(chǔ)上擴(kuò)展成更復(fù)雜的彩燈控制,比如鍵盤控制流水花樣、控制流水燈顯示數(shù)字或圖案等等。通過花樣彩燈的制作,給我最大的體會是對一個程序整體的把握和控制,只有將子程序有效的結(jié)合起來,才能完成設(shè)計的目的。另外,在程序的調(diào)試過程中,我也遇到了很多意想不到的困難


本人初學(xué),僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬
以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便大家保存,切勿照搬):
燈光控制設(shè)計.docx (255.76 KB, 下載次數(shù): 11)

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表