51单片机玩转物联网基础篇03-独立按键
2022-05-16 来源:eefocus
前言
上一节,我们完成了51单片机控制LED灯,并实现流水灯效果,本节我们学习操作独立按键,并通过两个按键,分别打开和关闭所有LED灯,按键作为输入设备,在系统开发过程中十分常见,一般来说,按键可以设置系统参数、控制系统运行状态。
一、基础知识
1.按键简介
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号会发生变化,常见的按键开关如下图所示,其中A端引脚在同侧,默认断开,B端引脚在不在同侧,默认导通,当按键按下时,A端导通,B端断开。
此类开关,按下时候通常不会立刻导通,开和关的瞬间伴有一连串抖动,一般为5ms到10ms,具体抖动时间由按键机械特性决定,抖动过程如下图所示:
为了解决这个问题,通常可以采用硬件消抖和软件消抖两种方式,硬件消抖原理是利用电容平波,再经过施密特反相器整形之后就得到了没有毛刺的脉冲波,大多数实际项目中为了节约成本,通常采用软件滤波方式,软件滤波一般采用延时方式处理,当首次检测到按键按下时,软件延时10ms左右时间,然后再次查看按键状态,如果还是按下则认为有按键按下。
2.按键检测原理
简单的独立按键连接电路原理图如下所示
独立按键电路中,按键一边接GND,另一边接到单片机IO口上,当按键按下时候,按键两边1和2导通,单片机P2.5引脚直接连接GND,电平为低电平,所以只需要让单片机不断的检测P2.5引脚的I/O口是否为低电平,一旦程序检测到I/O口引脚变为低电平说明按键按下了。
3.开发板按键硬件电路
实验使用开发板独立按键部分原理图如下,K1、K2、K3、K4四个按键一端引脚均接地,另一端接到单片机不同I/O口,可以根据不同I/O口的电平检测按键是否按下。
二、实例
1.创建工程
将上一节工程复制出来,并修改名字为02-key
2.程序修改
#include sbit key1 = P2^4; sbit key2 = P2^5; unsigned char val = 0; void delay_ms(int ms) { int i = 0, j = 0; for (i = ms; i > 0; i--) { for (j = 110; j > 0; j--); } } int main(void) { while(1) { if (0 == key1 || 0 == key2) { delay_ms(10); if (0 == key1) { P1 = 0x00; } if (0 == key2) { P1 = 0xFF; } } delay_ms(5); } } 程序中检测KEY1和KEY2的状态,当按下KEY1时候,点亮LED3-LED10 8个LED灯,KEY2按键按下时候,熄灭LED3-LED10。 三、运行 编译代码后,按照第一节内容,将生成的project.hex文件下载到板子中,按下KEY1时候,效果如下图所示: 点击KEY2时候,灯熄灭,由于比较简单,就不放图了。