当前位置:   article > 正文

51单片机—独立按键的控制_单片机独立按键

单片机独立按键


一、独立按键的介绍 

     1.按键介绍

        轻触按键,相当于一种电子开关,按下使开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通断开。

     2.按键原理图

K1、K2、K3、K4一公共端接GND,另一端分别接单片机I/O口的P3^0到P3^3,因为单片机4组I/O口P0—P3都是高电平有效,当按键按下时,将I/O口拉到低电平使按键有效。

3.按键抖动

对于机械开关,当机械触电断开闭合时,由于机械触电的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动,单片机会检测出来。

当没有按键按下时,电平为高电平,按下时,为0(由于机械触电,会弹逐渐稳定为0),机械开关抖动时间为5—10ms(不同开关时间不同),经过手松开的时间,若松开按键,经过5—10ms时间会逐渐回高电平。

 4.按键的消抖

(1)硬件消抖

    加一个电路,把电线通过电路,经过触发器之类的操作进行电路过滤。

(2)软件消抖

    检测按键按下时,延时时间,再继续操作,松手也同样道理。

二、独立按键控制LED指示灯亮灭

当按下k1时,LED小灯D1亮起,松开按键时D1灭掉;

当按下k2时,   LED小灯全都亮起,再次按下时全都灭掉;

当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位;

有兴趣的小伙伴可以尝试一下将LED小灯亮灭做成二进制递增的形式。

代码示例:

  1. /******************** *******************
  2. *** 项目名称:独立按键控制LED灯开关
  3. *** 项目效果:当按下k1时,LED小灯D1亮起,松开按键时D1灭掉;当按下k2时,LED小灯全都亮起,再次按下时全都灭掉;当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位
  4. *** 连线方式:无
  5. *** 注意事项:无
  6. ********************* *******************/
  7. #include "reg52.h"
  8. #include "intrins.h"
  9. //用u8,u16代替方便编写代码
  10. typedef unsigned char u8; //0—255
  11. typedef unsigned int u16; //0—65535
  12. #define LED P2
  13. /*定义管脚*/
  14. //独立按键
  15. sbit k1 = P3^1;
  16. sbit k2 = P3^0;
  17. sbit k3 = P3^2;
  18. sbit k4 = P3^3;
  19. u16 i ; //定义判读哪一个按键按下
  20. u16 s ;
  21. u16 LedNum; //定义led灯移位
  22. /***************************
  23. ** 函数名称 :Delay_ms
  24. ** 函数作用 :延时函数
  25. ** 输入 :ms(毫秒数)
  26. ** 输出 :
  27. ** 注意 :输入不能超出范围,否则会回到周期
  28. ****************************/
  29. int Delay_ms(u16 ms)
  30. {
  31. unsigned char i, j;
  32. while(ms)
  33. {
  34. _nop_();
  35. i = 2;
  36. j = 199;
  37. do
  38. {
  39. while (--j);
  40. } while (--i);
  41. ms--;
  42. }
  43. }
  44. /***************************
  45. ** 函数名称 :Key_k1
  46. ** 函数作用 :当按下k1时,LED小灯D1亮起,松开按键时D1灭掉
  47. ** 输入 :无
  48. ** 输出 :无
  49. ****************************/
  50. void Key_k1()
  51. {
  52. if(k1 == 0)
  53. {
  54. LED = 0xFE;//让D1亮起来
  55. }
  56. else{
  57. LED = 0xFF;
  58. }
  59. }
  60. /***************************
  61. ** 函数名称 :Key_k2
  62. ** 函数作用 :当按下k2时,LED小灯全都亮起,再次按下时全都灭掉
  63. ** 输入 :无
  64. ** 输出 :无
  65. ****************************/
  66. void Key_k2()
  67. {
  68. if(k2 == 0) //判断按键按下
  69. {
  70. Delay_ms(10); //延时消抖
  71. if(k2 == 0) //再次判断是否按下
  72. {
  73. LED = ~LED; //取反LED灯的状态//这种效果是按下不松手一直亮,松手即灭
  74. }
  75. while(!k2); //判断是否松开按键
  76. }
  77. //== 另一种写法 ==//
  78. // if(k2 == 0) //判断按键按下
  79. // {
  80. // Delay_ms(10); //延时消抖
  81. // while(k2 == 0); //再次判断是否按下
  82. // Delay_ms(10); //检测松手
  83. // LED = ~LED; //这种效果是按下不松手不亮,松手即亮
  84. // }
  85. }
  86. /***************************
  87. ** 函数名称 :Key_k3_k4
  88. ** 函数作用 :当按下k3时,LED小灯向右移位,按下k4时LED小灯向左移位
  89. ** 输入 :无
  90. ** 输出 :无
  91. ** 注意 :这里没有初始化,D8开始没有亮,只是为了方便写函数
  92. ****************************/
  93. void Key_k3_k4()
  94. {
  95. if(k3 == 0) //判断k3按键是否按下
  96. {
  97. Delay_ms(10); //消抖
  98. while(k3 == 0); //再次判断是否按下
  99. Delay_ms(10); //消抖
  100. //== 操作 ==//
  101. LedNum++;
  102. if(LedNum >= 8) //限制控制大小
  103. {
  104. LedNum = 0;
  105. }
  106. LED = ~(0x80 >> LedNum); //移位
  107. }
  108. if(k4 == 0)
  109. {
  110. Delay_ms(10); //消抖
  111. while(k4 == 0); //再次判断是否按下
  112. Delay_ms(10); //消抖
  113. //== 操作 ==//
  114. if(LedNum == 0) //限制控制大小
  115. {
  116. LedNum = 7;
  117. }
  118. else
  119. LedNum--;
  120. LED = ~(0x80 >> LedNum); //移位
  121. }
  122. }
  123. /***************************
  124. ** 函数名称 :Judgement
  125. ** 函数作用 :判断哪一个按键成功按下
  126. ** 输入 :P3
  127. ** 输出 :无
  128. ****************************/
  129. int Judgement()
  130. {
  131. if(k1 == 0)
  132. {
  133. i = 1;
  134. }
  135. if(k2 == 0)
  136. {
  137. i = 2;
  138. }
  139. if(k3 == 0 || k4 == 0)
  140. {
  141. i = 3;
  142. }
  143. return i;
  144. }
  145. /***************************
  146. ** 函数名称 :main
  147. ** 函数作用 :主函数
  148. ** 输入 :
  149. ** 输出 :
  150. ****************************/
  151. void main()
  152. {
  153. while(1)
  154. {
  155. i = Judgement();
  156. switch(i)
  157. {
  158. case 1:
  159. Key_k1();
  160. break;
  161. case 2:
  162. Key_k2();
  163. break;
  164. case 3:
  165. Key_k3_k4();
  166. break;
  167. default:
  168. LED == 0x00;
  169. break;
  170. }
  171. }
  172. }

三、按键实验视频

独立按键控制LED灯视频


总结


以上就是独立按键的简单介绍与应用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/685638
推荐阅读
相关标签
  

闽ICP备14008679号