51单片机入门教程(4)——按键控制
单片机与外界的信息交互主要有两大类,输入信息和输出信息。
之前的博客介绍了通过单片机控制LED灯和数码管向外界输出信息,该教程介绍单片机常用的输入设备——独立按键和矩阵键盘。
一、独立按键
1.1 独立按键的原理
独立按键一共有四个针脚,两个短针脚之间默认不导通,两个长针脚之间默认导通。实物图如图:
1.2 独立按键的仿真电路
在Proteus中对按键进行了简化,只有两个接线针脚。按键的一端接到单片机的IO口上,另一端与GND连接。当按键按下时,单片机的IO口与GND连接,端口电平被拉低。因此通过读取端口电平即可获知按键状态。
仿真电路如图:
1.3 按键消抖
关于按键抖动:
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。即单片机在按键被按下的一瞬间检测到的信号是很多次的忽高忽低的电平信号,如图:
这种信号是不稳定的。因此,我们需要使用按键消抖的算法使单片机获取到正常稳定的信号。
为了避免在最不稳定的时候采集信号,常用的操作是延时,即当检测到低电平输入时,延时若干时间(常用20ms),再次采集信号,如果仍是低电平,则为按键被按下。
示例程序如下:
/**************************
* 说明: 按键被按下时led灯灭
**************************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
//定义按键端口
sbit key = P1^0;
//定义LED灯端口
sbit led = P2^0;
//延时函数声明
void delay(uint xms);
//程序入口
void main(){
while(1){
//第一次判断
if(key == 0){
//延时20ms 消除抖动
delay(20);
//第二次判断
if(key == 0){
led = 0; //灯灭
}
else {
led = 1; //灯亮
}
//等待按键被松开
while(!key); //当按键未松开时,key为0,执行该死循环。
}
}
}
void delay(uint xms)
{
uint i,