我想丢掉51单片机之独立按键

 

用到的有51单片机、轻触按键(K1-K8)、LED灯

轻触按键图示:

元件在同一面相隔较近的初始不导通、不在同一面相隔较远的初始导通

初始没有硬件消抖电路

 

 

JP5可以接51单片机的四个端口(之一)

单片机的端口初始时是高电平(默认拉高)

通过按键触发接地(拉为低电平)

 

如图波型:按键在闭合和断开时,触点会存在抖动现象(杂波信号约5ms-10ms)

缺点:对于一些高低电平判断机制,容易出现或提前或超时或多次等触发现象

解决方法:

  1. 硬件消抖(适用于按键较少的情况下)
  2. 软件消抖

 

如图硬件消抖电路:

按键松开的情况下,电容充电(假设已经充满:两端电压约5v)

按键按下时电容放电(不跳变),放电需要一定的时间(替代了杂波信号的那段时间)

按键再次松开时,电容开始充电(不跳变),充电需要一定的时间(替代了杂波信号的那段时间)

 

软件消抖:(未用到计时器)

利用波形图中的稳定闭合时间段

 

 

 

 

编程以P0^0接Key1,P0^1接Led1实现按下Key1点亮Led1,再次按下Key1熄灭Led1(循环)

尽量不采用P3端口(外界太多外设且复用很多功能)、P1^7经JP165与165的Pin9短接等

#include<reg51.h>

typedef unsigned char u8;

sbit Key1_JP5_8=P0^0;

sbit Led1_J12_8=P0^1;

void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

void FreestandingKeypress()
{
	if(Key1_JP5_8==0)
	{
		delay10ms();//延时消抖
		if(Key1_JP5_8==0)
		{
				Led1_J12_8=~Led1_J12_8;
		}
			while(!Key1_JP5_8);
//判断按键是否松开,如果长按(取得这次按键按下的取反效果,避免长按触发循环调用FreestandingKeypress()(一直执行(if语句))
	}
}

void main()
{
	Led1_J12_8=0;//P0^1初始拉高(灯亮)
	while(1)
	{
		FreestandingKeypress();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值