51单片机——关于51单片机独立按键控制LED状态
#include <REGX52.H>
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms)
	{

		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
void main()
{
	while(1)
	{	
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
			P2_0=~P2_0;
		}
	}
}

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
所以我们需要通过Delay(20)延时20ms来过滤掉这个抖动

P3_1表示独立按键K1。当P3_1按下时会接地,即P3_1=0。

所以我们用if(P3_1==0)来判断K1按键是否按下

当按下时我们首先延时20ms过滤掉按键抖动

之后我们再用while循环继续判断K1按键是否仍处于按下状态,检测P3_1=0时,继续循环上边的语句,否则跳出这个语句执行下一个语句

当K1处于松开按键状态时,K1没有接地,P3_1不等于0,跳出while循环,执行Delay(20)过滤松开前的按键抖动,然后再执行按位取反操作

单片机默认输出高电平就为1,开关按下第一次时松开之后取反P2_0,1变为0,低电平亮灯,按下第二次时松开时,取反0变1,高电平,灯灭

LED灯为一个发光二极管,导通时才发光,左边为高电平,右边默认高电平

所以当右边为低电平时,才导通发光

当右边为高电平时二极管截至不发光

上一篇
下一篇