51单片机LED灯多样控制程序

[复制链接]
查看1 | 回复0 | 2021-6-22 01:20:00 | 显示全部楼层 |阅读模式
1.png
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. uchar code table[]={0xfe,0xfc,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0xff};  

  6. sbit k1 = P2^0;  
  7. sbit k2 = P2^1;  
  8. sbit k3 = P2^2;  
  9. sbit k4 = P3^2;  
  10. sbit k5 = P3^3;  

  11. int i;
  12. int a,b,l,led;
  13. uint led1,led2;

  14. void KEY4();  
  15. void KEY5();  

  16. void delay(uint xms)  //延时
  17. {
  18.         int i,j;
  19.         for(i=xms;i>0;i--)
  20.                 for(j=110;j>0;j--) ;
  21. }

  22. void KEY1()  //流水灯向右
  23. {
  24.         if(k1==0)
  25.         {
  26.                 delay(5);  //消抖
  27.                 if(k1==0)
  28.                 {
  29.                         ET0 = 0;  //关定时器0中断
  30.                         TR0 = 0;  //关闭定时器0
  31.                         a = 0;
  32.                         P1 = 0xff;
  33.                         delay(500);
  34.                         while(1)  //while(1)循环流水灯向右
  35.                         {
  36.                                 P1 = table[a];
  37.                                 delay(500);
  38.                                 a++;
  39.                                 if(a==11)  //流水灯到尾重新开始
  40.                                         a = 0;
  41.                                 if(k1==0||k2==0||k3==0)  //按键检测,退出while(1)循环
  42.                                 {
  43.                                         delay(5);
  44.                                         if(k1==0||k2==0||k3==0)
  45.                                                 break;
  46.                                 }
  47.                         }
  48.                 }
  49.         }
  50. }

  51. void KEY2()  //流水灯向左
  52. {
  53.         if(k2==0)
  54.         {
  55.                 delay(5);
  56.                 if(k2==0)
  57.                 {
  58.                         ET0 = 0;  
  59.                         TR0 = 0;
  60.                         b = 10;
  61.                         P1 = 0xff;
  62.                         delay(500);
  63.                         while(1)
  64.                         {
  65.                                 P1 = table[b];
  66.                                 delay(500);
  67.                                 b--;
  68.                                 if(b<0)
  69.                                         b = 10;
  70.                                 if(k1==0||k2==0||k3==0)
  71.                                 {
  72.                                         delay(5);
  73.                                         if(k1==0||k2==0||k3==0)
  74.                                                 break;
  75.                                 }
  76.                         }
  77.                 }
  78.         }
  79. }

  80. void KEY3()  //闪烁灯
  81. {
  82.         if(k3==0)
  83.         {
  84.                 delay(5);
  85.                 if(k3==0)
  86.                 {
  87.                         ET0 = 0;  
  88.                         TR0 = 0;
  89.                         P1 = 0xff;
  90.                         delay(500);
  91.                         while(1)
  92.                         {
  93.                                 P1 =~ P1;  //P1口反转
  94.                                 delay(500);
  95.                                 if(k1==0||k2==0||k3==0)
  96.                                 {
  97.                                         delay(5);
  98.                                         if(k1==0||k2==0||k3==0)
  99.                                                 break;
  100.                                 }
  101.                         }
  102.                 }
  103.         }
  104. }

  105. void init()  //初始化函数
  106. {
  107.         P1 = 0xff;
  108.         TMOD = 0x01;  //定时器0工作在方式1
  109.         IP = 0x01;  //PX0 = 1;  //中断优先级  外部中断0为高优先级中断
  110.         //IP = 0x40 ;(PX1 = 1;)
  111.         TH0 = (65536 - 50000)/256;
  112.         TL0 = (65536 - 50000)%256;
  113.         /*TH0 = (计数最大值-定时时间)/256
  114.                 TL0 = (计数最大值-定时时间)%256
  115.         */
  116.         EA = 1;  //开总中断
  117.         EX0 = 1;  //开外部中断0
  118.         EX1 = 1;  //开外部中断1
  119.         IT0 = 1;  //外部中断0负跳变中断
  120.         IT1 = 1;  //外部中断1负跳变中断
  121.         ET0 = 1;  //开定时器0中断
  122.         TR0 = 1;  //允许定时器0定时
  123. }

  124. void main()
  125. {
  126.         init();  //初始化函数
  127.         while(1)
  128.         {
  129.                 KEY1();
  130.                 KEY2();
  131.                 KEY3();
  132.         }
  133. }

  134. void int0() interrupt 0  //外部中断0  单个流水灯向右
  135. {
  136.         uint i;
  137.         led1 = 0xfe;
  138.         for(i=0;i<8;i++)
  139.         {
  140.                 P1 = led1;
  141.                 delay(500);
  142.                 led1 = _crol_(led1,1);
  143.         }
  144. }

  145. void time0_int()  interrupt 1  //定时器0
  146. {
  147.         TH0 = (65536 - 50000)/256;  //50ms
  148.         TL0 = (65536 - 50000)%256;
  149.         i++;
  150.         if(i==10)  //定时器0控制开始灯闪烁
  151.         {
  152.                 i = 0;
  153.                 P1 =~ P1;
  154.                 delay(400);
  155.         }
  156. }

  157. void int1() interrupt 2  //外部中断1  单个流水灯向左
  158. {
  159.         uint i;
  160.         led2 = 0x7f;
  161.         for(i=0;i<8;i++)
  162.         {
  163.                 P1 = led2;
  164.                 delay(500);
  165.                 led2 = _crol_(led2,-1);
  166.         }
  167. }
复制代码


回复

使用道具 举报

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

本版积分规则