控制/MCU
接前两集,这集我们实现用按键控制LED灯的亮灭。首先,仍旧是分析硬件威廉希尔官方网站 原理图:
四个按键,分别接到了单片机IO口的P3.2-P3.5,从原理图分析,按键按下时,IO口与GND相连,此时IO接收到的是低电平信号。因此,我们的按键是低电平有效。当然,这种设计也与51单片机IO内部结构中的弱上拉电阻有关。
那么可以编写程序,接口宏定义和延时函数定义
#include < reg52.h >
sbit KEY0=P3^2;//定义按键引脚
sbit LED0=P1^0;
void delay_ms(unsigned int nms)
{
unsigned char cnt=125;
unsigned char i,j;
for (i=0;i< nms;i++)
for(j=0;j< cnt;j++);
}//这里我们经验值给定是125个for循环为1ms
主函数编写
void main()
{
while(1)
{
if(KEY0==0)//检测低电平,也就是按键是否按下
{
delay_ms(10);//消抖延时
if(KEY0==0)
{
LED0=~LED0;
while(!KEY0);//确保松开了按键,防误触
}
}
}
}
肯定有小伙伴们好奇,为什么要两次确认按键按下,而且中间还有10ms的延时程序。这是因为按键按下的过程并不是我们以为的完美的信号:
而是有着抖动边沿的信号
这些毛刺就会影响按键的识别精确度。而通常我们人手按下一次低电平能够维持25ms以上,所以我们先通过延时过渡前面从高电平转低电平的时间,尽可能地直接进入到低电平这一稳定的环节,所以采取经验值5-15ms的消抖延时。
除了这种软件上的消抖,还有硬件消抖的办法,在按键两端并联电容,借助电容的充放电过程,消耗掉抖动的那部分电信号,缺点是大批量生产时考虑电容的成本。
全部0条评论
快来发表一下你的评论吧 !