用到的有51单片机、轻触按键(K1-K8)、LED灯
轻触按键图示:
元件在同一面相隔较近的初始不导通、不在同一面相隔较远的初始导通
初始没有硬件消抖电路
JP5可以接51单片机的四个端口(之一)
单片机的端口初始时是高电平(默认拉高)
通过按键触发接地(拉为低电平)
如图波型:按键在闭合和断开时,触点会存在抖动现象(杂波信号约5ms-10ms)
缺点:对于一些高低电平判断机制,容易出现或提前或超时或多次等触发现象
解决方法:
- 硬件消抖(适用于按键较少的情况下)
- 软件消抖
如图硬件消抖电路:
按键松开的情况下,电容充电(假设已经充满:两端电压约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();
}
}