標(biāo)題: 基于Proteus仿真的51單片機彩燈控制器源程序與詳細(xì)的實驗文檔 [打印本頁]

作者: 叁夢    時間: 2020-6-14 17:37
標(biāo)題: 基于Proteus仿真的51單片機彩燈控制器源程序與詳細(xì)的實驗文檔


(1)按下KEY1按鍵的時候,節(jié)日彩燈開啟(默認(rèn)從上到下)并且數(shù)碼管顯示當(dāng)前的模式和流轉(zhuǎn)時間間隔,再次按下的時候彩燈關(guān)閉。

(2)KEY2按鍵的功能實進行彩燈流轉(zhuǎn)模式的設(shè)置,彩燈總共有四種模式。模式一是從上到下移動著依次點亮,模式二是從下到到移動著依次點亮,模式三是先全部點亮,然后依次從上到下移動著依次熄滅,模式四是先全部點亮,然后依次從下到上移動著依次熄滅。

(3)當(dāng)節(jié)日彩燈亮著的時候按下KEY3進行彩燈流轉(zhuǎn)的時間間隔增加。初始值是0.5秒, 按一下增加0.5秒,加到最大值3秒就不能增加了。

(4)當(dāng)節(jié)日彩燈亮著的時候按下KEY4進行彩燈流轉(zhuǎn)的時間間隔減小。按一下KEY4減少0.5秒,減小到最小值0.5秒就不能減少了。

(5)數(shù)碼管第一位顯示當(dāng)前的模式,第二位是符號“-”,第三位和第四位表示當(dāng)前的流轉(zhuǎn)時間間隔,單位是秒。

三、總體設(shè)計方案

1.硬件設(shè)計說明

節(jié)日彩燈控制器的硬件模塊主要有四大部分組成:AT89C51單片機主控模塊,LED燈模塊,數(shù)碼管模塊、按鍵模塊。

AT89C51單片機主控模塊主要作用是通過控制小彩燈的點亮和熄滅,控制數(shù)碼管的顯示,采集按鍵的輸入情況。利用單片機自帶的定時器功能控制彩燈亮滅的時間。LED燈的作用就是亮和滅,各種顏色的小LED的亮滅就形成美麗的彩燈。按鍵的作用主要是控制小彩燈的流動的方向和流動的時間間隔。數(shù)碼管的作用是為了顯示當(dāng)前流轉(zhuǎn)的方向和流轉(zhuǎn)的時間間隔。

圖3.1仿真的電路圖

(1)AT89C51單片機主控的設(shè)計

AT89C51是一種功能強、靈活性高且價格合理的單片機,可方便的應(yīng)用于各種控制領(lǐng)域,并且它的設(shè)計也是比較簡單的,只需要一個晶振電路和一個復(fù)位電路便就可以使AT89C51單片機工作了。單片機這里使用的晶振電路頻率是12MHZ。單片機在這個頻率下工作比較穩(wěn)定、不容易出錯誤,下圖是單片機的設(shè)計電路圖。

圖3.2單片機主控芯片設(shè)計仿真圖

(2)LED燈的硬件設(shè)計

LED燈是一種低功耗、使用壽命高、亮度好,在生活中很多地方都能用到。

LED的本質(zhì)是發(fā)光二極管,我們只要正負(fù)極接上電源便能夠發(fā)光。單片機實現(xiàn)彩燈控制需要將LED的一端接到VCC5V電源,另一端接到單片機的管腳上面,單片機管腳是低電平的時候就能夠點亮。為了控制電流我們還需要再加一個限流電阻,電阻大小為1000Ω。LED彩燈部分電路圖如下所示:

圖3.3LED彩燈設(shè)計仿真圖

(3)按鍵的硬件設(shè)計

按鍵模塊在生活中也很常見,它是一種機械結(jié)構(gòu),當(dāng)按鍵按下的時候按鍵上方的金屬片就會和下方的金屬片接觸,這樣電路就形成了一種通路的狀態(tài)。我們將按鍵電路和單片機管腳連到一起,并在另一端接負(fù)極,當(dāng)按下按鍵的時候就會導(dǎo)通單片機管腳就會拉低。我們就判斷單片機的管腳的高低電平就能夠獲取按鍵的按下。按鍵部分電路如下圖所示:

圖3.4獨立按鍵彩燈設(shè)計仿真圖

(4)數(shù)碼管的硬件設(shè)計

數(shù)碼管的也是生活中用的比較多的模塊,它的設(shè)計電路也比較簡單。數(shù)碼管分為共陰和共陽兩種,共陰的就是對應(yīng)LED燈在低電平的時候會點亮,共陽的就是對應(yīng)LED燈在高電平的時候會點亮。數(shù)碼管分為段選控制和位選控制,段選就是控制LED的亮和滅組合出數(shù)字的圖形,位選控制是控制那一個數(shù)碼管點亮。數(shù)碼管的設(shè)計電路如下所示:

.

   圖3.5數(shù)碼管設(shè)計仿真圖

2.軟件設(shè)計說明

軟件設(shè)計的功能主要有:按鍵1控制彩燈開啟和關(guān)閉,按鍵2控制彩燈的流轉(zhuǎn)模式,按鍵3是增加彩燈的流轉(zhuǎn)時間間隔的,按鍵4是減少彩燈的流轉(zhuǎn)時間間隔的。彩燈開啟的時候數(shù)碼管第一位顯示當(dāng)前的流轉(zhuǎn)模式,第三位和第四位顯示當(dāng)前彩燈的流轉(zhuǎn)時間間隔。彩燈控制器軟件功能總流程圖如下所示:

圖3.6軟件功能總流程圖

(1)按鍵獲取的實現(xiàn)

按鍵的IO 接在單片機的P1^0~P1^4上,我們實時的掃描這四個端口,當(dāng)有一個端口電平被拉低了就延時10ms,再次判斷這個端口有沒有被拉低,如果還被拉低就可以確定按鍵按下了。按鍵獲取的流程圖如下:

圖3.7按鍵獲取流程圖

代碼如下所示


  1. uchar KeyScanf()
  2. {
  3. uchar keyvalue = 0;   //第幾個按鍵被按下的值
  4. if(KEY1 == 0)       //判斷按鍵有沒有被按下
  5. {
  6. Delay1ms(10);    //延時一段時間
  7. if(KEY1 == 0)    //再次判斷按鍵優(yōu)美按下
  8. {
  9. keyvalue = 1;
  10. }
  11. while(!KEY1);  //按鍵有沒有松開
  12. }
  13. return keyvalue;   //返回按鍵按下的值
  14. }
復(fù)制代碼


(2)彩燈開啟和關(guān)閉的軟件設(shè)計

彩燈的IO口接在了單片機的P2^0~P2^7管腳,所以在控制彩燈的時候我們可以直接對單片機的P2口進行操作,當(dāng)按鍵1被安下的時候彩燈開關(guān)標(biāo)志置1,然后對P2口P2口寫入P2=0x00;彩燈關(guān)閉操作是彩燈開關(guān)標(biāo)志置0,對P2口寫入P2=0xff;這樣就關(guān)閉了彩燈。彩燈開啟和關(guān)閉流程圖如下所示

圖3.8彩燈開啟和關(guān)閉流程圖

代碼如下所示:


  1. if(keyvalue == 1)            //按鍵1控制開關(guān)燈
  2. LEDSwitch = !LEDSwitch;  //開關(guān)燈標(biāo)志位改變
  3. if(LEDSwitch == 1){
  4. P2 = 0x00;   //點亮全部彩燈}
  5. else{
  6. P2 = 0xff;  //熄滅全部彩燈
  7. }
復(fù)制代碼


(3)彩燈模式控制軟件設(shè)計

彩燈有四種模式進行變化,我設(shè)計的時候定義了一個彩燈流轉(zhuǎn)方式的標(biāo)志位LEDMode有0到3四種模式,當(dāng)燈開啟并且按鍵2被按下那LEDMode就加1,加到4重新置為0。彩燈實現(xiàn)從上到下,從下到上的步驟是通過對0x01進行右移實現(xiàn)的,從上到下就右移0位,1位,2位然后取反對應(yīng)的位置就是0其他位置上都是1就實現(xiàn)了從上到下依次點亮,從下到上實現(xiàn)是和這一樣的,不過順序變成了7位,6位等等。彩燈模式控制流程圖如下所示:

圖3.9彩燈模式變化流程圖

實現(xiàn)代碼如下所示:

temp = 0x01;    //用于右移控制LED燈
if(LEDSwitch == 1)
{
if(LEDMode == 0)  //模式0 從上到下依次點亮
{
LED = ~(temp<<i); //點亮LED燈
i++;
if(i>8) i=0;      //控制移動的位數(shù)
}
if(LEDMode == 1)  //模式1 從下到上依次點亮
{
LED = ~(temp<<i); //點亮LED燈
i--;
if(i<0) i=8; //控制移動的位數(shù)
}

if(LEDMode == 2) //模式2 從上到下依次熄滅

{
LED = (temp<<i);
i++;
if(i>8) i=0;
}
if(LEDMode == 3) //模式2 從下到上依次熄滅
{
LED = (temp<<i);
i--;
if(i<0) i=8;
}
}


(4)彩燈間隔時間設(shè)置

間隔時間是設(shè)置了一個全局變量LEDTime,然后通過控制定時器來控制流轉(zhuǎn)時間的間隔。時間流轉(zhuǎn)默認(rèn)是0.5秒,按一下按鍵3加0.5秒,按一下按鍵4減0.5秒。最小時間間隔是0.5秒,最大是3秒。彩燈間隔時間設(shè)置流程圖如下圖所示:

圖3.10彩燈間隔時間設(shè)置流程圖

代碼如下所示:

//定時器是 10ms的定時器,一次10ms,加0.5s需要50次
if(keyvalue == 3)     //增加時間按鍵
{
LEDTime += 50;   //增加0.5秒
if(LEDTime >= 300); //最大3秒
LEDTime = 300;
}
else if(keyvalue == 4) // 減時間按鍵
{
LEDTime -= 50;  //減少0.5秒
if(LEDTime <=50) //最小0.5秒
LEDTime = 50;
}

(4)數(shù)碼管顯示的軟件實現(xiàn)
本文中的數(shù)碼管采用的是4位把段LED數(shù)碼管,數(shù)碼管第一位顯示的是當(dāng)前的模式,第二位顯示的是分隔符“-”,第三位和第四位一起組成當(dāng)前的彩燈流轉(zhuǎn)的間隔時間,流轉(zhuǎn)的間隔時間是以秒為單位最小是0.5秒。當(dāng)彩燈的模式和流轉(zhuǎn)時間改變了,數(shù)碼管的顯示也會隨著改變。數(shù)碼管的顯示原理是通過逐位掃描的方式,從第一位到第四位依次延時2ms,通過一個視覺的暫留,實現(xiàn)四個數(shù)碼管全部都亮的效果。數(shù)碼管顯示代碼如下所示:
if(LEDSwitch == 1)  //小彩燈打開
{
display(0,LEDMode);  //第一位顯示模式                           
display(1,13);       //顯示 -
display(2,LEDTime/100);  //顯示小點數(shù) 整數(shù)位
display(3,LEDTime/10%10);   //顯示小點數(shù)小數(shù)位
}
#define seg P3
//0-9 全亮 全滅 C
unsigned char code seg_wei[]  = {0x01,0x02,0x04,0x08};//位選表
//段選表
unsigned char code seg_duan[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00,0xff,0xc6,0xbf};
/*數(shù)碼管顯示函數(shù)*/
//flag:表示顯示的是哪一位
void display(uchar flag,uchar number)
{
seg = seg_wei[flag];
if(flag == 2)   //第三位顯示 出小點數(shù)
P0  = (seg_duan[number]&0x7f);
    else
P0  = seg_duan[number];  //其他正常正常顯示
    Delay1ms(2);    //延時2ms
}


四、成果展示圖

(1)彩燈的開啟和關(guān)閉

點擊按鍵1LED燈開始流轉(zhuǎn),數(shù)碼管顯示當(dāng)前的模式和流動的時間。

          

圖4.1彩燈開啟LED燈變化

     

圖4.2彩燈開啟數(shù)碼管的變化

(2)彩燈流轉(zhuǎn)模式的改變

彩燈有四個模式,模式1是從上到下依次移動點亮,模式2是從下到上依次移動點亮,模式3是從上到下依次移動熄滅,模式4是從下到上依次移動熄滅。

        

圖4.3彩燈模式0變化

       

圖4.4彩燈模式1變化

        

圖4.5彩燈模式2的變化

        

圖4.6彩燈模式3的變化

(3)彩燈時間間隔

時間間隔的調(diào)整,按鍵3增加時間間隔一次0.5秒,按鍵4減少時間間隔一次0.5秒。最大時間間隔3秒,最小時間間隔0.5秒。

      

圖4.7流轉(zhuǎn)時間間隔變化

、總結(jié)

在不斷學(xué)習(xí)中,終于完成了設(shè)計任務(wù)。通過本設(shè)計鍛煉了我們的實踐能力,也是對以后我們實際工作能力的訓(xùn)練和考察過程。現(xiàn)在是一個高科技的時代,單片機的應(yīng)用無處不在,這更堅定了我要學(xué)好單片機的決心。

本設(shè)計本身就比較簡單,整個設(shè)計的過程中每一步都是自己親自做過的,在經(jīng)過遇到問題,思索問題到解決問題的過程中,就連向別人請教的過程也是一種收獲,收獲是最多的。以往沒有注意到的問題,都在這一次的設(shè)計中得以體現(xiàn),這培養(yǎng)了我的細(xì)心,耐心和專心。我覺得能夠在這次的設(shè)計中學(xué)到很多的東西,以往不注意的細(xì)節(jié),在這一次中是必須讓自己去注意的。也是我這所學(xué)到知識的一個體現(xiàn)。我深深知道,每一次的學(xué)習(xí)實踐環(huán)節(jié)都是那么的來之不易,都是通過老師的深思熟慮后,才給我們定下目標(biāo)。然后讓我們在知識的海洋里翱翔,讓我們隨著年齡的增長不斷的擴充自己的知識領(lǐng)域,也逐漸成熟


全部資料51hei下載地址:

基于單片機的彩燈控制器.zip (1.59 MB, 下載次數(shù): 73)







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1