⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 空调控制程序
💻 C
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : AUX VRV
COMPILER : COSMIC
MODULE   : timer.c
VERSION  : 1.0.0
DATE     : 2005/05/09
AUTHOR   : 朱坤
DESCRIPTION :   定时/睡眠控制,定时任务

MODIFICATIONS :
******************************************************************************/
#include "timer.h"
#include "ports.h"
#include "adc.h"
#include "fan.h"
#include "pzf.h"
#include "main.h"
#include "swing.h"
#include "i2c.h"
#include "buz.h"
#include "led.h"
#include "rem.h"
#include "pump.h"
#include "scom.h"
#include "rscom.h"

u8 SlpTmFlag;        /* 睡眠/定时   */
u8 SysTm20ms;        /* 20mS On 4ms */
u8 SysTm1s;          /* 1s On 4ms   */
u8 SysTm1min;        /* 1min 计时   */
u8 SleepUnit;        /* 睡眠定时    */
u16 TurnOff;         /* 定时关时间  */
u16 TurnOn;          /* 定时开时间  */

/* 睡眠控制 */
void SleepSub(void)
{
   if (ValBit(SlpTmFlag,fSleep)){
     switch(RunMode & (MODEMASK|(1<<fSysOn))){
       /* 热睡眠控制: 运行半小时后,设定温度降低1度; 运行1小时后再降低1度;
         运行2小时后再降1度(2小时共降3℃),睡眠时间到,空调器停止运转;
         制热睡眠最低设定温度为18℃ */
       case (MODEHEAT|(1<<fSysOn)):
         if (SetupTp > SetupTpMIN){
           if ((SleepUnit <= 0x5A) &&
               (!ValBit(SlpTmFlag,fTempUp1))){
             SetupTp--;
             SetBit(SlpTmFlag,fTempUp1);
           }
           if ((SleepUnit <= 0x3C) &&
               (!ValBit(SlpTmFlag,fTempUp2))){
             SetupTp--;
             SetBit(SlpTmFlag,fTempUp2);
           }
           if ((SleepUnit == 0) &&
               (!ValBit(SlpTmFlag,fTempUp3))){
             SetupTp--;
             SetBit(SlpTmFlag,fTempUp3);
           }
         }
         break;

       /* 制冷/除湿睡眠控制: 睡眠方式运转1小时后,设定温度升高1度;
          2小时后设定温度再升高1度,(2小时共升2度);
          睡眠时间到,空调器停止运转。制冷睡眠的最高设定温度为30℃ */
       case (MODECOOL|(1<<fSysOn)):
       case (MODEDRY|(1<<fSysOn)):
         if (SetupTp < SetupTpMAX){
           if ((SleepUnit <= 0x3C) &&
               (!ValBit(SlpTmFlag,fTempUp1))){
             SetupTp++;
             SetBit(SlpTmFlag,fTempUp1);
           }
           if ((SleepUnit == 0) &&
               (!ValBit(SlpTmFlag,fTempUp2))){
             SetupTp++;
             SetBit(SlpTmFlag,fTempUp2);
           }
         }
         break;

       /* 通风模式不允许睡眠功能 */
       default:
         break;
     }
   } else {
     ClrBit(SlpTmFlag,fTempUp1);
     ClrBit(SlpTmFlag,fTempUp2);
     ClrBit(SlpTmFlag,fTempUp3);
   }
}

/* 定时开/定时关处理 */
void TimerOnOff(void)
{
  if (ValBit(SlpTmFlag,fTimeOff) && ValBit(SlpTmFlag,fTime)){
    /* 同时设定定时开、定时关, 时间短的先执行 */
    if (TurnOn >= TurnOff ){
      TimeOff();
    } else {
      TimeOn();
    }
  } else if (ValBit(SlpTmFlag,fTimeOff)){ /* 定时关机 */
    TimeOff();
  } else if (ValBit(SlpTmFlag,fTime)){    /* 定时开机 */
    TimeOn();
  }
}

void ClrAutoMode(void)
{
   if (ValBit(Sysflag2,fMAuto)){      /* 自动模式清除检测到的模式 */
     RunMode = (u8)((RunMode & ~MODEMASK)|MODEAUTO);
     ClrBit(Sysflag2,fMAuto);         /* 1: 自动模式检测延时 */
   }
   ClrBit(Sysflag2,fDelay);           /* 1: 停压缩机延时*/
}

void SysOff(void)
{
   ClrBit(RunMode,fSysOnOff);         /* 关机 */
   ClrBit(RunMode,fSysOn);
   ClrBit(Errorflg,fSysPowErr);       /* 清除故障 */
   ClrBit(Errorflg,fSComErr);
   ClrBit(Sysflag2,fDelay);           /* 1: 停压缩机延时*/
   //Errorflg2 = 0;
   //ClrAutoMode();
}

void TurnSysOff(void)
{
   if (ValBit(RunMode,fSysOnOff)){    /* 定时开机时间未到,先关机 */
#ifdef EnBUZ
#ifdef EnSCOM
     if (!ValBit(Sysflag1,f1XK_YK))   /* 1: XK */
#endif
       BuzCntr = BuzCntrLong;         /* 蜂鸣器鸣叫1长声 */
#endif
     SysOff();                        /* 关机 */
   }
}

void TurnSysOn(void)
{
   if (!ValBit(RunMode,fSysOnOff)){
     ClrAutoMode();
#ifdef EnBUZ
#ifdef EnSCOM
     if (!ValBit(Sysflag1,f1XK_YK))         /* 1: XK */
#endif
       BuzCntr = BuzCntrTwo|(1<<fTwoSBuz); /* 蜂鸣器鸣叫2短声 */
#endif
     SetBit(RunMode,fSysOnOff);            /* 定时关机时间未到,先开机 */
     Errorflg2 = 0;
   }
}

/* 定时开机 */
void TimeOn(void)
{
   if (TurnOn != 0){
     TurnSysOff();
   } else {
     ClrBit(SlpTmFlag,fTime);              /* 清除定时开 */
     TurnSysOn();
   }
}

/* 定时关机 */
void TimeOff(void)
{
  if (TurnOff != 0){
    TurnSysOn();
  } else {
    ClrBit(SlpTmFlag,fTimeOff);            /* 清除定时关 */
    TurnSysOff();
  }
}

/*-----------------------------------------------------------------------------
ROUTINE NAME : MCC_Int
INPUT/OUTPUT : None
DESCRIPTION  : Main Clock Interrupt Service Routine
COMMENTS     :
  每 4mS 中断一次
-----------------------------------------------------------------------------*/
#ifdef AVRGCC
SIGNAL(SIG_OVERFLOW2)
#else
#pragma interrupt_handler MCC_Int:iv_TIMER2_OVF
void MCC_Int(void)
#endif
{
  SetBit(SlpTmFlag,bb4ms);
}

/* 系统计时处理 */
void Timer_Sub(void)
{
   if (ValBit(SlpTmFlag,bb4ms)){
     ClrBit(SlpTmFlag,bb4ms);
     Get_JP();                /* 键扫描 & 显示输出 */
     Key_Scan();              /* 应急运行键 */
#ifndef TESTPRG
     Swing_Output();          /* 扫风电机输出 */
#endif

#ifdef LEDDISP
#ifdef EnSCOM
     if (!ValBit(Sysflag1,f1XK_YK))
#endif
       LedDisp_Sub();         /* LED 显示处理*/
#endif

     if (--SysTm20ms == 0){   /* 20ms on 4ms */
       SysTm20ms = cT20msbase;
       /* 与外机通信监控计时 */
       if (ScComTm < 255) ScComTm++;
#ifdef EnSCOM
       /* 线控器监控计时: 发送状态超时,强制为接收状态 */
       if (ValBit(Sysflag1,f1XK_YK)){   /* 1: 线控器存在 */
         LcScom_Trig();                 /* 线控器启动发送 */
         if (LcComTm < 255) LcComTm++;
       }
#endif

#ifdef LEDDISP
#if (NJTYPE == 4)||(NJTYPE == 5)
      if (FlashErrCnt != 0) FlashErrCnt--;
#endif
#if (NJTYPE == 5)
       if (ChkLcdCnt != 0) ChkLcdCnt--;
#endif
#endif

#ifdef EnBUZ
       if ((u8)(BuzCntr & ~(1<<fTwoSBuz)) != 0) BuzCntr--;
#endif
       if (AutoAckTm != 0 ) AutoAckTm--;
#ifdef EnSWING
#if (NJTYPE==0)||(NJTYPE==1)||(NJTYPE==2)||(NJTYPE==3)||(NJTYPE==4)
       if (FanRunDly != 0 ) FanRunDly--;   /* 5s On 20mS */
#endif
#endif

#ifndef TESTPRG
       Valve_Output();                     /* 膨胀阀 */
#endif
       ADC_Get();                          /* A/D */
     }

     if (--SysTm1s == 0){                  /* 1s On 20ms */
       SysTm1s = cT1sbase;
       SlpTmFlag ^= (u8)(1<<bb2s);
       if (ValBit(SlpTmFlag,bb2s)){        /* 2s On 1s */
         if (SysOkDly !=0) SysOkDly--;     /* 停压缩机延时 */
       }
#ifdef EnSTYLE5
       if (ScAddrErrCnt < 255) ScAddrErrCnt++;
#endif

       if (ScMonCnt < 255) ScMonCnt++;     /* 与外机通信监控计时 */
       if (AckTm < 255 ) AckTm++;          /* 参数设定计时 */
#ifdef EnSCOM
       if (ErrCnt != 0) ErrCnt--;          /* 循环发送故障码计时 */
       if (ValBit(Sysflag1,f1XK_YK) &&     /* 1: 线控器存在 */
           (LcMonCnt < 255)) LcMonCnt++;   /* 与线控器通信监控计时 */
#endif
#ifdef EnPUMP
       if (PumpChkCnt < 255) PumpChkCnt++; /* 水泵故障延时检测计时 */
       if (PumpErrCnt < 255) PumpErrCnt++; /* 水泵故障检测计时*/
       if (PumpDlyCnt != 0) PumpDlyCnt--;  /* 水泵关延时*/
#endif
#ifdef LEDDISP
       if (SWTime != 0) SWTime--;          /* 按键时间 */
       if (DispDlyCnt < 255)  DispDlyCnt++;
#endif

#ifdef EnPGFENGJI
       if (EHeatDlyCnt != 0) EHeatDlyCnt--;
       if (!ValBit(PGFanStatus,fPGFeedEn)) PGErrCnt = 0;
       if (++PGErrCnt > 30) SetBit(Errorflg2,fPGErr);
#endif

       if (FrostCnt < 255) FrostCnt++;     /* 室内换热器防结霜保护检测延时 */
       if (DefstCnt != 0) DefstCnt--;      /* 化霜期间及化霜后3分钟内不检测传感器故障*/
       if (ClrHotCnt != 0) ClrHotCnt--;    /* 吹余热计时(2分钟)*/
       if (AutoCnt != 0) AutoCnt--;        /* 自动模式检测延时*/
#ifdef ChigoXG2
       if (ZhiReFJTm != 0) ZhiReFJTm--;    /* 制热温度到达设定温度,30秒后停内风机*/
#endif
       if (--SysTm1min == 0){              /* 1min On 1s */
         SysTm1min = 0x3C;                 /* 60S */
         if (SleepUnit != 0) SleepUnit--;  /* 睡眠计时 */
         if (TurnOn != 0)  TurnOn--;       /* 定开计时 */
         if (TurnOff != 0) TurnOff--;      /* 定关计时 */
       }
     }
   }
}

/* 允许 MCC中断,最低优先级,每4mS 中断一次  */
void Init_Timer()
{
   SysTm20ms = cT20msbase;
   SysTm1s = cT1sbase;
   SysTm1min = 0x3C;          /* 60S */

   TCCR2 = 0x05;              /* Normal, OC2 Disconnected, 1:128 */
   //TIFR = 0x0FF;
   TIMSK |= (u8)(1 << TOIE2);
}

/*** (c) 2005  佛山菱电 **************************** END OF FILE *************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -