找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10616|回复: 46
收起左侧

求一个按键闭合后,继电器延时1分钟吸合,再延时5分钟断开的单片机程序

  [复制链接]
ID:388197 发表于 2018-10-13 14:33 | 显示全部楼层
随便写的,下载到板子上试了试没问题,1分钟 5分钟时间太长,我改成5秒 25秒,你只要改下数字就行.
#include <reg52.h>
sbit relay = P1^0;              //继电器,0线圈吸合,1线圈断开
sbit key = P1^1;                //按键,0为按下,1为松开
unsigned char key_timer_cnt;    //检测按键计时变量
unsigned int relay_timer_cnt;    //继电器吸合断开计时变量
unsigned char relay_timer_cnt_min;    //继电器延迟断开计数器分钟,因为5分钟,1ms为单位将超过65535
unsigned char relay_state;       //记录继电器状态 0=未触发 1=待吸合 2=待断开
       
void Init_T0(void)                  //定时器中断初始化,设置为1ms
{
    TMOD = 0x01;
    TH0 = 0xfc;
    TL0 = 0x18;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void main(void)
{
        Init_T0();
        relay = 1;                         //断开继电器
        relay_state = 0;               //继电器处于未触发状态
        while(1)
        {
             //想实现其他功能,再这里添加代码
        }
}
void T0_ISR() interrupt 1              //1毫秒
{
        TH0 = 0xfc;
        TL0 = 0x18;
//***************************待触发状态,需要做的只是判断按键有没有按下*******************
        if(relay_state == 0)                //当继电器处于待触发状态
        {
                if(key == 0)                      //按键按下,并且继电器处于未触发状态
                {
                        key_timer_cnt++;                                  //按键计时器自加,用于消抖
                        if(key_timer_cnt>=5)                              //按键超过5毫秒
                        {
                                key_timer_cnt = 0;                          
                                relay_state = 1;                               //将继电器设成待吸合状态
                        }
                }else
                {
                        key_timer_cnt = 0;
                }
        }
        //********************待吸合状态,等计数器加满就行*****************************
        if(relay_state == 1)
        {
                relay_timer_cnt++;
                if(relay_timer_cnt>=5000)                      //将5000改为60000 即为1分钟                  
                {
                        relay = 0;                                   //继电器吸合
                        relay_state = 2;                             //吸合后将状态转成待断开
                        relay_timer_cnt = 0;
                }
        }
        //******************待断开状态,跟待吸合一样加满就行*******************************
        if(relay_state == 2)
        {
                relay_timer_cnt++;
                if(relay_timer_cnt>=5000)                     //将5000改为60000即为1分钟
                {
                        relay_timer_cnt = 0;
                        relay_timer_cnt_min++;                      //每60秒加1
                        if(relay_timer_cnt_min>=5)                  //当分钟数等于5
                        {
                                relay = 1;                                //断开继电器
                                relay_timer_cnt_min = 0;
                                relay_timer_cnt = 0;
                                relay_state = 0;                          //断开后将继电器状态转换成未触发
                        }
                }
        }
}

评分

参与人数 4黑币 +80 收起 理由
yong761228 + 10
admin + 50 回帖助人的奖励!
飞线 + 8 回帖助人的奖励!
YJGG + 12 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:388197 发表于 2018-10-16 10:15 | 显示全部楼层
yong761228 发表于 2018-10-15 21:03
师傅,您好,您的程序我用STC15W404as 单片机,改了端口sbit relay = P3^6;   sbit key = P3^2;  就是不 ...

IO口配置有没有设置成浮空?
另外单片机IO口不要直接去接继电器,接个三极管,用三极管去驱动继电器.如果接的是NPN型的,那么IO口为1时是吸合,为0则断开.

评分

参与人数 2黑币 +28 收起 理由
飞线 + 8 很给力!
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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