嵌入式51单片机02-独立按键系列

独立按键

一. 独立按键基础知识

  • 轻触按键:相当于一种电子开关,按下开关接通,松开开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
    在这里插入图片描述

  • 按键在闭合和断开时,机械触点会存在抖动现象,所以需要消抖。
    在这里插入图片描述

    • 硬件消抖:
      在这里插入图片描述

    • 软件消抖:

      使用延时函数来进行消抖

      //按键消抖延时函数
      void Delay1ms(unsigned int xms)		
      {
      	unsigned char i, j;
      	
      	while(xms)
      	{
      		_nop_();
      		i = 2;
      		j = 199;
      		do
      		{
      			while (--j);
      		} while (--i);
      		
      		xms--;
      	}
      }
      
      //按键消抖具体判断
      if(k1 == 0)
      {
          Delay1ms(20);
          while(k1 == 0);
          Delay1ms(20);
      	//相关操作
      }
      
  • 开发版原理图
    在这里插入图片描述

    从原理图中可以看出,四个独立按键共地,只需要判断引脚的电平为低电平就可以判断按键是否被按下。

二. 独立按键系列代码

1. 独立按键控制LED(按下灯亮,松开灯灭)
(1)仿真电路图

在这里插入图片描述

(2)源代码
#include "reg52.h"  
#include "intrins.h"


sbit LED1=P2^0;	 
sbit k1 = P3^1;


//延时1ms函数,参数用来改变延时的具体时间
void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		
		xms--;
	}
}

//主函数
void main()
{
	while(1)
	{
		//当按键按下时灯亮
		if(k1==0)
		{
            Delay1ms(20);
            while(k1 == 0);
            Delay1ms(20);
       
            LED1 = 0;
		}
		//当按键松开是灯灭
		else
			LED1 = 1;
	}		
}
(3)实验结果

2. 独立按键控制LED(按键切换灯的亮灭)
(1)仿真电路图

在这里插入图片描述

(2)源代码
#include "reg52.h"  
#include "intrins.h"


sbit LED1=P2^0;	 
sbit k1 = P3^1;


void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

//主函数
void main()
{
	while(1)
	{
		//当按键按下时灯灭或亮
		if(k1 == 0)
		{
            Delay1ms(20);
            while(k1 == 0);
            Delay1ms(20);
            
            LED1 = ~LED1;
		}
	}		
}
(3)实验结果

3. 独立按键控制LED(按键按下,亮1s熄灭)
(1)仿真电路图

在这里插入图片描述

(2)源代码
#include<AT89X51.h>

void delay(int n)
{
	int i,j;
	for (i=n;i>0;i--)
	for (j=110;j>0;j--);
}

void change()
{
	P2_0=1;
	if (P3_1==0)	  //开关
	{
		delay(2);
		if (P3_1==0)
		{
			while(1)
			{
				P2_0=0;
				if (P3_1==0)      //开关
				{
					delay(2);
					if (P3_1==0)
					{
						delay(1000);
						break;
					}
				}
			}
		}
	}
}

void main()
{
	while(1)
	{
		change();
	}
}
(3)实验结果

4. 独立按键控制LED(二进制递增运算)
(1)仿真电路图

在这里插入图片描述

(2)源代码
#include "reg52.h"  
#include "intrins.h"


sbit LED1=P2^0;	 
sbit k1 = P3^1;


void Delay1ms(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		
		xms--;
	}
}

//主函数
void main()
{
	//reverse用作中间变量
	unsigned char reverse=0x00;
	//初始化P2口
	P2 = 0xff;
	
	while(1)
	{
		if(k1 == 0)
		{
             Delay1ms(20);
             while(k1 == 0);
             Delay1ms(20);
          			
			//移位操作
			reverse += 0x01;
			if(reverse >= 0x0f)
				reverse = 0x00;	
		}
		P2 = ~reverse;
	}		
}
(3)实验结果

5. 独立按键控制LED(两个按键控制左右移动流水)
(1)仿真电路图

在这里插入图片描述

(2)源代码
#include "reg52.h"  
#include "intrins.h"


sbit LED1 = P2^0;	 
sbit k1 = P3^1;
sbit k2 = P3^0;

unsigned char LEDNum;


void Delay1ms(unsigned int xms)		
{
	unsigned char i, j;
	
	while(xms--)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	//初始化P2口
	P2 = 0xfe;
	
	while(1)
	{
		//按键k1相关操作,控制左移
		if(k1 == 0)
		{
			//软件消抖
			Delay1ms(20);
			while(k1 == 0);
			Delay1ms(20);
			
			//必须把对数的操作放在P2口之前
			LEDNum++;
			if(LEDNum == 8)
				LEDNum = 0;
			
			//实现左移
			P2 = ~(0x01 << LEDNum);	
		}
		
		//按键k2相关操作,控制右移
		if(k2 == 0)
		{
			//软件消抖
			Delay1ms(20);
			while(k2 == 0);
			Delay1ms(20);	
			
			//必须把对数的操作放在P2口之前
			if(LEDNum == 0)
				LEDNum = 7;
			else
				LEDNum--;
			
			//实现右移
			P2 = ~(0x01 << LEDNum);	
		}
	}
} 
(3)实验结果

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值