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

📄 jf_act.c

📁 一款完整的家用电器程序,具有控制商用机的功能,应用广泛,有一定的参考价值
💻 C
📖 第 1 页 / 共 5 页
字号:
 void fun_auto_set_caculate(void) //计算设定值的温度湿度 
 {	
 	THset10=(int_THset<<3)+(int_THset<<1)+dig_THset;	//THset*10+dig_THset=10*THset
 	fth_actual025 =th_actual10>>2;
 	switch (th_actual10&0x03)
 	{
 		case 1:
 			{fth_actual025 +=0.25;
 		break;}
 		case 2:
 			{fth_actual025 +=0.5;
 		break;}
 		case 3:
 			{fth_actual025 +=0.75;
 		break;}
	}
	Tset025Tm=THset10+fth_actual025;//Tset+0.25Tm
	Tset050Tm=Tset025Tm+fth_actual025;//Tset+0.5Tm
	Tset075Tm=Tset050Tm+fth_actual025;//Tset+0.75Tm
	Tset_025Tm=THset10-fth_actual025;//Tset- 0.25*Tm
	Tset_050Tm=Tset_025Tm-fth_actual025;//Tset- 0.5*Tm
	Tset_075Tm=Tset_050Tm-fth_actual025;//Tset- 0.75*Tm
	RHset05RHm =RHset+(rh_actual>>1);	//RHset+0.5RHm
	RHset_05RHm =RHset-(rh_actual>>1);	//RHset-0.5RHm	
	if (rh_actual &0x01)
		{//当rh_actual个位为1时,移掉的1要补0.5,取消乘法
			RHset05RHm +=0.5;	//
			RHset_05RHm -=0.5;	//
		}
	}
	
//*******************************************************************
//以下为200704以后从TESTYEJIN程序中的自动判定温湿度转过来。以上为原JF程序。
//*******************************************************************	
 void fun_auto_set(void) //判定自动所处状态,选择具体模式 
 {	
	if (t_value10_20s > (THset10+th_actual10)) //T>Tset+Tm 
       {//温度过高,关电加热,关加湿,开压缩机
		manual_set |=b_comp_onask;  //自动制冷\开压缩机、送风机 
	//20070703去掉  	 manual_set &=~b_humid_onask;  //关加湿
	  	 manual_set &=~b_heat1_onask; //关电加热1
	  	 manual_set &=~b_heat2_onask; //关电加热2
  	 	manual_set &=~b_yvadjust_onask; //D0能量调节阀off
	   }
 	else if (t_value10_20s <(THset10-th_actual10)) //T<Tset-Tm
	    {   //温度过低,开电加热,关加湿,关压缩机,自动制热
	       manual_set &=~b_comp_onask;  //关压缩机
	       manual_set &=~b_dry_offask;  //关除湿
	 //20070703去掉        manual_set &=~b_humid_onask;  //关加湿
	 	  fun_2heat_open(); //当一级电加热已经启动15秒后,开第二组电加热
	 	  manual_set &=~b_yvadjust_onask; //D0能量调节阀off
	 	}  
  	else	 
       {// Tset-Tm<= T <=Tset+Tm
	//  if (rh_value_20s <RHset05RHm) //*当RH<RHset+0.5RHm时
	 //    {//当RH<RHset+0.5RHm时
	 // 	  if (PINB &b_comp) manual_set &=~ b_dry_offask; //湿度低时如压缩机开,则关除湿状态
	 // 	 }	
	//20070629开加湿:Tset-Tm<T<Tset+Tm,且RH<RHset-0.5RHm连续20秒	
	if (rh_low20s_RHset_05RHm>=4) manual_set |=b_humid_onask; //加湿器on
	//20070629关闭除湿阀:压缩机运行时间大于60秒,且RH>RHset+RHm连续30秒,关闭除湿阀
	if ((rh_high20s_RHsetRHm >=6) && (t_comp_run_times>=1))	manual_set |=b_dry_offask;	//D3除湿阀关   
	//T>Tset且RH>RHset+0.5RHm时,压缩机开始准备运行 
	  if ((t_value10_20s >THset10) && (rh_value_20s >RHset05RHm))  manual_set |=b_comp_onask; //压缩机开
	//温湿度模拟量满足T<Tset-Tm,或T<Tset-0.5Tm且RH<RHset-0.5RHm时压缩机开始准备关闭
	  if (t_value10_20s <(THset10-th_actual10)) manual_set &=~b_comp_onask; //关压缩机 20070604去掉T<Tset-0.5Tm且RH<RHset-0.5RHm时压缩机关闭
	  //20061120压缩机开且T <Tset-0.25*Tm 一组开时再二组开
	 if(((PINB &b_comp)==0) &&(t_value10_20s < THset10) && (rh_value_20s >RHset05RHm)) fun_1heat_open2(); //当一级电加热已经启动15秒后,开第二组电加热 
	  if(((PINB &b_comp)!=0) &&(t_value10_20s <Tset050Tm) && (rh_value_20s >RHset05RHm)) fun_1heat_open2();
	  if(((PINB &b_comp)!=0) &&(t_value10_20s <Tset_025Tm)) fun_1heat_open2();
	  
	   //当温湿度模拟量满足"T>Tset+0.5Tm且压缩机关"或"T>Tset且RH<RHset且压缩机关"或"T>Tset+Tm且压缩机开"时,关闭一组电加热   
	  //20061120压缩机开且T >Tset+0.25Tm且RH<RHset
	  if  ((t_value10_20s > (Tset050Tm))&& ((PINB &b_comp)==0)) fun_heat2on_close1();
	  if ((t_value10_20s >THset10) && (rh_value_20s <RHset)&& ((PINB &b_comp)==0)) fun_heat2on_close1();
	  if (((PINB &b_comp)!=0) &&(t_value10_20s >Tset025Tm)&& (rh_value_20s <RHset) ) fun_heat2on_close1();
	  if (((PINB &b_comp)!=0) &&(t_value10_20s >Tset075Tm)) fun_heat2on_close1();
	  
	  // "T<Tset-0.75Tm且压缩机关"或"压缩机关T<Tset+0.25Tm且RH>RHset+0.5RHm"或"压缩机开的情况下,T<Tset+0.5*Tm且RH>RHset"的情况下,一级电加热开
	  //20061120压缩机开的情况下,T<Tset 一级电加热开
	  if (((PINB &b_comp)==0) &&(t_value10_20s <Tset025Tm) && (rh_value_20s >RHset05RHm)) fun_1heat_open(); //一级电加热开
	  if (((PINB &b_comp)!=0) &&(t_value10_20s <Tset050Tm) && (rh_value_20s >RHset)) fun_1heat_open();
	  if (((PINB &b_comp)==0) &&(t_value10_20s <Tset_075Tm)) fun_1heat_open(); 
	  if (((PINB &b_comp)!=0) &&(t_value10_20s <THset10) ) fun_1heat_open();
	  
     //	   if ((t_value >TsetTm)&& (PINB &b_comp) fun_1heat_open();
     //关闭2级电加热:当温湿度模拟量满足"T>Tset+0.75Tm且压缩机关"或"T>Tset且RH<RHset-0.5RHm且压缩机关"或"T>Tset+Tm且压缩机开"关闭最后一组电加热。
     //20061120压缩机开 T>Tset+0.5Tm且RH<RHset 关闭最后一组电加热
	  if ((t_value10_20s >Tset075Tm) &&((PINB &b_comp)==0)) fun_heat_off1();
	  if ((t_value10_20s >THset10) && (rh_value_20s <RHset_05RHm)&&((PINB &b_comp)==0)) fun_heat_off1();
	  if (((PINB &b_comp)!=0) && (t_value10_20s >Tset050Tm) &&(rh_value_20s <RHset)) fun_heat_off1();
	  if (((PINB &b_comp)!=0) &&(t_value10_20s >Tset075Tm))  fun_heat_off1();
	 }	
     
     //在自动模式下,当压缩机启动,能量调节电磁阀默认为关。当压缩机开 
     if (((PINB &b_comp)!=0) &&((manual_set &b_comp_onask)!=0))  //压缩机开
	  {//20070629开能量调节阀的条件:压缩机开,且T<Tset-0.5Tm连续20秒	
	    if (t_low20s_Tset_050Tm>=4) manual_set |=b_yvadjust_onask; //D1能量调节阀开
	    if (t_value10_20s > THset10)  manual_set &=~b_yvadjust_onask;	//D1能量调节阀off
	  }
     else manual_set &=~b_yvadjust_onask;	//D1能量调节阀off	
//20070629此条件移到外面。当温湿度模拟量满足"RH>RHset连续20秒,关闭加湿器 
  if (rh_high20s_RHset>=4) manual_set &=~b_humid_onask;	//关闭加湿器	
//20080417此条件移到外面 //当RH<RHset+0.5RHm时
  //   if (rh_value_20s <RHset05RHm) manual_set &=~ b_dry_offask; //湿度低时如压缩机开,则关除湿状态//*当RH<RHset+0.5RHm时
	if (rh_low20s_RHset05RHm>=4) manual_set &=~ b_dry_offask; //当RH<RHset+0.5RHm时,且连续保持20秒,开除湿阀。  
 	if ((manual_set &b_comp_onask)==0) manual_set &=~ b_dry_offask; //20080417压缩机请求关时除湿请求也关  
 }
       

 /*二级电加热启动:当一级电加热已经启动15秒后,温湿度模拟量满足"T<Tset-Tm"或"T<Tset且RH>RHset+0.5RHm"
 或"压缩机开且T <Tset+Tm且RH>RHset+0.5RHm"的条件下,开第二组电加热。    */
  void fun_2heat_open(void)
  {  //当一级电加热已经启动15秒后,开第二组电加热      	  
       	  if (PINB &b_heat1) 
       	     {
       	  	if (t_heat1_on >=3) manual_set |=b_heat2_onask; //D4 电加热2开以5秒计1次,时间最大为250*5=1250s=21min
       	  	 	
       	     }
       	  else if (PINB &b_heat2) 
       	     {
       	     	if (t_heat2_on >=3) manual_set |=b_heat1_onask; //D5 电加热1开	
       	     }
       	  else	//电加热未启动时先开一级加热,先关先开
       	     {
       	     	if (t_heat1_off >=t_heat2_off) manual_set |=b_heat1_onask; //D5 电加热1开
       	     	else manual_set |=b_heat2_onask; //D4 电加热2开 
       	     }  
   }  
 /*、一级电加热启动:在自动模式下当温湿度模拟量满足"T<Tset-Tm"或"T<Tset+0.5Tm且RH>RHset+0.5RHm"
 或"压缩机开的情况下,T<Tset+Tm且RH>RHset"的情况下,启动一组电加热,电加热启动遵循先关先开,
 即判断两组电加热的关闭时间,关闭时间长的先开。    */
 
 
void fun_1heat_open(void)
  {//一级电加热启动:如二组电加热都关时,则先关先开,如二组电加热同时开或一组已开时则不需干预。    	  
    if (((PINB &b_heat1)==0) &&((PINB &b_heat2)==0 ))
      {
       	if (t_heat1_off >=t_heat2_off) manual_set |=b_heat1_onask; //开电加热1
       	else  manual_set |=b_heat2_onask; //开电加热2
       } 
   } 
  
void fun_heat2on_close1(void) //如两级电加热开时关一级电加热,开时间长的先停止
  {
    if (((PINB &b_heat1)!=0) &&((PINB &b_heat2)!=0))
     {//如两级电加热开时 
       	if (t_heat1_on >=t_heat2_on) manual_set &=~b_heat1_onask; //关电加热1
       	else  manual_set &=~b_heat2_onask; //关电加热2
  	}
  }
  
void fun_1heat_open2(void) //当一级电加热已经启动15秒后,开第二组电加热,2组开或2组关时不干预 
   {//当一级电加热已经启动15秒后,开第二组电加热      	  
    if (PINB &b_heat1) 
     {//电加热1已经启动
      if (t_heat1_on >=3) manual_set |=b_heat2_onask; //D4 电加热2开以5秒计1次,时间最大为250*5=1250s=21min
     }
   else if (PINB &b_heat2) 
     {//电加热2已经启动
       if (t_heat2_on >=3) manual_set |=b_heat1_onask; //D5 电加热1开	
     }   	
   }
  
void fun_heat_off1(void)  //仅仅一组加热开时关开的电加热
  {
  	if (PINB &b_heat1)
  	{	
  		if ((PINB &b_heat2)==0)
  		manual_set &=~b_heat1_onask; //关电加热1
  	}
  	else if (PINB &b_heat2)
  	{	
  		if ((PINB &b_heat1)==0)	
  		manual_set &=~b_heat2_onask; //关电加热2
  	}		
  } 

void fun_rht_compare(void)  //在范围内则比较温度湿度是否低于前20秒
{//每次求以前4个(20秒)的平均值,与当前值进行比较,如大于则大于次数+1,如小于则小于次数+1,
//比较完成后存入当前值,求出新的20秒的平均值,不在上下限之间不进行20秒判断,保证t_value10为正数
	signed int t_value10_20s_temp; //前面20s温度值
	unsigned int  rh_value_20s_temp;  //前面20s湿度值
	if ((flag &b_sht_nofirst)==0)//上电时或故障后第一次读SHT正确==0)	
	{//刚上电时或出错后首次SHT正确时用当前值为20秒平均值
		t_value10_temp_1=t_value10;
		t_value10_temp_2=t_value10;
		t_value10_temp_3=t_value10;
		t_value10_temp_4=t_value10;
		t_value10_20s=t_value10;
		rh_value_temp_1 =rh_value;
		rh_value_temp_2 =rh_value;
		rh_value_temp_3 =rh_value;
		rh_value_temp_4 =rh_value;
		rh_value_20s =rh_value;
		flag |=b_sht_nofirst;	//上电时或故障后第一次读SHT正确
		}
	else
	{//存入当前值,求出新的20秒的平均值	
		t_value10_temp_1 =t_value10_temp_2;	//将第2值存入第1值
		t_value10_20s_temp =t_value10_temp_1;
		t_value10_temp_2=t_value10_temp_3;	//将第3值存入第2值
		t_value10_20s_temp +=t_value10_temp_2;
		t_value10_temp_3=t_value10_temp_4;	//将第4值存入第3值
		t_value10_20s_temp +=t_value10_temp_3;
		t_value10_temp_4=t_value10;	//将当前值存入第4值
		t_value10_20s_temp +=t_value10_temp_4;
		t_value10_20s =t_value10_20s_temp>>2;	//t_value10_20s/4取前20秒的平均值
//存入当前值,求出新的20秒的平均值
		rh_value_temp_1 =rh_value_temp_2;	//将第2值存入第1值
		rh_value_20s_temp =rh_value_temp_1;
		rh_value_temp_2=rh_value_temp_3;	//将第3值存入第2值
		rh_value_20s_temp +=rh_value_temp_2;
		rh_value_temp_3=rh_value_temp_4;	//将第4值存入第3值
		rh_value_20s_temp +=rh_value_temp_3;
		rh_value_temp_4=rh_value;	//将当前值存入第4值
		rh_value_20s_temp +=rh_value_temp_4;
		rh_value_20s =rh_value_20s_temp>>2;	//rh_value_20s/4取前20秒的平均值
	}

//20070629增加连续		
	if (rh_value_20s > RHset) 
  	  {
  		rh_high20s_RHset++; //rh_value > RHset时次数加1
  		if (rh_high20s_RHset>30)  rh_high20s_RHset=30;
  	  }
  	else rh_high20s_RHset=0;	//清0

  	if (rh_value_20s >(RHset +rh_actual)) 
  	  {
  		rh_high20s_RHsetRHm++; //rh_value > RHset+RHm时次数加1
  		if (rh_high20s_RHsetRHm>30)  rh_high20s_RHsetRHm=30;
  	  }
  	else rh_high20s_RHsetRHm=0;	//清0	

  	if (rh_value_20s < RHset_05RHm) 
  	  {
  		rh_low20s_RHset_05RHm++; //rh_value < RHset_05RHm时次数加1
  		if (rh_low20s_RHset_05RHm>30)  rh_low20s_RHset_05RHm=30;
  	  }
  	else rh_low20s_RHset_05RHm=0;	//清0	
  	
  	if (t_value10_20s < Tset_050Tm) 
  	  {
  		t_low20s_Tset_050Tm++; //t_value10 < Tset_050Tm时次数加1
  		if (t_low20s_Tset_050Tm>30)  t_low20s_Tset_050Tm=30;
  	  }
  	else t_low20s_Tset_050Tm=0;	//清0
  	
  	  if (rh_value_20s < RHset05RHm) 
  	  {//20080417 add rh_value < RHset+05RHm
  		rh_low20s_RHset05RHm++; //rh_value < RHset+05RHm时次数加1
  		if (rh_low20s_RHset05RHm>30)  rh_low20s_RHset05RHm=30;
  	  }
  	else rh_low20s_RHset05RHm=0;	//清0			
}
 
//自动与手动转换时清manual_set,在开机状态下手动按开关设置,自动按条件设置manual_set,自动下常开风机
void fun_key(void)	//读键入紧急按钮、故障复位按钮
{//有键按下且上次已放开,去掉开关机按钮
	 if	(((PINE &b_key_reset_fault)==0) && ((key_temp &b_key_reset_fault)!=0))
		{
			key_reset_fault_time=0;  //刚按下复位按钮时按键时间=0
		}
	else if ((PINE &b_key_reset_fault)==0)
		{ //按下复位按钮时按键时间+1;
			if (key_reset_fault_time>=5) //连续按下按钮故障复位5秒时开关机动作,下一次动作需先放开按钮
				{
					run_state2 |=b_fault_reset;  //故障复位命令
	 	    		fun_fault_beep();	//20080201增加故障报警蜂鸣器子程序
				}
			else 	key_reset_fault_time++;	
		}	
	else 	key_reset_fault_time=0;   	//未按键时清0
// 紧急按钮   
    if 	(((PINE &b_key_urgent)==0) && ((key_temp &b_key_urgent)!=0))
		{
			key_urgent_time=0;  //刚按下紧急按钮时按键时间=0
		}
	else if ((PINE &b_key_urgent)==0)
		{ //按下紧急按钮时按键时间+1;
		if (key_urgent_time >=5) //连续按下紧急按钮5秒时
			{
				if (mode & b_urgent) 
				  {//应急状态下则清除应急并关机
				  	mode &=~b_urgent;
				  	mode &=~b_kaiji;	//需关机
					} //off时手动与自动的状态要求全关
				else 
				  {//非应急状态下则置应急开机,取应急的默认设置
			

⌨️ 快捷键说明

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