51单片机实现按键控制

目录

原理

实现

按键检测

按键检测函数

关于消抖

检测松开

延时

主函数

尾声


原理

在开发板上,按键如果一端连接的是电源,那么按键会持续给单片机对应的接口输入一个高电平,就是输入1,这时候如果按下按键,那么该接口的电平会被拉低,就是输入的是一个0。

如果按键的一端连接的是地线的话,就和接电源的相反,就是一直输入0,按键按下输入1。

关于按键的一端接的什么,可以看自己的开发板的电路分布图。vcc就是电源,gnd就是地线。

通过按键可以让接口的输入产生变化,这样我们就可以利用这个变化去进行按键对单片机的其他部分(led灯之类的)的控制。

实现

按键检测

在主函数里面利用死循环让单片机一直对按键进行检测,如果按下按键就进行特定的功能实现,我这里使用的名为aj的函数就是检测按键函数(我英语不好,所有命名基本上都是拼音QAQ)

while(1)//利用死循环进行检测是否有按键按下
		aj();

按键检测函数

通过编写按键检测函数从而在按键按下的时候达到特定功能

void aj(){
	if(key_1!=1) //如果按键按下,那么按键连接的接口电压会被拉低
	{
		delay(5);//消抖
		if(key_1!=1)//防止误触,如果是不小心按到了那么就不会触发
		{
			P1_1=~P1_1;//控制led灯亮灭
			while(key_1!=1);//检查是否松开按键,如果没有松开则不会结束
		}
	}
}

关于消抖

当我们按下按键的时候不是一下子就按到底的,它会有一个按键按下的过程,这时候的电平是不稳定的,所有就需要进行消抖,让电平稳定。

消抖的话,我们可以通过一个延时,让单片机等一会,这样等单片机再检测电平的时候我们已经按到底了,这样就可以产生电平的突变。

检测松开

利用一个死循环,如果该按键没松开,那么对应的接口就一直保持低电平,这样就保证了按键按一次只有效一次,如果没有检测的话,就按一次按键就会有效很多次。

延时

因为需要进行消抖操作所以我们需要编写一个延时函数进行消抖。我们利用软件进行延时。

#define uchar unsigned char

void delay(uchar sj)
{
	uchar x,y;
	for(x=sj;x>0;x--)
	{
		for(y=255;y>0;y--)
		{
		}
	}
}

主函数

将各个部分拼接起来就构成主函数了,也可以使用模块化编程。

#include <REGX52.H> 
#define uchar unsigned char
sbit key_1=P3^2;//定义key_1的接口
void delay(uchar sj)
{
	uchar x,y;
	for(x=sj;x>0;x--)
	{
		for(y=255;y>0;y--)
		{
		}
	}
}

void aj(){
	if(key_1!=1) //如果按键按下,那么按键连接的接口电压会被拉低
	{
		delay(5);//消抖
		if(key_1!=1)//防止误触,如果是不小心按到了那么就不会触发
		{
			P1_1=~P1_1;//控制led灯亮灭
			while(key_1!=1);//检查是否松开按键,如果没有松开则不会结束
		}
	}
}
void main()
{
while(1)
{
    aj();
}
}

尾声

关于按键的使用,对于后续对各种功能选择性实现时,需要经常使用到按键。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值