找回密码
 注册

QQ登录

只需一步,快速开始

搜索

基于51单片机的七彩呼吸灯proteus仿真+程序keil5

[复制链接]
coolice 发表于 2021-7-12 00:27:47 | 显示全部楼层 |阅读模式
1) 起始状态时,8个灯处于同频率“呼吸”状态。
(2) 按键1按下时,1号到8号依次由亮到暗“呼吸”。
(3) 按键2按下时,1号到8号依次由暗到亮“呼吸”。
(4)按键3按下时,恢复起始亮法。
由于是在仿真中,需要加入驱动电路才能看出来“呼吸”的效果,否则只能看到灯在闪烁。
做实物时不需要加驱动电路,直接连接单片机就可以看出来那种效果。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
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币)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-3-29 01:17

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表