怎么用一个按键控制小灯,按一次小灯不停闪烁,再按一次灭掉。问题很简单(其实问题是在一个论坛上看到的),但是我看了好几楼的回复,都没有看到完整的答案。下面我们来分析下这个问题:1个小灯,其实就是LED灯;需要按键控制它的闪烁和灭,这样还需要一个按键;控制LED闪烁需要单片机开实现(问题提问者主要是要单片机程序)。按照上面的分析,我们画出图1的电路图(单片机部分省略)。
LED驱动和按键控制电路
如图1所示,LED和R1组成了LED驱动电路,这里我们采用单片机拉电流的驱动方式,当单片机IO口(P1.0)输出高电平时,电流从单片机IO口输出,流过LED和电阻R1,最终流到电源地,从而LED发光。当单片机IO口(P1.0)输出低电平时,P1.0电平和电源地电平一样,没有电压差,就不会有电流流过LED,所以LED不会发光。也就是说只要我们通过程序控制单片机IO口P1.0口的电平就可以实现控制LED的亮灭,那我们控制IO的电平重复出现“高---低---高---低……”就可以实现LED闪烁了。今天的问题是用按键控制实现闪烁和灭。下面我就来说按键的事。
图1中R2和S1组成按键电路,R2为上拉电阻,S1为我们真正的控制按键。R2的作用是给单片机IO口(P1.1)提供一个确定的状态,假如没有R2这个电阻,那在上电的瞬间或者是外接电磁干扰过大的时候,P1.1的状态可以会出现在高低电平上的跳变,这是我们不希望出现的。还有一点,假如没有R2这个电阻,在按键没有按下的情况下,IO(P1.1)是悬空的,这样P1.1的电平是不确定的。所以这个上拉电阻还是很有必要的。接下来说按键S1,如图1所示,当按键按下后,IO(P1.1)电平会被拉低为低电平,因为当按键按下后,P1.1直接通过按键接到电源地。当按键没有没按下时,IO(P1.1)电平被电阻R2上拉到高电平。这样一来,按键S1按下时,IO(P1.1)为低电平,按键S1没被按下时,IO(P1.1)为高电平,我们就可以读取IO(P1.1)的电平状态来识别按键是否被按下,从而控制LED的亮灭或者是闪烁。
以上是电路原理,现在我们说说程序的原理。程序部分主要的难点在如何实现按键第一次按下去控制LED闪烁,第二次按下后LED熄灭。这里我们说到了按键第一次按下,第二次按下,这是我们人可以这样说,那我们程序怎么办呢,同样是要编程去记录按键按下的次数,当程序判断当前为为第一次按下按键,就去控制LED闪烁,程序判断当前为第二次按下按键后,就去执行LED灭的程序。