使用51单片机实现按键控制LED灯的亮灭

控制/MCU

1814人已加入

描述

接前两集,这集我们实现用按键控制LED灯的亮灭。首先,仍旧是分析硬件电路原理图:

led灯

四个按键,分别接到了单片机IO口的P3.2-P3.5,从原理图分析,按键按下时,IO口与GND相连,此时IO接收到的是低电平信号。因此,我们的按键是低电平有效。当然,这种设计也与51单片机IO内部结构中的弱上拉电阻有关。

led灯

那么可以编写程序,接口宏定义和延时函数定义

#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的延时程序。这是因为按键按下的过程并不是我们以为的完美的信号:

led灯

而是有着抖动边沿的信号

led灯

这些毛刺就会影响按键的识别精确度。而通常我们人手按下一次低电平能够维持25ms以上,所以我们先通过延时过渡前面从高电平转低电平的时间,尽可能地直接进入到低电平这一稳定的环节,所以采取经验值5-15ms的消抖延时。

除了这种软件上的消抖,还有硬件消抖的办法,在按键两端并联电容,借助电容的充放电过程,消耗掉抖动的那部分电信号,缺点是大批量生产时考虑电容的成本。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分