单片机-89C51部分:6、按键
飞书文档https://x509p6c8to.feishu.cn/wiki/EtkHw8MG0ipz3NkHlZEcwpEnn4g
一、应用场景:
轻触开关、按键、电容开关、光栅传感器、微动、关电开关
二、原理:
轻触按键可以理解为两根导线,按下时导线连接,松开时导线断开。我们可以看下原理图:
按键按下时,引脚会被连接到GND,这时候引脚是低电平,按键松开时,引脚会被上拉到电源,这时候引脚会变成高电平,那我们就可以通过读取引脚的电平变化,来判断按键是按下还是松开了。
什么是电压?什么是电平?高电平?低电平?
以TTL电路为例:
TTL电源电压是3.3V,高电平是2.4V--3.3V,低电平0V--0.8V,按照惯例,使用1来表示高电平,使用0表示低电平。
三、按键值读取
| |
看原理图可知,板卡上有三个按键,分别接到P3.5 P3.6 P3.7三个IO上
#include <reg52.h>sbit led1= P2^7;
sbit key1 = P3^7;void main()
{while(1){//当按键按下时灯切换if(key1 == 0){led1= ~led1;}}
}
四、按键去抖
上面的代码,在实测效果时,有时候我们会发现按下抬起时,灯会变化两次状态,其实这是因为按键在闭合和断开时,机械触点会存在抖动现象,所以需要消抖。
#include <reg52.h>sbit led1=P2^7;
sbit key1 = P3^7;//延时ms函数,参数用来改变延时的具体时间
void delay_ms(unsigned int xms) //@12MHz
{unsigned int i, j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}
}//主函数
void main()
{while(1){//当按键按下时灯切换if(key1 == 0){delay_ms(10);if(key1 == 0){led1= ~led1;delay_ms(1000);}}}
}