標(biāo)題: 基于51單片機(jī)的七彩呼吸燈protues仿真+程序keil5 [打印本頁(yè)]

作者: 1543330241    時(shí)間: 2021-7-10 09:44
標(biāo)題: 基于51單片機(jī)的七彩呼吸燈protues仿真+程序keil5
(1) 起始狀態(tài)時(shí),8個(gè)燈處于同頻率呼吸狀態(tài)。
(2) 按鍵1按下時(shí),1號(hào)到8號(hào)依次由亮到暗呼吸
(3) 按鍵2按下時(shí),1號(hào)到8號(hào)依次由暗到亮呼吸。
4)按鍵3按下時(shí),恢復(fù)起始亮法。
由于是在仿真中,需要加入驅(qū)動(dòng)電路才能看出來(lái)“呼吸”的效果,否則只能看到燈在閃爍。
做實(shí)物時(shí)不需要加驅(qū)動(dòng)電路,直接連接單片機(jī)就可以看出來(lái)那種效果。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #define MAX 0x40   //定時(shí)上限定義
  3. #define MIN 0x00   //定時(shí)下限定義
  4. #define TIMELINE 10         //時(shí)間分頻常數(shù)
  5. #define TRUE  1
  6. #define FALSE 0             //標(biāo)志位常數(shù)
  7. sbit s1 = P2^0;
  8. sbit s2 = P2^1;
  9. sbit s3 = P2^2;
  10. unsigned int TimeCounter;
  11. bit ArrowFlg = 0;         //方向標(biāo)志位
  12. unsigned char upCounter,downCounter;    //增加計(jì)數(shù)器和減少計(jì)數(shù)器
  13. unsigned char table1[] = {0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff} ;
  14. unsigned char table2[] = {0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00} ;
  15. unsigned char k=0,j=-1;
  16. char key1,key=3;
  17. char keyscan()
  18. {
  19.         if(s1==0){while(!s1);key=1;}
  20.         if(s2==0){while(!s2);key=2;}
  21.         if(s3==0){while(!s3);key=3;}
  22.         return key;
  23. }
  24. //T0的中斷服務(wù)子函數(shù)
  25. void T0Deal() interrupt 1
  26. {
  27.         TH0=0xf1;
  28.         TL0=0xf1;
  29.         TR0=1;
  30.         TimeCounter++;  //定時(shí)計(jì)數(shù)器增加
  31.         if(TimeCounter == TIMELINE)
  32.         {
  33.                 if(key1==1)
  34.                 {
  35.                   upCounter++;
  36.             downCounter--;
  37.                   if((upCounter == MAX)&&(downCounter == MIN))
  38.                   {
  39.                            upCounter = MIN;
  40.                                 downCounter = MAX;     //計(jì)數(shù)器初始化
  41.                                 k++;if(k>=9)k=0;
  42.                   }
  43.                 }
  44.                 if(key1==2)
  45.                 {
  46.                   upCounter--;
  47.             downCounter++;
  48.                   if((upCounter == MIN)&&(downCounter == MAX))
  49.                   {
  50.                            upCounter = MAX;
  51.                                 downCounter = MIN;     //計(jì)數(shù)器初始化
  52.                                 j++;if(j>=9)j=0;
  53.                   }
  54.                 }
  55.                 if(key==3)
  56.                 {
  57.                         if((upCounter == MAX)&&(downCounter == MIN))  //計(jì)數(shù)方向標(biāo)志位切換
  58.                     {
  59.                       ArrowFlg = FALSE;
  60.                     }
  61.                         if((upCounter == MIN)&&(downCounter == MAX))
  62.                     {
  63.                       ArrowFlg= TRUE;
  64.                     }
  65.                         if(ArrowFlg == 1)   //如果是增加計(jì)數(shù)
  66.                     {
  67.                       upCounter++;
  68.                       downCounter--;
  69.                     }
  70.                                 else               //如果是減少計(jì)數(shù)
  71.                     {
  72.                       upCounter--;
  73.                       downCounter++;
  74.                     }
  75.                 }
  76.                         TimeCounter=0;
  77.         }
  78. }
  79. //延時(shí)函數(shù)
  80. void Delay(unsigned int i)
  81. {
  82.         unsigned int j;
  83.         while(i--)
  84.         {
  85.                 for(j=0;j<32;j++);     //延時(shí)
  86.         }
  87. }
  88. void main()
  89. {
  90.         upCounter = MIN;
  91.         downCounter = MAX;     //計(jì)數(shù)器初始化
  92.         TMOD = 0x01;          //設(shè)置定時(shí)器工作方式1
  93.         TH0 = 0xF0;
  94.         TL0 = 0xF0;          //T0初始化值
  95.         EA = 1;
  96.         ET0 = 1;              //開(kāi)中斷
  97.         TR0 = 1;              //啟動(dòng)T0
  98.         while(1)
  99.         {
  100.           key1=keyscan();
  101.           if(key1==1){P1= table1[k-1];Delay(downCounter);P1=table1[k];   Delay(upCounter);}
  102.           if(key1==2){P1=table2[j];   Delay(downCounter);P1=table2[j-1]; Delay(upCounter); }
  103.           if(key1==3){P1=0x00;        Delay(downCounter);P1=0xff;        Delay(upCounter);}
  104.         }
  105. }
復(fù)制代碼

所有資料51hei提供下載:
七彩呼吸燈.zip (118.5 KB, 下載次數(shù): 127)


作者: sonique0371    時(shí)間: 2021-11-6 08:11
無(wú)論哪個(gè)按鍵,LED都不亮
作者: dyx811    時(shí)間: 2021-11-7 20:39
可以達(dá)到預(yù)期效果。謝謝分享
作者: hdhdh    時(shí)間: 2021-11-8 08:44
樓主可以發(fā)表下所用的器件嗎各種


作者: PPHH    時(shí)間: 2023-4-9 20:47
sonique0371 發(fā)表于 2021-11-6 08:11
無(wú)論哪個(gè)按鍵,LED都不亮

我也是,請(qǐng)問(wèn)一下,你有解決嗎
作者: heicad    時(shí)間: 2023-4-10 05:07
PPHH 發(fā)表于 2023-4-9 20:47
我也是,請(qǐng)問(wèn)一下,你有解決嗎

用Proteus8.13版本打開(kāi)可以 你看我打開(kāi)的效果

51hei.gif (187.08 KB, 下載次數(shù): 82)

51hei.gif





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