51单片机_按键检测
一、独立按键介绍
轻触按键相当于是一种电子开关
按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开
由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开。因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定,一般为5ms到10ms。
按键稳定闭合时间的长短由操作人员的按键动作决定,一般为零点几秒至数秒。按键抖动会引起按键被误读多次。为了确保CPU对按键的依次闭合仅作一次处理,必须及时进行消抖。
按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。为了使电路更加简单,通常采用软件消抖。
软件消抖一般来说一个简单的按键消抖就是先读取按键的状态,如果得到按键按下之后,延时10ms,再次读取按键状态,如果按键还是按下状态,那么说明按键已经按下。其中的延时10ms就是软件消抖处理。
常用的软件去抖动方法:
- 先设置IO口为高电平,由于开发板IO有上拉电阻,默认IO为高电平;
- 读取IO口电平确认是否有按键按下;
- 如果有IO电平为低电平后,延时几个毫秒;
- 再读取该IO电平,如果仍为低电平,说明按键按下;
- 执行相应按键的程序;
二、独立按键检测原理
独立按键电路构成是由各个按键的一个管脚连接在一起接地,按键其它引脚分别接到单片机IO口。
单片机的IO口既可作为输出也可作为输入使用,当检测按键时用的是它的输入功能,独立按键的一端接地,另一端与单片机的某个IO口相连,开始时先给IO口赋一高电平,然后让单片机不断检测该IO口是否变为低电平,当按键闭合时,相当于该IO口通过按键与地相连,变成低电平,程序一旦检测到IO口变为低电平则说明按键被按下,然后执行相应的指令。
三、独立按键应用实践
1)实现按键控制LED功能
- #include <REGX52.H>
- #include "Delay.h"
- /**
- * 主函数
- */
- void main()
- {
- while(1)
- {
- if(P3_1 == 0) // 如果K1按键按下,则为低电平
- {
- Delay(20); // 延时消抖
- while(P3_1 == 0); // 松手检测
- Delay(20); // 延时消抖
-
- P2_0 = ~P2_0; // LED1 取反
- }
- }
- }
复制代码 这段代码依旧存在不灵敏的情况,下面是改进:- #include <REGX52.H>
- #include "Delay.h"
- void main()
- {
- while(1)
- {
- if(P3_1 == 0) // 检测按键是否按下
- {
- Delay(10); // 延时消抖
- if(P3_1 == 0) // 再次确认按键确实按下
- {
- P2_0 = ~P2_0; // 执行LED取反
-
- // 等待按键释放,避免连按
- while(P3_1 == 0); // 等待按键松开
- }
- }
- }
- }
复制代码 2)按键控制LED灯二进制显示
- #include <REGX52.H>
- #include "Delay.h"
- void main()
- {
- unsigned char LEDNum=0;
- while(1)
- {
- if(P3_1==0) //如果K1按键按下
- {
- Delay(10); //延时消抖
- if(P3_1==0)
- {
- LEDNum++; //变量自增
- P2=~LEDNum; //变量取反输出给LED
- while(P3_1==0); //松手检测
- }
- }
- }
- }
- // 实现原理:
- // +000 LEDNum 0000 0000 取反 —> 1111 1111
- // +001 LEDNum 0000 0001 取反 —> 1111 1110
- // +002 LEDNum 0000 0010 取反 —> 1111 1101
- // +003 LEDNum 0000 0011 取反 —> 1111 1100
- // ···
- // +255 LEDNum 1111 1111 取反 —> 0000 0000
- // +256 溢出 -> LEDNum 0000 0000 重新开始计数
复制代码 3)按键实现LED左右移动
[code]#include #include "Delay.h"unsigned char LEDNum;void main(){ P2=~0x01; //上电默认LED1点亮 0000 0001 取反 -> 1111 1110 while(1) { if(P3_0==0) //如果K1按键按下,右移 { Delay(20); while(P3_0==0); Delay(20); LEDNum++; //LEDNum自增 if(LEDNum>=8) //限制LEDNum自增范围 LEDNum=0; P2=~(0x01 |
|
|
|
|
|
相关推荐
|
|
|