你出这个程序实现起来不麻烦,重要的是高电平的捕获和时间计数,不知道你使用的是什么单片机,如果是51单片机的话,51单片机有定时器和外部中断,你可以使用定时器计时。
1、初始化定时器中断,中断时间是每10ms(这是10ms是根据你的状态变化的精度来的额,可以自行设置进入定时器中断的时间)进入一次中断并设置2个变量counter1(用来记录60s)和counter2(用来记录10s)来记录状态改变之后的时间;
2、设置两个变量记录IO口状态(触发信号的状态),一个变量兼做current_state另一个口叫做last_state,分别表示当前IO口的状态和上一次IO口的状态,并且每次进入定时器的时候判断这个IO口的状态
伪代码如下:
if(current_state ==1 && last_state == 0) //收到触发信号
{
counter1 = 1; //清空之前的计数值,准备重新开始计数
}else if(current_state ==1 && last_state == 1) //触发信号保持
{
counter1++; //开始计数
}else if(current_state ==0 && last_state == 1) //触发信号关闭
{
counter1 = 0; //清空计数值
counter2 = 0;
}
else
{
counter1 = 0; //清空计数值
counter2 = 0;
}
if(counter1 >= 6000) //计数60s
{
counter1 = 6000; //数值不在继续变大,避免数据溢出
counter2 =1; //10s即使开始
}
if(counter2 != 0) //开始计数
{
counter2 ++;
if(counter2 >= 1000)
{
counter2 = 1000;
关闭继电器
}
}