/*********************************************************************
暖风机的工作控制:
1:加热有加热标志位和控制标志位的,标志位的开启并不代表实际的输出
2:根据用户设定模式判断,当前处于哪个状态
3:当前状态下,判断控制标志位是否开启
4:无论控制标志位是否开机,均开始计算时间
5:根据时间的大小来判定实际输出的时间
*********************************************************************/
#include "config.h"
void Base100ms(void);
static volatile unsigned char HEAT1OnTime __attribute__ ((at(0x1b0)));
static volatile unsigned char FanOnTime __attribute__ ((at(0x1b1)));
static volatile unsigned int FanOffTime __attribute__ ((at(0x1b2))); //当定义INT型时,占用两个地址,所以需要隔开
static volatile unsigned char HEAT1OffTime __attribute__ ((at(0x1b4)));
static volatile unsigned char HEAT2OffTime __attribute__ ((at(0x1b5)));
static volatile unsigned char HEAT2OnTime __attribute__ ((at(0x1b6)));
static volatile unsigned char TimerSec __attribute__ ((at(0x1b7)));
static volatile unsigned char TimerMin __attribute__ ((at(0x1b8)));
static volatile unsigned char TimerHour __attribute__ ((at(0x1b9)));
uint8 SysRunTime; //机器开机计时秒
uint8 FanOffDelayTime=0; //关机倒计时
uint8 TimeSelfCheck=50; //开机那个0.5S可以自检
void Base100ms(void);
void Base1s(void);
void SysWorkCtrl(void); //系统工作的控制(从全局把握系统的输出--不包含显示)
void FanCtrl(void); //风机控制程序(开机及执行,关机,延迟30S关掉)
void HeatCtrl(void); //加热管输出控制 加热什么时候开关的控制
void HiModeCtrl(void); //高热模式控制
void LoModeCtrl(void); //地热模式控制
void EcoModeCtrl(void); //节能模式控制 是否打开即热的控制--有了相应的控制标志位,在计算时间
void SecTimerCnt(void); //1S计时程序
void RunImpro(void); //非正常工作程序I
void SwCtrl(void);
void DDRember(void); //掉电记忆功能
void Base100ms(void) //100MS计时
{
if(TSetTimerCnt){TSetTimerCnt-=1;if(!TSetTimerCnt){gb_TimerSet_Flag=0;}}
if(TSetTempCnt){TSetTempCnt-=1;if(!TSetTempCnt){gb_TempSet_Flag=0;}}
if(TkeySetLook){TkeySetLook-=1;}
if(TimeSelfCheck){TimeSelfCheck-=1;}
if(gb_Fan_Flag) //风扇的计时
{
FanOffTime=0;
if(FanOnTime<=200) {FanOnTime+=1;} //风扇开启,累计计时20S
}
else
{
FanOnTime=0;
if(FanOffTime<=60000) {FanOffTime+=1;} //风扇关机的累计计时
}
if(gb_HEAT1_Flag) //加热的计时必须以实际加热开始计时,而不是标志位
{
HEAT1OffTime=0;
if(HEAT1OnTime<200) { HEAT1OnTime+=1; }
}
else
{
HEAT1OnTime=0;
if(HEAT1OffTime<200) { HEAT1OffTime+=1; }
}
if(gb_HEAT2_Flag) //加热的计时必须以实际加热开始计时,而不是标志位
{
HEAT2OffTime=0;
if(HEAT2OnTime<200) { HEAT2OnTime+=1; }
}
else
{
HEAT2OnTime=0;
if(HEAT2OffTime<200) { HEAT2OffTime+=1; }
}
}
void Base1s(void) //1S的计时
{
if(FanOffDelayTime)
{
FanOffDelayTime-=1;
}
if(UserTimeSetH) //定时的计数
{
TimerSec+=1;
if(TimerSec >= 59)
{
TimerSec=0;
TimerMin+=1;
if(TimerMin>=UserTimeSetH)
{
if(gb_PowerOn_Flag&&gb_TimeOff_Flag) //此位置1 ,说明处于开机状态
{
gb_TimeOff_Flag=0;
UserTimeSetH=0; //加这句是为了把时间计数的参数全部清0
gb_Timer_Flag=0;
gb_PowerOn_Flag=0; //关机
bBeepf=1;bBeepSf=1;BeepCount=0;
}
else if((!gb_PowerOn_Flag)&&gb_TimeOn_Flag)
{
gb_TimeOn_Flag=0;
UserTimeSetH=0;
gb_Timer_Flag=0;
gb_PowerOn_Flag=1; //开机
bBeepf=1;bBeepSf=1;BeepCount=0;
}
}
}
}
else
{
TimerSec=0;
TimerMin=0;
TimerHour=0;
}
}
void SysWorkCtrl(void) //分非正常模式和正常模式
{
if(TempErro.tByte)//非正常模式下的输出
{
if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
{
FanOffDelayTime=60; //关机60S的延迟
}
gb_HEAT1Ctrl_Flag=0;
gb_HEAT2Ctrl_Flag=0;
}
else //正常模式的输出
{
if(gb_PowerOn_Flag)
{
if(UserSetMode == HIMODE){HiModeCtrl();}
else if(UserSetMode == LOMODE){LoModeCtrl();}
else if(UserSetMode == ECMODE){EcoModeCtrl();}
}
else
{
if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
{
FanOffDelayTime=60; //关机60S的延迟
}
gb_HEAT1Ctrl_Flag=0;
gb_HEAT2Ctrl_Flag=0;
}
}
FanCtrl();
HeatCtrl();
}
void HiModeCtrl(void) //高档--对加热1 加热2 风扇的 控制
{
if(EnvironmentTempC>UserTempSetC) //温度中间状态 - 跟随上一个状态
{
if(gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
{
FanOffDelayTime=60; //关机60S的延迟
}
gb_HEAT1Ctrl_Flag=0;
gb_HEAT2Ctrl_Flag=0;
}
else if(EnvironmentTempC
{
gb_HEAT1Ctrl_Flag=1;
gb_HEAT2Ctrl_Flag=1;
}
}
void LoModeCtrl(void) //低档--对加热1 加热2 风扇的 控制
{
gb_HEAT2Ctrl_Flag=0;
if(EnvironmentTempC>UserTempSetC)
{
if(gb_HEAT1Ctrl_Flag)
{
FanOffDelayTime=60;
}
gb_HEAT1Ctrl_Flag=0;
}
else if(EnvironmentTempC
{
gb_HEAT1Ctrl_Flag=1;
}
}
void EcoModeCtrl(void) //节能模式 低挡开,高档来回开
{
gb_HEAT1Ctrl_Flag=1;
if( EnvironmentTempC > UserTempSetC )
{
if(gb_HEAT2Ctrl_Flag)
{
FanOffDelayTime=60;
}
gb_HEAT2Ctrl_Flag=0;
}
else if(EnvironmentTempC
{
gb_HEAT2Ctrl_Flag=1;
}
}
void FanCtrl(void) //风扇开启的前提是开机/关机后的延迟时间60S/温度达到设定温度后,加热停止工作,风扇再转60S
{
if(gb_PowerOn_Flag||FanOffDelayTime||gb_HEAT1Ctrl_Flag||gb_HEAT2Ctrl_Flag)
{
gb_Fan_Flag=1; //次标志位开启,及代表风扇已经再转,同时可以计时了
FANON();
}
else
{
gb_Fan_Flag=0;
FANOFF();
}
}
void HeatCtrl(void)
{
if(gb_HEAT1Ctrl_Flag) //低档HEAT1加热功能的开启 开条件(风扇3S和其关闭3S以上)
{
if(gb_HEAT1_Flag) { HEAT1ON();}
else if((FanOnTime>=30)&&(HEAT1OffTime>=30)) //第一次开启加热标志位
{
gb_HEAT1_Flag=1;
HEAT1ON();
}
else
{
gb_HEAT1_Flag=0;
HEAT1OFF();
}
}
else if(((gb_HEAT1_Flag==1)&&(HEAT2OffTime>=30))||(gb_HEAT1_Flag==0) ) //低档加热功能的关闭 关条件 -- 加热1在开启中同时加热2关闭3S以上——加热1已经关闭
{
gb_HEAT1_Flag=0;
HEAT1OFF();
}
if(gb_HEAT2Ctrl_Flag) //高挡HEAT2即热功能的开启和关闭 (加热1开3S以上和加热2关3S以上--加热2已开启)
{
if(gb_HEAT2_Flag) { HEAT2ON(); }
else if((HEAT1OnTime>=30)&&(HEAT2OffTime>=30))
{
gb_HEAT2_Flag=1;
HEAT2ON();
}
}
else
{
gb_HEAT2_Flag=0;
HEAT2OFF();
}
}
void DDRember(void)
{
if(gb_PowerOn_Flag)
{
fun_eeprom_Write(0x00, UserTempSetC);
fun_eeprom_Write(0x01, UserSetMode);
}
else
{
UserSetMode=fun_eeprom_Read(0x01);
UserTempSetC=fun_eeprom_Read(0x00);
}
}