【51单片机】独立按键控制LED灯亮灭,四种形式详解

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

算术运算符:加减没什么好说的,乘法和除法注意一下符号!以及除法是取整的不是四舍五入按照数学的运算来的,比方举个例子:五除以二,按照数学的方式是: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)。抖动的时间上面图中也表示的是**(510)ms**。当抖动消失的时候进入了一个**稳定的低电平(0)**,这个持续时间是看你手什么时候松开这个按键。在松手的时候也会产生抖动,**它也不会突然变成高电平(1)**,也会抖动产生时间为(510)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!
  • 收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
    img
    img

    如果你需要这些资料,可以戳这里获取

    一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

    都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    -1715689124508)]
    [外链图片转存中…(img-52TrH4zm-1715689124509)]

    如果你需要这些资料,可以戳这里获取

    一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

    都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    作者:普通网友

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【51单片机】独立按键控制LED灯亮灭,四种形式详解

    发表回复