如何检测一个开关 信号的稳定性,如按动开关后,滤波50ms,然后检测50ms内信号是不是一直稳定,如在50ms内出现抖动,则判定为不良,如50ms内信号一直稳定,则判定为良品。下面是我编辑的一个例子程序,但无法检测信号是否稳定,请高人指点。
/*单个按键开关检测程序 练习定时计数器使用*/
#include<reg52.h>
#define uchar unsigned char
sbit d0=P1^0; //定义KEY
sbit start=P1^1; //开始开关
sbit d1=P2^1; //KEY指示灯
sbit d2=P2^0; //NG指示灯
sbit d3=P2^2; //GOOD指示灯
bit flag;
uchar tt=0;
uchar c1=0;
/*延时1ms函数*/
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
for(i=0;i<123;i++);
}
/*按键检测函数*/
void scan_key()
{
while(d0==0)
{
delay_ms(50);
if(d0==0)
{
d1=0;
TR0=0;
while(d0==0);
d1=1;
c1++;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
tt=0;
}
}
}
/*按键次数检测函数*/
void judge_key()
{
if(c1==2)
{
d3=0;
flag=0;
TR0=0;
tt=0;
}
}
/*初始化函数 开始开关检测函数*/
void judge_start()
{
while(start==0)
{
delay_ms(50);
if(start==0)
{
c1=0;
d1=1;
start=1;
d2=1;
d3=1;
tt=0;
TMOD=0x11;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
flag=1;
}
}
}
/*主函数 按键检测*/
void main()
{
while(1)
{
judge_start();
while(flag)
{
scan_key();
judge_key();
}
}
}
/*定时器中断函数*/
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==80)
{
flag=0;
d2=0;
TR0=0;
d3=1;
flag=0;
c1=0;
}
}
|