51单片机按键,led小灯泡,数码管综合程序与Proteus仿真

[复制链接]
查看8 | 回复0 | 2021-6-9 19:31:39 | 显示全部楼层 |阅读模式
其中开关SW1为系统总控制开关//系统初始为关闭状态/此时按下SW1,系统开启,指示灯D1亮,
第一块数显板会显示按下次数1////此时按SW2/第一次D2亮起//第二次按下D3亮起//第三次按下D2和D3会同时熄灭,每按一次,
第四块数显板会显示开关SW2按下次数。当任意一个开关按下次数达到10次时,对应的数显板会从零开始重新计数。
开关SW3按下时,不管系统处于什么状态,都将关闭系统,而SW4按下时,第二个小灯泡会点亮

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png
51单片机源程序如下:
  1. /*此系统为开关联合控制LED工作台////其中开关SW1为系统总控制开关//系统初始为关闭状态/此时按下SW1,系统开启,指示灯D1亮,
  2. 第一块数显板会显示按下次数1////此时按SW2/第一次D2亮起//第二次按下D3亮起//第三次按下D2和D3会同时熄灭,每按一次,
  3. 第四块数显板会显示开关SW2按下次数。当任意一个开关按下次数达到10次时,对应的数显板会从零开始重新计数。*/
  4. #include"reg52.h"
  5. sbit C1=P3^0; //定义数码管四个引脚
  6. sbit C2=P3^1;
  7. sbit C3=P3^2;
  8. sbit C4=P3^3;

  9. unsigned char F=0;          //定义系统是否开启
  10. unsigned char A=0;          //定义D3灯开关次数

  11. sbit D1=P1^0;                  //LED引脚
  12. sbit D2=P1^1;
  13. sbit D3=P1^2;

  14. sbit SW1=P2^0;                   //开关引脚
  15. sbit SW2=P2^1;
  16. unsigned char s1=0,s2=0;  //数显管开关次数
  17. unsigned char SMG[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  18. void SMGDelay(unsigned char t)           //此处为延时函数定义
  19.    {
  20.    while(t--);
  21.    }
  22. void SMGPLAY(unsigned char P,unsigned char D)         //四个数显管的显示位置
  23.    {
  24.     P0=0xff; //消隐
  25.             switch(P)
  26.           {
  27.           case 1:C1=1;C2=0;C3=0;C4=0;break;
  28.           case 2:C1=0;C2=1;C3=0;C4=0;break;
  29.           case 3:C1=0;C2=0;C3=1;C4=0;break;
  30.           case 4:C1=0;C2=0;C3=0;C4=1;break;
  31.           }
  32.           P0=D;
  33.    }
  34.   
  35.   void PUT4SMG()  //定义四个数显管显示内容
  36.   {
  37.    SMGPLAY(1,SMG[s1]);
  38.    SMGDelay(100);
  39.    SMGPLAY(2,0xbf);
  40.    SMGDelay(100);
  41.    SMGPLAY(3,0xbf);
  42.    SMGDelay(100);
  43.    SMGPLAY(4,SMG[s2]);
  44.    SMGDelay(100);
  45.   }
  46.   void KEYS()           //定义开关按下次数和系统开关和小灯泡亮灭
  47.   {
  48.   if(SW1==0)
  49.    {
  50.   SMGDelay(100);
  51.   if(SW1==0)
  52.     {
  53.   while(SW1==0)
  54.      {
  55.    PUT4SMG();
  56.      }
  57.          s1++;
  58.          if(s1==10)
  59.          {
  60.           s1=0;
  61.          }
  62.         if(F==0)
  63.           {
  64.           F=1;
  65.           D1=0;
  66.           }
  67.           else
  68.           {
  69.           F=0;
  70.           D1=1;
  71.           D2=1;
  72.           D3=1;
  73.           A=0;
  74.           }
  75.          
  76.     }
  77.    }
  78. if(SW2==0)
  79.    {
  80.   SMGDelay(100);
  81.   if(SW2==0)
  82.     {
  83.   while(SW2==0)
  84.      {
  85.    PUT4SMG();
  86.      }
  87.          s2++;
  88.          if(s2==10)
  89.           {
  90.           s2=0;
  91.           }
  92.           if(F==1)
  93.           {
  94.           A++;
  95.           switch(A)
  96.           {
  97.           case 1:D2=0;break;
  98.           case 2:D3=0;break;
  99.           case 3:D2=1;D3=1;A=0;break;
  100.           }
  101.           }

  102.     }
  103.    }
  104.   }
  105. void main()
  106. {
  107.   while(1)
  108.   {
  109.            PUT4SMG();
  110.         KEYS();
  111.    }
  112. }
复制代码
联合控制开关 LED.rar (20.23 KB, 售价: 1 工控币)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则