找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1948|回复: 22
收起左侧

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

[复制链接]
ID:807229 发表于 2020-7-24 14:13 | 显示全部楼层 |阅读模式
想做个继电器的控制器 单片机收到高电平触发信号后计时60秒 高电平超过60秒 断开继电器 并保持10秒 (10秒内即使触发信号变为低电平继电器也不吸合)如果触发信号在60秒内由高电平变为低电平 继电器保持吸合状态不变 望大神给指点 谢谢
回复

使用道具 举报

ID:332444 发表于 2020-7-24 14:32 | 显示全部楼层
从描述可总结一下所谓的触发电平变化问题即一个高电平触发后无论是高或低斗延时60秒。括号内的没看明白,能描述详细点?因为是高电平触发,低电平也触发?
回复

使用道具 举报

ID:807229 发表于 2020-7-24 14:43 | 显示全部楼层
xianfajushi 发表于 2020-7-24 14:32
从描述可总结一下所谓的触发电平变化问题即一个高电平触发后无论是高或低斗延时60秒。括号内的没看明白,能 ...

只是高电平触发  高电平触发计时 超过60秒 继电器断开 在60秒内高电平变为低电平 继电器保持吸合
回复

使用道具 举报

ID:332444 发表于 2020-7-24 14:44 | 显示全部楼层
是高电平触发后倒计时60秒后再计时10秒这样的意思?
回复

使用道具 举报

ID:733205 发表于 2020-7-24 14:46 | 显示全部楼层
说的啥呀,完全看不懂你想说的是啥,能把问题描述明白吗?
回复

使用道具 举报

ID:807229 发表于 2020-7-24 14:47 | 显示全部楼层
xianfajushi 发表于 2020-7-24 14:32
从描述可总结一下所谓的触发电平变化问题即一个高电平触发后无论是高或低斗延时60秒。括号内的没看明白,能 ...

括号内的意思是继电器断开后 在10秒内 不再吸合 10秒后如果触发信号的低电平 吸合继电器 如果是高电平继续延时60秒再断开继电器
回复

使用道具 举报

ID:807229 发表于 2020-7-24 14:48 | 显示全部楼层
xianfajushi 发表于 2020-7-24 14:44
是高电平触发后倒计时60秒后再计时10秒这样的意思?

就是这个意思
回复

使用道具 举报

ID:332444 发表于 2020-7-24 14:56 | 显示全部楼层

那你做2个倒计时就可以了
回复

使用道具 举报

ID:342822 发表于 2020-7-24 15:01 | 显示全部楼层
整理一下:
输入口高电平——输出口继电器吸合——什么也不做60S——60S到输出口释放继电器——又什么也不做10S
对吗~
回复

使用道具 举报

ID:807229 发表于 2020-7-24 15:03 | 显示全部楼层
xianfajushi 发表于 2020-7-24 14:56
那你做2个倒计时就可以了

刚学不久 搞不清楚 能给详细讲解或者给个参考的程序吗?网上好多事例程序仅仅是说明性的 到实际操作时就不会了
回复

使用道具 举报

ID:807229 发表于 2020-7-24 15:14 | 显示全部楼层
taotie 发表于 2020-7-24 15:01
整理一下:
输入口高电平——输出口继电器吸合——什么也不做60S——60S到输出口释放继电器——又什么也不 ...

上电输入口低电平 输出口继电器吸合 输入口高电平 输出口继续继电器吸合——什么也不做60S——60S到输出口释放继电器——又什么也不做继续10秒 10秒后输入口低电平 继电器吸合 如果高电平循环60S 10S
回复

使用道具 举报

ID:807229 发表于 2020-7-24 15:15 | 显示全部楼层
taotie 发表于 2020-7-24 15:01
整理一下:
输入口高电平——输出口继电器吸合——什么也不做60S——60S到输出口释放继电器——又什么也不 ...

我好笨 问题都描述不清楚
回复

使用道具 举报

ID:332444 发表于 2020-7-24 15:19 | 显示全部楼层
高低电平的来源是虾米?
回复

使用道具 举报

ID:342822 发表于 2020-7-24 15:25 | 显示全部楼层
记忆5814 发表于 2020-7-24 15:15
我好笨 问题都描述不清楚

多学,多做,多看,多思考稳步提高~~~
回复

使用道具 举报

ID:473159 发表于 2020-7-24 15:52 | 显示全部楼层
你说的是不是这个意思:

if((单片机接收口 == 1) && (time++>60S))
{
  继电器 = 0;
  delay(10S);  
}

else ((单片机接收口 == 1) && (time++<60S))
{
        继电器 = 1;
}

// 10秒内即使触发信号变为低电平继电器也不吸合,逻辑上不谨慎,不吸合就一直是继电器= 0,保持10秒没意义(delay(10S)),要下一波信号再来判断
回复

使用道具 举报

ID:342822 发表于 2020-7-24 15:54 | 显示全部楼层
看来是对点触按键和常闭,常开开关的触发信号波形没有理解
回复

使用道具 举报

ID:807229 发表于 2020-7-24 15:57 | 显示全部楼层
xianfajushi 发表于 2020-7-24 15:19
高低电平的来源是虾米?

虾米是什么意思?高低电平是通过开关的通断来实现
回复

使用道具 举报

ID:807229 发表于 2020-7-24 16:02 | 显示全部楼层
taotie 发表于 2020-7-24 15:25
多学,多做,多看,多思考稳步提高~~~

谢谢 我想这样学 自己先设定一个硬件需求 然后根据需求再去写程序 可是真的自己要写程序了 却不知道如何开始了 网上的一些事例程序通过开发板可以实现 但是要是按照自己的思路去写程序时却又写不出来
回复

使用道具 举报

ID:280000 发表于 2020-7-24 16:07 | 显示全部楼层
单片机定时器延时可以解决吧
回复

使用道具 举报

ID:807229 发表于 2020-7-24 16:09 | 显示全部楼层
yoxi 发表于 2020-7-24 15:52
你说的是不是这个意思:

if((单片机接收口 == 1) && (time++>60S))

谢谢 我周末搭个硬件去试试 再次感谢
回复

使用道具 举报

ID:451718 发表于 2020-7-24 16:37 | 显示全部楼层
本帖最后由 robinsonlin 于 2020-7-24 16:51 编辑

理解你的需求,比写代码的时间还要长!!!
#define K1                    P37
#define RELAY                 P36

unsigned long SysTick,T1,T2;
unsigned char Enable1,Enabel2,LowFlag;

void Timer0Init(void)                //1毫秒@22.1184MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x9A;                //设置定时初值
        TH0 = 0xA9;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

void main()
{
    T1 = 0;
    T2 = 0;
    K1 = 0;
    RELAY = 0;
    Enable1 = 0;
    Enable2 = 0;   
    LowFlag = 0;
    Timer0Init() ;
    EA = 1;

    while(1)
    {
         if(K1==1 && Enalbe1==0)
         {
                 T1 = SysTick;
                 Enable1 = 1;         
         }
         else if(K1==0 && Enalbe1==1)
         {
                 T1 = SysTick;
                 Enable1 = 1;
                 LowFlag = 1;   
         }
         else if(K1==1 && LowFlag==1)
         {
                 T1 = SysTick;
                 Enable1 = 1;  
                 LowFlag = 0;
         }

         if((SysTick-T1)>=60000 && Enable1==1)
         {
             T2 = SysTick;
             Enable1 = 0;
             Enable2 = 1;           
         }

         if((SysTick-T2)>=10000 && Enable2==1)
         {         
             Enable2 = 0;
         }

    }
}


void tm0_isr() interrupt 1         //中断入口
{
        SysTick++;
        if(Enable1==1 && Enalbe2==0)RELAY = 1;
        else RELAY = 0;
}
回复

使用道具 举报

ID:807229 发表于 2020-7-25 10:07 | 显示全部楼层
robinsonlin 发表于 2020-7-24 16:37
理解你的需求,比写代码的时间还要长!!!
#define K1                    P37
#define RELAY           ...

见笑了 非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表