• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

这个单片机继电器的控制器程序实在是不知道怎么写了 求指点

f93d5b9a14c240d7 2020-07-25 浏览量:397
想做个继电器的控制器 单片机收到高电平触发信号后计时60秒 高电平超过60秒 断开继电器 并保持10秒 (10秒内即使触发信号变为低电平继电器也不吸合)如果触发信号在60秒内由高电平变为低电平 继电器保持吸合状态不变 望大神给指点 谢谢
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你出这个程序实现起来不麻烦,重要的是高电平的捕获和时间计数,不知道你使用的是什么单片机,如果是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;

           关闭继电器

        }

    }



    • 发布于 2020-07-27
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:5
  • 用外部中断上升沿触发,然后中断里面开启定时器,并且驱动输出高电平,同时设置一个标志变量记录计时中,然后主程序判断时候有下降沿和这个标志位来改变电平,到了60秒后把标志位复位就可以了,同时计时10s改变低电平
    • 发布于2020-07-25
    • 举报
    • 评论 0
    • 0
    • 0

  • GPIO控制继电器的动作,定时器计时,还有一个GPIO输入,可以用中断,在输入中断中打开定时器,在定时器中断中控制继电器
    • 发布于2020-07-25
    • 举报
    • 评论 0
    • 0
    • 0

  • 我觉得是你的逻辑还没有理清楚(从你的问题描述还存在一定混淆歧义感觉),先用信号图,或者逻辑转换关系来清楚的表述要求,再去编程。

    在这些图,或者信号转换中,标明前置条件,转换条件等等,因为按理这样的控制器应该可以重复使用(或者再有外置条件重置为初始状态等),从你现在的描述中看不到这样的情况,这表明描述是不完整的。


    我从你的描述中截取理解一下:

    1. 你现在的控制初始状态是 继电器吸合、触发信号低电平

    2. 触发信号转成高电平,定时器1开始从0计数

    3. 如果定时器1计时60秒内,触发信号变为低电平,则 定时器1停止计数,转回1状态

    4. 若高电平维持超过 定时器1计时60秒, 断开继电器,计数器2开始计数,在10秒内,即使高电平转为低电平(无论触发信号状态),仍维持继电器断开

    5.(现在缺断开继电器10秒后情况?重新吸合,或者要外部某种情况下重置为状态1)

    上面定时器1和定时器2其实可能是一个实际定时器的不同阶段。编程很多时候就是要有明确的状态情况,并对此产生转换关系。

    • 发布于2020-07-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 1、选择一个GPIO口作为电平变化的中断输入脚(当然电平要在IO可容忍的电压范围内);另外一个引脚控制继电器的吸合状态(需要有继电器驱动电路)

    2、判断该GPIO口的电平变化,若为高电平,启动定时器计时,在这个过程中继续判断该GPIO口的电平状态;

         在60s时间内,一直高电平,则改变控制继电器引脚的电平状态,使继电器断开;定时器重置,启动10s定时;

         在60s时间内,出现低电平,定时器重置,关闭定时器计时;回到之前的检测状态;

    • 发布于2020-07-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 这种可以用边沿触发加上延时消抖,然后寻找电平从低变高的那个边沿,触发之后将控制继电器的脚的电平拉高,触发定时器计时,时间到了之后拉低
    • 发布于2020-07-26
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

这个单片机继电器的控制器程序实在是不知道怎么写了 求指点