51单片机独立按键控制合集

  1. 实验一:当按键按下led灯亮,松开按键led灯熄灭;
  2. 实验二:当按键按下led灯常亮,再次按下按键led灯熄灭;
  3. 实验三:按键控制led以二进制形式显示;
  4. 实验四:按键控制led按位左移或右移;

实验一程序:当按键按下led灯亮,松开按键led灯熄灭;

#include<REGX52.H> //注意这个头文件是REG“X”因为要用到单个接口P3_1口;

void Delay1ms(unsigned int xms)  //延时1ms函数
{
unsigned char i,j;
while(xms)
{
i = 2 ;
j = 239 ;
do
{
while (--j);
}
while (--i);
xms--;
}
}

	void main ()    //按键控制led亮灭,按下亮松开灭
	{
		while(1)    //死循环
		{
			if(P3_1 ==0)		//判断按键是否按下
			{
				P2_0 = 0 ;			//按下led灯亮
				Delay1ms(20);    //按键消抖20ms
			}
			 else  //if是如果,如果满足条件值  else是否者
				{
					P2_0 = 1 ;			//没按下led熄灭
					Delay1ms(20);
				}
			}
		}

电路原理图:(实验一二三四都用这个原理图都可以)

实验二程序:当按键按下led灯常亮,再次按下按键led灯熄灭;

#include<REGX52.H>  //注意是REGX

void Delay1ms(unsigned int xms)  //延时1ms函数
{
unsigned char i,j;while(xms)
{
i = 2 ;
j = 239 ;do
{while (--j);
}while (--i);
xms--;
}
}

	void main ()			//按键控制led点亮,按下亮,再次按下灭
	{
		while(1)
		{
			if(P3_1 ==0)		//判断按键是否按下
			{
				Delay1ms(20);   //按下前消抖20ms
				while(P3_1==0);		//再次判断是否按下
					Delay1ms(20);    //按下后消抖20ms
					P2_0 = ~P2_0;			//按下led灯亮,如果再次按下led灯灭。
			}
		}
	}

实验三程序:按键控制led以二进制形式显示

#include<REGX52.H>  //注意是REGX

void Delay1ms(unsigned int xms)  //延时1ms函数
{
unsigned char i,j;
while(xms)
{
i = 2 ;
j = 239 ;
do
{
while (--j);
}
while (--i);
xms--;
}
}

	void main ()    //按键控制led亮灭,按下亮松开灭
	{
		unsigned char led = 0 ;   //定义变量来计数
		while(1)
		{
			if(P3_1 ==0)		//判断按键是否按下
			{
				Delay1ms(20);    //消抖
				while(P3_1 ==0);  //再次判断
				Delay1ms(20);     //消抖
				
				led++  ;      //每次执行led加1,其实意思就是P2口控制8个led以二进制显示但因为他是低电平点亮高电平反而熄灭所以后面需要加个取反
				P2 = ~led;    //你们自己可以试一下如果不加这个取反会发现他的效果和我们想要的效果相反。
				}
			}
		}

实验四代码:按键控制led按位左移或右移;

#include<REGX52.H>

void Delay1ms(unsigned int xms)  //延时1ms函数
{
unsigned char i,j;
while(xms)
{
i = 2 ;
j = 239 ;
do
{
while (--j);
}
while (--i);
xms--;
}
}

	void main ()    //按键控制led亮灭,按下亮松开灭
	{
		unsigned char led		= 0 ;   //局部变量计位数
		P2= ~ 0x01 ;    //定义初始值
		while(1)
		{
//以下实现按位左移
			if(P3_1 ==0)		//判断按键是否按下
			{
				Delay1ms(20);    //消抖
				while(P3_1 ==0);  //再次判断
				Delay1ms(20);     //消抖
				
				led++;
				if(led>=8)  //控制移动位数
				{
					led = 0 ;
				}
				P2=~(0x01<<led);  //把移动的位数赋值给值,然后初始值按移动的位数进行按位左移;
				}
				
	//不加下面代码就是单纯左移,同理删了上面代码就是单纯右移,如果两个都写就要定义两个按键然后一个按了左移一个按了右移。
	//看自己需要改写,按键和led灯的接口也可以根据你自己的原理图改写。
				
//以下实现按位右移
				if(P3_0 ==0)		//判断按键是否按下
			{
				Delay1ms(20);    //消抖
				while(P3_0 ==0);  //再次判断
				Delay1ms(20);     //消抖
				
			if(led==0)   //因为我们定义的变量led是无符号型,如果直接减减不可能减为负数
				led = 7 ;  //所以判断如果减到0就重新给他赋值
			else
				led--;   //如果没减到0就继续减减
			
				P2=~(0x01<<led);  //把移动的位数赋值给值,然后初始值按移动的位数进行按位右移;
				}
			}
		}

实验四两个按键原理图:

注意事项:

1.以上代码头文件都是:#include<REGX52.H> ,区别在于他里面定义了P3的某一位如(P3_1),如果是reg52.h会报错,说没有定义。

2:仔细看这几个实验其实大部分代码都一样,只有按键判断完后面的代码,才是真正实现效果的代码,大部分只需要在这里改动就可以完成你想要的效果。

3.实验四的代码是两个按键控制led左移或右移。如果你需要单独左移就只需要一个按键,把右移代码删了,同理单独右移也是一样。

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值