这个很简单,可以利用单片机的定时器来完成
当有脉冲输入的时候,启动定时器,并对定时器的计数值进行清零
每一次脉冲输入都清零计数值,当脉冲消失后,定时器的计数值达到指定时间则关闭
关闭的同时,调用其它函数,例如你的继电器控制
需要说明的是,我使用的开发板和你的不见得一样,所以端口的使用只能你自己修改了
但程序已经经过硬件测试成功,请放心使用,如果满意记得采纳哦
/***************************************************************************/
#include
sbit P24=P1^0; sbit P25=P1^1; sbit P26=P1^2; sbit P27=P1^3;//数码管位选端口
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
sbit k=P3^7; sbit KK=P1^4;//定义按键和继电器端口
int t,n,s,fe=0;
/***************************************************************************/
void YS(int hs){int hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}//延时函数
/***************************************************************************/
void XS(int xs)//数码管显示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P27=0; YS(5); P27=1;
P0=table[d2]; P26=0; YS(5); P26=1;
P0=table[d3]; P25=0; YS(5); P25=1;
P0=table[d4]; P24=0; YS(5); P24=1;
}
/***************************************************************************/
void main(void)//主函数
{
TMOD=0x01; EA=1; ET0=1; KK=0;//定时器初始化
TH0=(65536-921)/256; TL0=(65536-921)%256;//定时器初值
while(1)
{
XS(t);//调用数码管显示函数
if(k==0)//如果按键被按下
{
YS(10);//延时去抖动
if(k==0)//如果是有效按键
{
TR0=1;//启动定时器,开始计时
n=0;//每次按键都清空定时计数
t++;//按键值累加一次
KK=1;//继电器打开
while(!k){XS(t);}//等待按键松开,并调用数码管显示,避免黑屏
}
}
if(fe==1)//如果没按键输入
{
fe=0;t=0;//清空按键计数值,并设置标识符
KK=0;//继电器吸合
}
}
}
/***************************************************************************/
void int1() interrupt 1 //定时器中断
{
TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;//n等于100时,则为1秒
if(n>1000){TR0=0;n=0;fe=1;}//如果达到指定时间,则关闭定时器,并设置标识符
}
/***************************************************************************/