找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键控制流水灯状态(4种),仿真加程序,按键采用中断扫描方式

[复制链接]
跳转到指定楼层
楼主
按键-LED实验                                                                                                  
实现现象:下载程序后
按下K1按键  12,34 交替亮灭
按下K2按键  13,24 交替亮灭
按下K3按键  1234循环点亮
按下K4按键  全灭

在本次仿真中,按键使用的是定时器0的按键扫描方式,
但是由于单片机的执行是从上往下执行的过程,加上程序中有延时函数的存在,
因此,有时候在当前状态未运行完的情况下,按下按键并没有立即反应,
等当前状态执行完就可以执行按键按下后的状态了。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /**************************************************************************************
  2. *                *按键-LED实验                                                                                                  *
  3. *实现现象:下载程序后
  4. *按下K1按键  12,34 交替亮灭
  5. *按下K2按键  13,24 交替亮灭
  6. *按下K3按键  1234循环点亮
  7. *按下K4按键  全灭
  8. 注意事项:无                                                                                                                                                                  
  9. ***************************************************************************************/
  10. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  11. #include<intrins.h>                //因为要用到左右移函数,所以加入这个头文件
  12. typedef unsigned int u16;          //对数据类型进行声明定义
  13. typedef unsigned char u8;

  14. sbit k1=P1^0;         //按键1,   12,34 交替亮灭
  15. sbit k2=P1^1;         //按键2,  13,24 交替亮灭
  16. sbit k3=P1^2;         //按键3, 1234循环点亮
  17. sbit k4=P1^3;         //全灭


  18. sbit LED1=P2^0;         //定义P20口是led1
  19. sbit LED2=P2^1;         //定义P20口是led2
  20. sbit LED3=P2^2;         //定义P口是led3
  21. sbit LED4=P2^3;         //定义P口是led4
  22. #define led P2           //将P2口定义为led 后面就可以使用led代替P2口

  23. u8 key_value;

  24. /*******************************************************************************
  25. * 函 数 名         : delay
  26. * 函数功能                   : 延时函数,i=1时,大约延时10us
  27. *******************************************************************************/
  28. void delay(u16 i)
  29. {
  30.         while(i--);       
  31. }
  32. void Delay100ms()                //@12.000MHz
  33. {
  34.         unsigned char i, j, k;

  35.         _nop_();
  36.         _nop_();
  37.         i = 5;
  38.         j = 144;
  39.         k = 71;
  40.         do
  41.         {
  42.                 do
  43.                 {
  44.                         while (--k);
  45.                 } while (--j);
  46.         } while (--i);
  47. }

  48. /*******************************************************************************
  49. * 函 数 名         : Timer0Init
  50. * 函数功能                   : 定时器0初始化
  51. * 输    入         : 无
  52. * 输    出         : 无
  53. *******************************************************************************/
  54. void Timer0Init(void)                //10微秒@12.000MHz
  55. {
  56.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  57.         TL0 = 0x88;                //设置定时初值
  58.         TH0 = 0xFF;                //设置定时初值
  59.         ET0=1;//打开定时器0中断允许
  60.         EA=1;//打开总中断
  61.         TR0=1;//打开定时器       
  62. }

  63. /*******************************************************************************
  64. * 函 数 名         : keypros
  65. * 函数功能                   : 按键处理函数,判断按键是否按下
  66. *******************************************************************************/
  67. void keypros()
  68. {
  69.         if(k1==0)                  //检测按键K1是否按下
  70.         {       
  71.                 delay(1000);   //消除抖动 一般大约10ms
  72.                 if(k1==0)         //再次判断按键是否按下
  73.                 {
  74.                           key_value = 1;  
  75.                 }
  76.                 while(!k1);         //检测按键是否松开
  77.         }               
  78.        
  79.         if(k2==0)                  //检测按键K1是否按下
  80.         {       
  81.                 delay(1000);   //消除抖动 一般大约10ms
  82.                 if(k2==0)         //再次判断按键是否按下
  83.                 {
  84.                         key_value = 2;
  85.                 }
  86.                 while(!k2);         //检测按键是否松开
  87.         }


  88.         if(k3==0)                  //检测按键K1是否按下
  89.                 {       
  90.                         delay(1000);   //消除抖动 一般大约10ms
  91.                         if(k3==0)         //再次判断按键是否按下
  92.                         {
  93.                                 key_value = 3;
  94.                         }
  95.                         while(!k3);         //检测按键是否松开
  96.                 }
  97.                
  98.         if(k4==0)                  //检测按键K1是否按下
  99.                 {       
  100.                         delay(1000);   //消除抖动 一般大约10ms
  101.                         if(k4==0)         //再次判断按键是否按下
  102.                         {
  103.                                 key_value = 4;
  104.                         }
  105.                         while(!k4);         //检测按键是否松开
  106.                 }               
  107.        
  108. }

  109. void Mode1()            //模式1
  110. {
  111.                 LED1 = 0;    //亮
  112.                 LED2 = 0;    //亮
  113.                 LED3 = 1;    //灭
  114.                 LED4 = 1;    //灭
  115.                 Delay100ms();               
  116.                 LED1 = 1;    //灭
  117.                 LED2 = 1;    //灭
  118.                 LED3 = 0;    //亮
  119.                 LED4 = 0;    //亮
  120.                 Delay100ms();

  121. }
  122. void Mode2()            //模式2
  123. {
  124.                 LED1 = 0;    //亮
  125.                 LED3 = 0;    //亮
  126.                 LED2 = 1;    //灭
  127.                 LED4 = 1;    //灭
  128.                 Delay100ms();               
  129.                 LED1 = 1;    //灭
  130.                 LED3 = 1;    //灭
  131.                 LED2 = 0;    //亮
  132.                 LED4 = 0;    //亮
  133.                 Delay100ms();

  134. }
  135. void Mode3()            //模式3
  136. {
  137.         u8 i;
  138.         led=0xfe;
  139.         Delay100ms();
  140.          for(i=0;i<3;i++)         //将led左移一位
  141.                 {
  142.                         led=_crol_(led,1);
  143.                         Delay100ms();        
  144.                 }
  145.                 for(i=0;i<3;i++)        //将led右移一位
  146.                 {
  147.                         led=_cror_(led,1);
  148.                         Delay100ms();
  149.                 }       
  150. }
  151. void Mode4()            //模式4
  152. {
  153.         led=0xff;       //全灭
  154. }
  155. /*******************************************************************************
  156. * 函 数 名       : main
  157. * 函数功能                 : 主函数
  158. * 输    入       : 无
  159. * 输    出             : 无
  160. *******************************************************************************/
  161. void main()
  162. {       
  163.         Timer0Init();  //定时器0初始化
  164.         while(1)
  165.         {       
  166.                 keypros();  //按键处理函数       
  167.                 switch (key_value)
  168.                 {
  169.                         case 1 : Mode1();break;
  170.                         case 2 : Mode2();break;
  171.                         case 3 : Mode3();break;
  172.                         case 4 : Mode4();break;
  173.                 }
  174.                
  175.         }               
  176. }

  177. /*******************************************************************************
  178. * 函 数 名         : void Timer0() interrupt 1
  179. * 函数功能                   : 定时器0中断函数
  180. * 输    入         : 无
  181. * 输    出         : 无
  182. *******************************************************************************/
  183. void Timer0() interrupt 1
  184. {
  185.         TL0 = 0x88;                //设置定时初值
  186.         TH0 = 0xFF;                //设置定时初值
  187.         keypros();
  188. }
复制代码

所有资料51hei提供下载:
仿真.rar (50.96 KB, 下载次数: 51)
code.rar (27.59 KB, 下载次数: 44)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:989932 发表于 2021-12-9 10:27 来自手机 | 只看该作者
第二个是啥
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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