找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8485|回复: 0
收起左侧

单片机按键控制16个LED源代码,带有蜂鸣器

[复制链接]
ID:430707 发表于 2018-11-21 17:55 | 显示全部楼层 |阅读模式
用按键控制16个LED灯,按键按下同时蜂鸣器响,流水灯切换四种样式,插上电源之后,按下按键后灯亮,切换过所有四种样式之后再按按键所有灯灭,之后循环。。。

原理图:
66D2066FCBD03AD346448E8FD73D0B41.png

板子正面:                                       
5443F58C73702655D152A483E8B81861.png    
板子反面:
9E4763BB7F625E35DE0E172821D9F0EE.png

焊的不好,有的线接的时候也没考虑那么多,能实现正常功能,各位将就着看。。。代码在附件里。

单片机源程序如下:
  1. #include<reg52.h>
  2. sbit KEY=P1^4;
  3. sbit BUZZER=P1^0;
  4. bit KeySta = 1;                      //当前按键状态  
  5. unsigned int temp=0;                 //记录T0中断次数
  6. unsigned char flagls=0;              //定时1s标志
  7. void LED1(unsigned char i);          //函数声明
  8. void LED2(unsigned char j);
  9. void LED3(unsigned char k);
  10. void LED4(unsigned char m);

  11. void buzzer();
  12. void main()
  13. {
  14.   unsigned char i=0;                    //流水灯的判断值
  15.   unsigned char j=0;                   //LED闪烁的判断值
  16.         unsigned char k=0;
  17.         unsigned char m=0;
  18.         bit backup=1;                       //按键值备份,保存前一次的扫描值
  19.         unsigned int cnt=0;                 //按键计数
  20.         EA=1;                              //使能总中断
  21.         TMOD=0x01;                         //设置T0为模式1
  22.         TH0=0xF8;                          //为T0赋初值,定时为2ms
  23.         TL0=0xCD;
  24.         ET0=1;                             //使能T0中断
  25.         TR0=1;                             //启动T0
  26.         while(1)
  27.         {
  28.                 if(KeySta!=backup)                //当前值与前次值不相等说明此时按键有动作
  29.                 {
  30.                         if(backup ==1)                  //如果前次的值为1,则说明当前是弹起动作
  31.                         {
  32.                                 buzzer();
  33.                                 cnt++;                        //按键次数加1
  34.                                  if(cnt>4)
  35.         {
  36.                cnt=0;
  37.         }
  38.                         }
  39.                          backup=KeySta;
  40.                  }
  41.                  if(cnt==0)
  42.                  {
  43.                          P0=0xFF;
  44.                          P2=0xFF;
  45.                          BUZZER=1;
  46.                          i=0;
  47.                          j=0;
  48.                          k=0;
  49.                          m=0;
  50.                  }
  51.                  if(cnt==1)                  //按键次数为1
  52.                  {
  53.                          LED1(i);
  54.                        
  55.        if(flagls==1)             //判断1s定时标志
  56.                          {
  57.                                  flagls=0;               //清零定时标志
  58.                                  i++;                    //计数值加1
  59.                                  if(i>=16)
  60.                                  {
  61.                                          i=0;
  62.                                  }
  63.                          }
  64.                  }
  65.                  if(cnt==2)
  66.                  {
  67.                          LED2(j);
  68.                        
  69.        if(flagls==1)             //判断1s定时标志
  70.                          {
  71.                                  flagls=0;               //清零定时标志
  72.                                  j++;                    //计数值加1
  73.                                  if(j>=2)
  74.                                  {
  75.                                          j=0;
  76.                                  }
  77.                          }
  78.                  }
  79.                  if(cnt==3)
  80.                  {
  81.                          LED3(k);
  82.                        
  83.        if(flagls==1)             //判断1s定时标志
  84.                          {
  85.                                  flagls=0;               //清零定时标志
  86.                                  k++;                    //计数值加1
  87.                                  if(k>=16)
  88.                                  {
  89.                                          k=0;
  90.                                  }
  91.                          }
  92.                  }
  93.                   if(cnt==4)
  94.                  {
  95.                          LED4(m);
  96.                        
  97.        if(flagls==1)             //判断1s定时标志
  98.                          {
  99.                                  flagls=0;               //清零定时标志
  100.                                  m++;                    //计数值加1
  101.                                  if(m>=32)
  102.                                  {
  103.                                          m=0;
  104.                                  }
  105.                          }
  106.                  }
  107.          }
  108. }
  109.                                  
  110.                          

  111. void InterruptTimer0() interrupt 1
  112. {
  113.     static unsigned char keybuf = 0xFF;  //扫描缓冲区,保存一段时间内的扫描值
  114.    
  115.     TH0 = 0xF8;  //重新加载初值
  116.     TL0 = 0xCD;
  117.           temp++;         //中断次数计数值加1
  118.           if(temp>=100)   //中断1000次即为1s
  119.                 {
  120.                         temp=0;
  121.                         flagls=1;   //设置1s定时标志为1
  122.                 }
  123.     keybuf = (keybuf<<1) | KEY;  //缓冲区左移一位,并将当前扫描值移入最低位
  124.     if (keybuf == 0x00)
  125.     {   //连续8次扫描值都为0,即16ms内都只检测到按下状态时,可认为按键已按下
  126.         KeySta = 0;
  127.     }
  128.     else if (keybuf == 0xFF)
  129.     {   //连续8次扫描值都为1,即16ms内都只检测到弹起状态时,可认为按键已弹起
  130.         KeySta = 1;
  131.     }
  132.     else
  133.     {}  //其它情况则说明按键状态尚未稳定,则不对KeySta变量值进行更新
  134. }


  135. //流水灯函数
  136. void LED1(unsigned char i)
  137. {
  138.         switch(i)
  139.         {
  140.                 case 0:P0=0xFE;P2=0xFF;break;
  141.                 case 1:P0=0xFD;break;
  142.                 case 2:P0=0xFB;break;
  143.                 case 3:P0=0xF7;break;
  144.                 case 4:P0=0xEF;break;
  145.                 case 5:P0=0xDF;break;
  146.                 case 6:P0=0xBF;break;
  147.                 case 7:P0=0x7F;break;
  148.                 case 8:P0=0xFF;P2=0x7F;break;
  149.                 case 9:P2=0xBF;break;
  150.                 case 10:P2=0xDF;break;                         
  151.                 case 11:P2=0xEF;break;                         
  152.                 case 12:P2=0xF7;break;                       
  153.                 case 13:P2=0xFB;break;                       
  154.           case 14:P2=0xFD;break;
  155.     case 15:P2=0xFE;break;
  156.                 default: break;
  157.         }
  158. }

  159. //LED灯闪烁函数
  160. void LED2(unsigned char j)  
  161. {
  162.         switch(j)
  163.         {
  164.                 case 0:P0=0x00;P2=0x00;break;
  165.                 case 1:P0=0xFF;P2=0xFF;break;
  166.                 default: break;
  167.         }
  168. }


  169. void LED3(unsigned char k)
  170. {
  171.         switch(k)
  172.         {
  173.                 case 0:P0=~0xFE;P2=~0xFF;break;
  174.                 case 1:P0=~0xFD;break;
  175.                 case 2:P0=~0xFB;break;
  176.                 case 3:P0=~0xF7;break;
  177.                 case 4:P0=~0xEF;break;
  178.                 case 5:P0=~0xDF;break;
  179.                 case 6:P0=~0xBF;break;
  180.                 case 7:P0=~0x7F;break;
  181.                 case 8:P0=~0xFF;P2=~0x7F;break;
  182.                 case 9:P2=~0xBF;break;
  183.                 case 10:P2=~0xDF;break;                         
  184.                 case 11:P2=~0xEF;break;                         
  185.                 case 12:P2=~0xF7;break;                       
  186.                 case 13:P2=~0xFB;break;                       
  187.           case 14:P2=~0xFD;break;
  188.     case 15:P2=~0xFE;break;
  189.                 default: break;
  190.         }
  191. }


  192. void LED4(unsigned char m)
  193. {
  194.         switch(m)
  195.         {
  196.         case 0: P0=0xaa;P2=0xaa;break;
  197.         case 1: P0=0x55;P2=0x55;break;
  198.         case 2: P0=0x18;P2=0x18;break;
  199.         case 3: P0=0xff;P2=0xff;break;
  200.         case 4: P0=0xf0;P2=0xf0;break;
  201.         case 5: P0=0x0f;P2=0x0f;break;
  202.         case 6: P0=0x00;P2=0x00;break;
  203.         case 7: P0=0xff;P2=0xff;break;
  204.         case 8: P0=0xf8;P2=0xf8;break;
  205.         case 9: P0=0xf1;P2=0xf1;break;
  206.         case 10:P0=0xe3;P2=0xe3;break;
  207.         case 11:P0=0xc7;P2=0xc7;break;
  208.         case 12:P0=0x8f;P2=0x8f;break;
  209.         case 13:P0=0x1f;P2=0x1f;break;
  210.   case 14:P0=0x3f;P2=0x3f;break;
  211.   case 15:P0=0x7f;P2=0x7f;break;
  212.   case 16:P0=0x7f;P2=0x7f;break;
  213.         case 17:P0=0x3f;P2=0x3f;break;
  214.         case 18:P0=0x1f;P2=0x1f;break;
  215.         case 19:P0=0x8f;P2=0x8f;break;
  216.         case 20:P0=0xc7;P2=0xc7;break;
  217.         case 21:P0=0xe3;P2=0xe3;break;
  218.         case 22:P0=0xf1;P2=0xf1;break;
  219.         case 23:P0=0xf8;P2=0xf8;break;
  220.         case 24:P0=0xff;P2=0xff;break;
  221.         case 25:P0=0x00;P2=0x00;break;
  222.         case 26:P0=0x00;P2=0x00;break;
  223.         case 27:P0=0xff;P2=0xff;break;
  224.         case 28:P0=0xff;P2=0xff;break;
  225.         case 29:P0=0x0f;P2=0x0f;break;
  226.   case 30:P0=0xf0;P2=0xf0;break;
  227.   case 31:P0=0xff;P2=0xff;break;
  228.         default: break;               

  229.         }
  230. }
  231. //蜂鸣器函数
  232. void buzzer()  
  233. {
  234.         unsigned int k=0;
  235.         …………
  236. …………
  237. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
zh.zip (38.07 KB, 下载次数: 24)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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