找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 29368|回复: 6
打印 上一主题 下一主题
收起左侧

简单的单片机按键控制流水灯

  [复制链接]
跳转到指定楼层
楼主
按键控制流水灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

功能:
1. 用8盏LED小灯,实现至少4种彩灯灯光效果(不含全部点亮,全部熄灭);
2. 可以用输入按钮在几种灯光效果间切换;
3. 可以通过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前的效果;
4. 增加自动在几种效果间切换的功能,并设置一个按钮可以在自动模式和手动模式间切换;
5. 使用定时中断延时
(由于仿真图略大,不能上传)
源代码:
  1. #include<reg51.h>   
  2. #include<intrins.h>
  3. #define  GPIO_LED P0 //led使用P0口
  4. #define  GPIO_KEY P1 //独立键盘用P1口
  5. sbitK1=P1^0;
  6. sbitK2=P1^1;
  7. sbitK3=P1^2;
  8. sbitK4=P1^3;
  9. sbitK5=P1^4;
  10. char  KeyNum;
  11. unsignedchar  state;
  12. unsignedchar  change_state;
  13. voidDelay10ms(unsigned int c);   //延时10ms
  14. voidLED1();
  15. voidLED2();
  16. voidLED3();
  17. voidLED4();
  18. voidauto_LED();
  19. voidPause();
  20. unsignedchar Key_Scan();            //扫描键盘//
  21. voidmain(void)
  22. {  
  23.    IT0=1;
  24.    IT1=1;
  25.    EX1=1;
  26.    EX0=1;
  27.    EA=1;
  28.     auto_LED();
  29.   while(1)
  30.   {
  31.       if(1 == state)
  32.      {
  33.         LED1();
  34.         change_state = 0;
  35.      }
  36.      else if(2 == state)
  37.      {
  38.         LED2();
  39.         change_state = 0;
  40.      }
  41.      else if(3 == state)
  42.      {
  43.         LED3();
  44.         change_state = 0;
  45.      }
  46.      else if(4 == state)
  47.      {
  48.         LED4();
  49.         change_state = 0;
  50.      }
  51. }  
  52. }         
  53. voidChange() interrupt 0
  54. {     
  55.    KeyNum=Key_Scan();
  56.    switch(KeyNum)
  57.    {
  58.         case(0xFe) :    //返回按键K1的数据
  59.         state=1;
  60.         change_state=1;
  61.         break;
  62.         case(0xFD) :    //返回按键K2的数据
  63.         state=2;
  64.         change_state=2;
  65.         break;
  66.         case(0xFB) :    //返回按键K3的数据
  67.         state=3;
  68.         change_state=3;
  69.         break;
  70.         case(0xF7) :    //返回按键K4的数据
  71.         state=4;
  72.         change_state=4;
  73.         break;
  74.         default:
  75.         break;
  76.     }
  77. }
  78. voidPause() interrupt 1
  79. {
  80.      auto_LED();
  81. }
  82. voidDelay10ms(unsigned int c)   //误差 0us
  83. {
  84.   unsigned char a, b;
  85.    for (;c>0;c--)
  86.    {for (b=30;b>0;b--)
  87.      {
  88.         for (a=100;a>0;a--);         
  89.    }      
  90.      
  91. }
  92. unsignedchar Key_Scan()
  93. {
  94.    unsigned char keyValue = 0 , i; //保存键值
  95. //--检测按键1--//
  96.    if (GPIO_KEY != 0xFF)    /检测按键K1是否按下
  97.    {
  98.      Delay10ms(1); //消除抖动
  99.      if (GPIO_KEY != 0xFF) //再次检测按键
  100.      {
  101.         keyValue = GPIO_KEY;
  102.         i = 0;
  103.        while ((i<50) && (GPIO_KEY !=0xFF))  //检测按键是否松开
  104.         {
  105.            Delay10ms(1);
  106.            i++;
  107.         }
  108.      }
  109.    }
  110.    return keyValue;   //将读取到键值的值返回
  111. }
  112. voidLED1()
  113. {
  114.     unsigned char i;
  115.    GPIO_LED = 0x01;
  116.    for (i=0; i<16; i++)
  117.    {
  118.      GPIO_LED = _crol_(GPIO_LED, 1);
  119.       Delay10ms(100);
  120.    if(change_state==2)
  121.         break;
  122.    if(change_state==3)   
  123.         break;
  124.    if(change_state==4)      
  125.         break;
  126.    if(change_state==5)      
  127.         break;
  128.    }
  129. }
  130. voidLED2()
  131. {
  132. unsignedchar i;
  133.    GPIO_LED = 0x80;
  134.    for (i=0; i<16; i++)
  135.    {
  136.      GPIO_LED = _cror_(GPIO_LED, 1);
  137.      Delay10ms(100);
  138.    if(change_state==1)
  139.         break;
  140.    if(change_state==3)   
  141.         break;
  142.    if(change_state==4)      
  143.         break;
  144.    if(change_state==5)      
  145.         break;
  146.    }
  147. }
  148. voidLED3()
  149. {
  150. unsigned char i;
  151.    GPIO_LED = 0x81;
  152.    for (i=0; i<8; i++)
  153.    {
  154.      GPIO_LED = _cror_(GPIO_LED, 4);
  155.      Delay10ms(100);
  156.    if(change_state==1)
  157.         break;
  158.    if(change_state==2)   
  159.         break;
  160.    if(change_state==4)      
  161.         break;
  162.    if(change_state==5)      
  163.         break;
  164.    }
  165. }
  166. voidLED4()
  167. {
  168.    unsigned char i;
  169.    GPIO_LED = 0x18;
  170.    for (i=0; i<8; i++)
  171.    {
  172.      GPIO_LED = _cror_(GPIO_LED, 3);
  173.      Delay10ms(100);
  174.    if(change_state==1)
  175.         break;
  176.    if(change_state==2)   
  177.         break;
  178.    if(change_state==3)      
  179.         break;
  180.    if(change_state==5)      
  181.         break;
  182.    }
  183. }
  184. void auto_LED()  
  185. {  
  186.     LED1();
  187.    Delay10ms(100);
  188.    LED2();
  189.    Delay10ms(100);
  190.    LED3();
  191.    Delay10ms(100);
  192.    LED4();
  193.    Delay10ms(100);  
  194. }
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:425642 发表于 2018-11-13 13:29 | 只看该作者
请问附件在哪啊?
回复

使用道具 举报

板凳
ID:66287 发表于 2018-11-14 08:58 | 只看该作者
程序写的很好!
个人认为,类似
if(1 == state)
     {
        LED1();
        change_state = 0;
     }
     else if(2 == state)
改成switch语句,更加一目了然。
回复

使用道具 举报

地板
ID:437955 发表于 2018-12-2 21:22 | 只看该作者
请问附件在哪啊?
回复

使用道具 举报

5#
ID:516266 发表于 2019-4-22 21:12 来自手机 | 只看该作者
为什么没有晶振
回复

使用道具 举报

6#
ID:418164 发表于 2019-10-14 21:58 来自手机 | 只看该作者
楼主你这个是自动的 跟按键没关系啊auto_LED就直接运行了啊
回复

使用道具 举报

7#
ID:781362 发表于 2020-6-16 20:52 | 只看该作者
87行的大括号少了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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