国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

基于51單片機的七彩呼吸燈proteus仿真+程序keil5

[復制鏈接]
樓主
coolice 發表于 2021-7-12 00:27:47 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
1) 起始狀態時,8個燈處于同頻率“呼吸”狀態。
(2) 按鍵1按下時,1號到8號依次由亮到暗“呼吸”。
(3) 按鍵2按下時,1號到8號依次由暗到亮“呼吸”。
(4)按鍵3按下時,恢復起始亮法。
由于是在仿真中,需要加入驅動電路才能看出來“呼吸”的效果,否則只能看到燈在閃爍。
做實物時不需要加驅動電路,直接連接單片機就可以看出來那種效果。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
基于51單片機的七彩呼吸燈proteus仿真+程序keil5 3.gif
單片機源程序如下:
  1. #include <reg51.h>
  2. #define MAX 0x40   //定時上限定義
  3. #define MIN 0x00   //定時下限定義
  4. #define TIMELINE 10         //時間分頻常數
  5. #define TRUE  1
  6. #define FALSE 0             //標志位常數
  7. sbit s1 = P2^0;
  8. sbit s2 = P2^1;
  9. sbit s3 = P2^2;
  10. unsigned int TimeCounter;
  11. bit ArrowFlg = 0;         //方向標志位
  12. unsigned char upCounter,downCounter;    //增加計數器和減少計數器
  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的中斷服務子函數
  25. void T0Deal() interrupt 1
  26. {
  27.         TH0=0xf1;
  28.         TL0=0xf1;
  29.         TR0=1;
  30.         TimeCounter++;  //定時計數器增加
  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;     //計數器初始化
  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;     //計數器初始化
  52.                                 j++;if(j>=9)j=0;
  53.                   }
  54.                 }
  55.                 if(key==3)
  56.                 {
  57.                         if((upCounter == MAX)&&(downCounter == MIN))  //計數方向標志位切換
  58.                     {
  59.                       ArrowFlg = FALSE;
  60.                     }
  61.                         if((upCounter == MIN)&&(downCounter == MAX))
  62.                     {
  63.                       ArrowFlg= TRUE;
  64.                     }
  65.                         if(ArrowFlg == 1)   //如果是增加計數
  66.                     {
  67.                       upCounter++;
  68.                       downCounter--;
  69.                     }
  70.                                 else               //如果是減少計數
  71.                     {
  72.                       upCounter--;
  73.                       downCounter++;
  74.                     }
  75.                 }
  76.                         TimeCounter=0;
  77.         }
  78. }
  79. //延時函數
  80. void Delay(unsigned int i)
  81. {
  82.         unsigned int j;
  83.         while(i--)
  84.         {
  85.                 for(j=0;j<32;j++);     //延時
  86.         }
  87. }
  88. void main()
  89. {
  90.         upCounter = MIN;
  91.         downCounter = MAX;     //計數器初始化
  92.         TMOD = 0x01;          //設置定時器工作方式1
  93.         TH0 = 0xF0;
  94.         TL0 = 0xF0;          //T0初始化值
  95.         EA = 1;
  96.         ET0 = 1;              //開中斷
  97.         TR0 = 1;              //啟動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. }
復制代碼
七彩呼吸燈完整源碼和仿真文件.zip (118.5 KB, 售價: 2 E幣)
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 05:11

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表