打印

如何检测开关信号的稳定性?

[复制链接]
841|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
夏了个夏天|  楼主 | 2014-12-22 14:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何检测一个开关 信号的稳定性,如按动开关后,滤波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;
        }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

73

帖子

0

粉丝