找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1309|回复: 2
收起左侧

请高手指导修改下单片机定时程序

[复制链接]
ID:280226 发表于 2019-11-21 16:11 | 显示全部楼层 |阅读模式
做了一个二路红外监控程序,利用红外开关判断信号,每一路红外开关有信号时该路继电器接通5分钟后自动停止,5分钟内红外信号消失继电器也自动断开停止,二路独立,这部分测试工作正常,现在加上一段自动定时自启功能:二个继电器都断开后开始计时,60分钟后后如果继电器都没有接通信号,继电器自动接通,5分钟后又自动停止,如果在定时自启过程中又有红外信号,程序恢复自动判断状态,如此循环反复,但这部分功能却实现不了,程序错在哪儿,一时找不出原因,请高手师傅指教修改一下,谢谢!!

附单片机原程序
#include <reg51.H>

typedef unsigned int u16;
sbit iR1=P1^3;   
sbit iR2=P1^4;
sbit Relay1=P1^0;
sbit Relay2=P1^1;
bit flag_1=0,flag_2=0;
u16 temp_1,temp_2,temp_3;
/***********************************************
定时函数
************************************************/
void Timer0Init()//50ms@12.000MHz
{
        TMOD= 0x01;  
        TL0 = 0xB0;  
        TH0 = 0x3C;  
        TR0 = 1;   
        EA=1;        
        ET0=1;        
}
/***********************************************
红外开关扫描程序
************************************************/
void iRscan()           
{
        static bit iR_sign1=0;
        static bit iR_sign2=0;
        if(iR1==1)            
         {
                 if(iR_sign1==0)      
                {                        
                         iR_sign1=1;   
                         temp_1=0;      
                         flag_1=1;      
                         Relay1=1;      
                }
         }
         else                          
        {
                 iR_sign1=0;           
                 Relay1=0;              
        }
               
         if(iR2==1)                     
         {
                 if(iR_sign2==0)      
                {                        
                         iR_sign2=1;   
                         temp_2=0;     
                         flag_2=1;      
                         Relay2=1;      
                }
         }
         else                        
        {
                 iR_sign2=0;         
                 Relay2=0;            
        }         
}
/***********************************************
主程序
************************************************/
void main()
{
         Timer0Init();                  
        while(1)
         {
                 iRscan();            
        }
}
/***********************************************
中断函数
************************************************/
void Timer0() interrupt 1                       //50ms@12.000MHz
{
        TL0 = 0xB0;                             
        TH0 = 0x3C;                             
        if(flag_1==1)                           
         {
                 temp_1++;                     
                 if(temp_1>=(20*60)*5)         
                {
                         flag_1=0;              
                         Relay1=0;              
                }
         }
                 
         if(flag_2==1)                        
         {
                 temp_2++;                     
                 if(temp_2>=(20*60)*5)         
                {
                         flag_2=0;              
                         Relay2=0;            

                }
         }
/****以下为1小时后定时自启,但功能实现不了,程序错在哪?   
******/                 
          if(flag_1==0&&flag_2==0)                        
         {
                 temp_3++;                     
                 if(temp_3>=(20*60)*60)         
                {
                         flag_1=1;              
                         Relay1=1;              
                         flag_2=1;              
                         Relay2=1;              
                                    }
         }
                   if(flag_1==1&&flag_2==1)                          
         {
                 temp_3++;                     
                 if(temp_3>=(20*60)*5)         
                {
                         flag_1=0;              
                         Relay1=0;              
                         flag_2=0;              
                         Relay2=0;              
                                    }
         }        
}


回复

使用道具 举报

ID:123289 发表于 2019-11-21 21:48 | 显示全部楼层
先画出流程图,走通流程后再写程序。
回复

使用道具 举报

ID:158375 发表于 2019-11-22 10:46 | 显示全部楼层
Relay1在中断里面和iRscan()里面都有赋值,而flag_1怎么样呢?自己看!
管脚与运行标志分不清.....

画个简单图,自己分析一下。

管脚一标志 怎么区分
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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