我是靠谱客的博主 坚定嚓茶,最近开发中收集的这篇文章主要介绍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左移或右移。如果你需要单独左移就只需要一个按键,把右移代码删了,同理单独右移也是一样。

最后

以上就是坚定嚓茶为你收集整理的51单片机独立按键控制合集的全部内容,希望文章能够帮你解决51单片机独立按键控制合集所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部