51单片机学习笔记3 -- 按键输入检测
Posted GenCoder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机学习笔记3 -- 按键输入检测相关的知识,希望对你有一定的参考价值。
学习输出控制之后,学习输入检测,以按键为例
按键检测
1.按键原理图绘制
51开发板的原理图如下
按原理图绘制电路图
2.按键输入检测
1.按键软件消抖
按键一般是利用机械触点的闭合、断开作用,由于机械触点的弹性作用,在其闭合、断开瞬间均存在抖动过程,抖动时间一般在5 -10ms,稳定闭合时间由操作人员的按键动作决定,一般为零点几秒到几秒。
为了保证单片机对一次闭合,仅作一次按键输入操作,必须在编程时候编写必要的程序代码(小段延时)来去除抖动影响,称键盘软件消抖。
2.按键操作电平变化
在上面讲到了软件消抖是为了准确识别单次按键操作,理想中的按键按下的电平输入是直接的高低电平切换,但实际上在按下及松开按键的瞬间,输入电平都会在高低电平中间产生抖动,可参考如下波形图
3.按键检测编程
在按键按下时添加延时,执行完按键操作后使用while函数等待按键释放
#include <reg52.h>
#define ON 0
#define OFF 1
sbit KEY1 = P3^3;
void delay_ms(unsigned int nms)
unsigned int i,j;
for(i=nms;i>0;i--)
for(j=113;j>0;j--);
void main()
P1 = 0xff;
while(1)
if(KEY1 == ON)
delay_ms(10);
if(KEY1 == ON)
P1 = 0x00;
while(KEY1 == ON);
4.实验结果
将工程放进仿真电路上运行,按下按键,点亮P1端口的LED
3.按键控制
将开发板上4个按键都用起来,做不同的LED灯控制,仿真电路如下
其余3个按键的检测代码跟上面的代码一个样,参考代码如下
#include <reg52.h>
#include <intrins.h>
#define ON 0
#define OFF 1
sbit KEY1 = P3^3;
sbit KEY2 = P3^4;
sbit KEY3 = P3^6;
sbit KEY4 = P3^7;
void delay_ms(unsigned int nms)
unsigned int i,j;
for(i=nms;i>0;i--)
for(j=113;j>0;j--);
void main()
unsigned int i;
P1 = 0xff;
while(1)
if(KEY1 == ON)
delay_ms(10);
if(KEY1 == ON)
P1 = 0x00;
while(KEY1 == ON);
if(KEY2 == ON)
delay_ms(10);
if(KEY2 == ON)
P1 = 0xff;
while(KEY2 == ON);
if(KEY3 == ON)
delay_ms(10);
if(KEY3 == ON)
P1 = 0xfe;
for(i=8;i>0;i--)
delay_ms(150);
P1 = _crol_(P1,1);
while(KEY3 == ON);
if(KEY4 == ON)
delay_ms(10);
if(KEY4 == ON)
P1 = 0x7f;
for(i=8;i>0;i--)
delay_ms(150);
P1 = _crol_(P1,-1);
while(KEY4 == ON);
如KEY4按键的操作,_crol_
函数也可以做循环右移流水灯
4.课外科普 – 硬件消抖
硬件消抖主要使用RS触发器或电容等方法实现消抖
一般是在按键电路上并联一个电容来实现硬件消抖,在按键较少时使用(按键较多时不建议采用硬件消抖)
关于并联电容的在按键按下松开时的放电延时和充电延时,可自行百度了解学习
以上是关于51单片机学习笔记3 -- 按键输入检测的主要内容,如果未能解决你的问题,请参考以下文章
ZigBee案例笔记 -- LED控制与按键检测(输入/输出)