【51单片机】独立按键控制LED灯(四种形式)

💖 作者简介:大家好,我是泽奀。🏆全栈领域新星创作者  作者周榜:81  总排名:6434 👑 

📝 个人主页:weixin_52632755的博客_泽奀_CSDN博客

🎉 点赞➕评论➕收藏 == 养成习惯😊

📣 系列专栏:【51单片机】系列_泽奀的博客-CSDN博客

💬 总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊

✉️ 我们并非登上我们所选择的舞台,演出并非我们所选择的剧本。

目录

🎃独立按键介绍 

🏓独立按键原理图

🎡独立按键控制LED灯亮灭

🎉C51数据运算 

🎉C51基本语句C51数C51数据运算C51数据运算据运算

🎄独立按键控制LED灯状态

🎋按键的抖动

🏒独立按键控制LED显示二进制

🥍独立按键控制LED灯移位


🎃独立按键介绍 

  • 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
  • 英文:independent press button
  • 了解:独立按键具有四个"头",独立按键主要有四个部分:1、底座,2、金属弹片(这个金属弹片是鼓起来的,当你按下去的时候它会变平,松手的时候又会鼓起来的),3、就是按键的头,4、就是金属的盖子。那么在相同的两个引脚当中其实它就是内部连接起来的金属片,无论你按不按下去,它前后的两个引脚都是连接起来的。就是始终都是具有导通性质的,向外具有两个接触的点。按下的时候四个引脚全部都是连接的,松手的时候两边分别连接,之间是断开的。
  • 如下图实物所示:

🏓独立按键原理图

  •  这里总共有四个独立按键,它们公共的一段都接到了GND电源的负极,另一端引出了四个编号是连接到单片机板子中的MCU上面,还有一段是接到了IO口上。如下图所示:

  • 那我们就知道了单片机上电的时候所有的IO口默认都是高电平,那么就是当是如果按键没有按下的时候那么这个IO口保证的就是高电平,按下的话那么这个IO口就变成低电平了。寄存器会检测IO口的电平,然后在读回来这个寄存器当中。如果按键松开"我"因该去读取这个寄存器那么它其实就是一个高电平默认为1的一个高电平,反之。那么根据这个现象我们可以得知我们的独立按键是不是被按下了。

🎡独立按键控制LED灯亮灭

#include <REGX52.H>
int main(void)
{
	while(1)
	{
		if(P3_1==0 || P3_0==0)	//如果K1按键或K2按键按下
		{
			P2_0=0;		//LED1输出0,点亮
		}
		else
		{
			P2_0=1;		//LED1输出1,熄灭
		}
	}
}

 注意:独立按键K1按键与K2按键按键网络编号是相反的,K1=P3_1、K2=P3_0。

🎉C51数据运算 

算术运算符:加减没什么好说的,乘法和除法注意一下符号!以及除法是取整的不是四舍五入按照数学的运算来的,比方举个例子:五除以二,按照数学的方式是:2.5,在C语言当中是2取最小整数,当然这是int数据类型当中是这个样子。也有单精度浮点型(float)和双精度浮点型(double)它们依旧是等于2.5的。那么取余(%)是什么意思呢?其实很简单就是还是以五除以二的话在小学当中是2...1,那么这个其实就是5%2=1了。再比方说102/10 = 10...2 那么102%10 = 2,所以除号与取余就是这个意思了。赋值就是把右边得出的值或者说是结果赋值到你左边的这个变量。

判断运算符:这个没什么好说的,就是在表达式的值经常有判断表达式,如果你的表达式的值为真,那么就执行表达式里面大括号(作用域)里面的内容。在这里注意下等于的判断表达式的符号。

逻辑运算符:假设 a = 1,b = 0;

  • && 称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。
  •  ||   称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真 (A || B) 为真。
  •  !    称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。

位运算

  • 按位与操作,按二进制位进行"与"运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
  • 按位或运算符,按二进制位进行"或"运算。运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;

  • 异或运算符,按二进制位进行"异或"运算。运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

  • 取反运算符,按二进制位进行"取反"运算。运算规则:~0001 = 1110;

  • << 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)

  • >> 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

🎉C51基本语句C51数C51数据运算C51数据运算据运算

这些语句都是单片机以及变成语言比较重要的语句!像这个判断语句if以及switch语句,以及while和for的循环语句在单片机中都是很重要的。这些都是必须要掌握的知识点!大家可以多上手代码,熟练掌握这些判断语句和循环语句。任何复杂的程序都可以由顺序、选择、循环来进行程序代码的实现,上面的代码就是典型的if—else的语句。

🎄独立按键控制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--;
	}
}
int main(void)
{
	while(1)
	{
		if(P3_1==0)			//如果K1按键按下
		{
			Delay(20);		//延时消抖
			while(P3_1==0);	//松手检测
			Delay(20);		//延时消抖
			
			P2_0=~P2_0;		//LED1取反
		}
	}
}

🎋按键的抖动

  • 对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

在按键闭合的时候会产生一些抖动没有按键按下的话它就是一个高电平(1)(单片机上电的时候所有的IO口默认都是高电平。在我们按下按键的时候它就会变成(0),并且由于它的是机械触电会弹开,然后上下抖动几下,然后才会稳定的变成(0)。抖动的时间上面图中也表示的是(5~10)ms。当抖动消失的时候进入了一个稳定的低电平(0),这个持续时间是看你手什么时候松开这个按键。在松手的时候也会产生抖动,它也不会突然变成高电平(1),也会抖动产生时间为(5~10)ms。最后,松手。 

按键的消抖有两种方法:

  1. 加个线,把这个线通过这些电路里面进行一些触发器等等,通过一些电路来进行操作,把这个抖动进行一些过冲,然后再给我们单片机进行点上。比较麻烦!
  2. 通过软件来进行一个延迟函数,把这个消抖进行操作!

🏒独立按键控制LED显示二进制

#include <REGX52.H>
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
int main(void)
{
	unsigned char LEDNum = 0;
	while(1)
	{
		if(P3_1==0)			
		{
			Delay(20);		
			while(P3_1==0);
			Delay(20);		
							
			LEDNum++;	
			P2=~LEDNum;      
		}
	}
}
  • 这里用 unsigned char 类型是因为:无符号字符型(所占1字节 = 8bit位)刚好对应着8位二进制的数据,那这八位二进制的正好这个P2口和这个寄存器51单片机保持一致。
  • 注意:P2口上电之后和单片机的IO上电一样都是默认的是高电平! 1111 1111
  • LEDNum取反给P2的话,其实变量取反给P2的值上它是并不会改变这个变量的值。它的值还是没有取反的值。在等号右边的话,它并不会改变LEDNum的值。其实就是取反当中你取反的值是右值就不会被改变。

🥍独立按键控制LED灯移位

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
int main(void)
{
	unsigned char LEDNum = 0;//进行初始化
	P2 = 0xFE;			
	while(1)
	{
		if(P3_1 == 0)	//如果当独立按键K1按下的话 —— LED灯移位
		{
			Delay(20);	//按键消抖
			while(P3_1 == 0);		//检测松手
			Delay(20);	//按键消抖
			
			LEDNum++;	//自增++	
	  		if(LEDNum>=8)
			{
				LEDNum=0;
			}
			P2 = ~(0x01<<LEDNum);
		}
		if(P3_0 == 0)	//第二种情况:如果当独立按键K2按下的话  —— LED灯移位
		{
			Delay(20);	//按键消抖
			while(P3_0 == 0);		//检测松手
			Delay(20);	//按键消抖
				
			if(LEDNum == 0)		
			{
				LEDNum=7;
			}
			else
			{
				LEDNum--;//自减--
			}
			P2 = ~(0x01<<LEDNum);
		}
    }
}
  • P2口当中的P一定是要大写的,标识符一定要严格区分大小写!
  • 当你在定义一个局部变量的时候一定要注意赋值初始值,在全局变量定义的话默认为0!
  • 这里的K1和K2是接错了,K1 = P3_1;K2 = P3_0;K3 = P3_2;K4 = P3_3;

版权声明:本文为CSDN博主「泽En」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_52632755/article/details/120657820

生成海报
点赞 0

泽En

我还没有学会写个人说明!

暂无评论

相关推荐