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

📄 main.c

📁 air-contronin controning air in or out,big or small check the temprature.
💻 C
字号:


#include "STC12.H"
#include "pin.h"
#include "MATH.H"
#include "function.h"
#include "evariable.h"
main()
{
	init();
	while(1)
	{
		cnt_main++;
//		WDT_CONTR=0x37;//喂狗 every 10s to start and set watch dog
		scan_key();
		if(k_pw)
		{
			disp_sens();
			//dispose for hpr
			disp_Hpr();
			//dispose for Lpr
			disp_Lpr();
			//dispose fresh-air function
			disp_fa();
			disp_ref();
			display();
			//use T check data stored in the ee	if changing;
			//if happend,refresh the data of ee
			ee_fresh();
			//suggest not fresh operating every time during da_WA changing
			disp_spd();
			speaking();
		}

	}
	while(1);
}


void delay10ms(unsigned int da)
{
	unsigned int i,j;
	for(i=0;i<da;i++)
	{
	   for(j=0;j<16000;j++);
	}
}

void scan_key(void)
{
	byte da,da2;
//	if(alarm==0)
//	{
		da=(unsigned char)sample_adc(1);
		if((da>51)&&(da<205))
		{
			delay2(1000);		
			da2=(unsigned char)sample_adc(1);
			if(abs(da-da2)<0x05)
			{
				if((alarm==0)&&(51<da)&&(da<=102)&&(k_pw))  //k101接通
				{
					k_ref=!k_ref;
					if(k_ref==1)//cool key at open state
					{			  //display ON in LCD
						dp_chara(addr_ON,0,2,30,18);
						state_ref=0;
						//when at cool state,wind adjusting is 
						//less than 1/3 to 
						if(da_WA<=30)
						{
							da_WA=30;
							WA_changed=1;
							state_WA=0;
						}
					}
					else	//cool key at open state
					{			  //display OFF in LCD
						dp_chara(addr_OFF,0,2,30,18);
						state_ref=0xff;
						ref=0;
					}
				}
				//FRESH AIR:  	0   indicate OFF state
				//				1	indicate ON state
				//				2	indicate AUTO state
				if((alarm==0)&&(102<da)&&(da<=154)&&(k_pw))
				{	
					switch((++k_fa)%3)
					{ 
						case 0:	   //OFF
							dp_chara(addr_OFF,0,3,30,18);
							freshair_aut=0;
							freshair=0;
							break;
						case 1:		 //ON
							dp_chara(addr_ON,0,3,30,18);
							freshair_aut=0;
							freshair=1;
							break;
						case 2:		//AUT
									//star up Time ,changing states between
									//ON and OFF per 2s
							dp_chara(addr_AUT,0,3,30,18);
							freshair_aut=1;
							break;
						default:
							break;
					}
				}	
				//controll frigerate function 
				if((154<da)&&(da<=205))
				{
						k_pw=!k_pw;
						if(k_pw==1)//power key at open state
						{			  //display ON in LCD
							switch_5v=1;
							delay2(500);
							power_on();
//							dp_chara(addr_ON,0,1,30,18);
						}
						else	//power key at open state
						{			  //display OFF in LCD
							switch_5v=0;
						}

				}
				delay2(1000);
				while(1)
				{
					da2=(unsigned char)sample_adc(1);
					if(da2>205)
					{
						break;
					}
				}  
			}

		}

//	}

}
 



unsigned int adc4(void)
{
	unsigned int Vd,Vd1;
	byte da;
	//p1.4 is input of adc
	//chs2~0:100B;adc_power=1;
	//speed1~0:11B
	P1M0|=0x10;
	P1M1&=0xef;
	ADC_CONTR=0xe4;
	ADC_CONTR&=0xe7;//clear start flag and end flag
	ADC_DATA=0;		//clear result data register
	ADC_LOW2=0;
	ADC_CONTR|=0x08;
	while(!(ADC_CONTR&0x10));
//	P1M0&=0xef;
//	P1M1&=0xef;
	ADC_CONTR&=0x80;
	da=	ADC_DATA;
	Vd=(unsigned int)da;
	Vd<<=2;
	da=ADC_LOW2;
	da&=0x03;
	Vd1=(unsigned int)da;
	Vd=Vd+Vd1;
	return(Vd);
}

void disp_spd(void)
{ 
	float da=0;
	byte da1=0;
	if((WA_changed)&&(alarm==0))
	{
		if(state_WA==0)
		{
			state_WA=1;
			cnt_WA=0;
			F2sWA=0;
		}
		else if((state_WA==1)&&(F2sWA==1))
		{
			F2sWA=0;
			state_WA=0;
			WA_changed=0;
			DToA();			
		}
	}	 
}

//input: wind grade; 
//output:d->a output
void DToA(void)
{
	float da;
	unsigned int da1;
	//d/a output voltage :0~4.5v
	//then amplify 4 time
	da=(float)da_WA;
	da=99-da;
	da=da*1024*18/99/4/5/2;	 //fomula is da/99*18/4/5*1024
	da1=(unsigned int)da;
	TLC5615(da1);
}

void TLC5615(unsigned int da)
{
	byte i;
	CLK=0;
	CS=1;
	DA=0;
	da<<=2;
	CS=0;
	for(i=0;i<16;i++)
	{   
		CLK=0;
		DA = (0x8000 & da )? 1 : 0;
		da<<=1;
		CLK=1;
	} 
	CLK=0;
	CS=1;			
} 

void power_on(void)
{
//	switch_5v=1;
//	delay2(1000);
	LCD_INIT();
//	k_pw=1;
//	dp_chara(addr_ON,0,1,30,18);
	sendair_out=1;
	state=1;
	//SPD out
	da_WA=99;
	WA_changed=1;
	state_WA=0;
	EX0=1;
	EX1=1;
	pwon=1;
}

void disp_ref(void)
{
	char da;
	if(alarm==0)
	{
		switch(state_ref)
		{
		 	case 0:				 //suggestion:state_ref and ref should concurrent
								 //state_ref:--	indicate neceserry to analyse temperatrue changing
				if(da_TA<=da_TC)//空调制冷输出
			    {

					state_ref=1;
					cnt_Ref=0;
					F5sRef=0;
			    }
				break;

 		 	case 1:
				if(F5sRef==1)
				{
					state_ref=0;
					F5sRef=0;
					if(da_TA<=da_TC)
				 	{
					   ref=1;//prepare open frigerate
					}
				}
				break;

			default:
				break;
		}
		da=da_TC+2;
		if(da_TA>=da) //Stop frigerate
		{
			ref=0;
		}
	}
   	else
	{
		ref=0;
	}
}
 
void ee_fresh(void)
{
	byte flag1;
	//delay 5s after storing data updated
	//than write to ee
	if(ee_changed)
	{
		if(state_Ee==0)
		{
			cnt_Ee=0;
			F5sEe=0;
			state_Ee=1;	
		}
		else if((state_Ee==1)&&(F5sEe==1))
		{
			F5sEe=0;
			state_Ee=0;
			ee_changed=0;
			EE_Erase(0x2800);
			flag1=0x33;
			EE_Write(0x2900,&flag1,1);
			EE_Write(0x2901,&flag1,1);
			EE_Write(0x2800,&da_TA,1);
		}
	}
}
 
//state_sens:0->after sens failure,caculate count for checking again 
//			 1->when time come ,check the sens state
void disp_sens(void)
{
	unsigned int Vd;
	byte da;
	if((pwon)&&(alarm==0)&&(cnt_main%255==0))
	{
		Vd=sample_adc(4);
		//temperature circle open
		//checking voltage less than 0.5v	
		//other 0.5v equal when the temperature is great than 70C
		 if(Vd<=102)
		 {
			alarm|=0x04;
			alarm&=0xf7;
			state_Sens=0;
		 }
		 else if(Vd<690)   		//checking voltage great than 3.36v	
		 {						//other 3.36v equal when the temperature is less than -10C
			Vd=sample10_adc4();
			da_TC=ct(Vd);
			da=da_TC/10;
			dp_chara(da,0,1,30,6);
			da=da_TC%10;
			dp_chara(da,0,1,36,6);
		 }
		//temperature circle short
		//checking voltage more than 3.36v
		 else if(Vd>=690)
		 {
		 	alarm|=0x08;
			alarm&=0xfb;
			state_Sens=0;
		 }
	}
	if(alarm&0x0c)
	{
						//sensor failure --alarm:bit2 open --00
						//						 bit3 short --50
			//temperature circle open
			//checking voltage less than 0.5v or great than 3.36v 
		if(state_Sens==0)
		{
		   F5sSens=0;
		   cnt_Sens=0;
		   state_Sens=1;
		}
		if((state_Sens==1)&&(F5sSens==1))
		{	
			F5sSens=0;
			Vd=sample_adc(4);
			//temperature circle open
			//checking voltage less than 2.0v or great than 2.7v 
			if(Vd<102)
			{
				alarm|=0x04;
				alarm&=0xf7;
				state_Sens=0;
			}
			else if(Vd<690)
			{
				alarm&=0xf3;
				if(alarm==0)
				{
					alarm_Resume=1;
				}
				state_Sens=0;
			}
			else
			{
			 	alarm|=0x08;
				alarm&=0xfb;
				state_Sens=0;
			}
		}		
	}	
}

void disp_fa(void)
{	
//2 min open ;8 min close
//state_fa: 0->caculate 8 min count;1->caculate 2 min count;2->wait for 8 min then
//operate; 3->wait for 2 min then operate
	if(freshair_aut)
	{
		switch(state_fa)
		{
			case 0:			//close fresh-air relay till F8m2m count to 8889
				F8m2m=0;
				cnt_fa=0;
				state_fa=2;
				freshair=0;
				break;

			case 1:		   //open fresh-air relay till F8m2m count to 2223
				F8m2m=0;
				cnt_fa=0;
				state_fa=3;
				freshair=1;
				break;

			case 2:
			   	if(F8m2m==1)
			   	{						 //8min close
					state_fa=1;
					F8m2m=0;
				}
				break;

			case 3:
			   	if(F8m2m==1)
			   	{						 //8min close
					state_fa=0;
					F8m2m=0;
				}
				break;

			default:
				break;
		}
	}
}

//in byte da1: 	bit7:chip select;
//				bit6~5:display mode select :00 ---normal
//											01 ---PR alarm
//											10 ---SENS alarm
//				bit4~bit0:display content  :in case of normal  :it points dpl[]
//											in case of PR/SENS 1---AH/50
//															   0---AL/0
//in byte da2: bit7~6:page select;bit6~0:display column select

void disp_Hpr(void)
{
//State_Hp :0->caculate 5 min count;1->wait for 5 min then judge if entering the Hp state;
//2:caculate 5 min count for exiting state; 3->wait for 5 min then judge if exiting the Hp state
    unsigned char da=0;
	switch(state_Hp)
	{
		case 0:
			if(alarm_Hpr)
			{
				F5sHp=0;
				cnt_Hp=0;
				state_Hp=1;
			}
			break;
		case 1:
			if((F5sHp==1)&&(alarm_Hpr==1))
			{
				F5sHp=0;
				alarm_Hpr=0;
				pin_hpr=1;
				if(!pin_hpr)//hight press alarm
				{
					alarm|=0x01;
					state_Hp=2;
					state_ref=0xff;
					ref=0;
				}
				else
				{
					EX0=1;
					state_Hp=0;
				}
			}	
			break;

		case 2:	
			da=alarm&0x01;
			if(da)
			{
				pin_hpr=1;
				if(pin_hpr)
				{
					F5sHp=0;
					cnt_Hp=0;
					state_Hp=3;
				}
			 }
			 break;

		case 3:	
			da=alarm&0x01;
			if((da==1)&&(F5sHp==1))
			{
				F5sHp=0;
				pin_hpr=1;
				if(pin_hpr)
				{
					F5sHp=0;
					alarm&=0xfe;
					if(alarm==0)
					{
						alarm_Resume=1;
					}
					EX0=1;
					state_Hp=0;
				}
				else
				{
					state_Hp=2;
				}
			}
			break;

		default:
			break;
	}
}



void disp_Lpr(void)
{
//State_Lp :0->caculate 5 min count;1->wait for 5 min then judge if entering the Lp state;
//2:caculate 5 min count for exiting state; 3->wait for 5 min then judge if exiting the Lp state
	unsigned char da=0;
	switch(state_Lp)
	{
		case 0:
			if(alarm_Lpr)
			{
				F5sLp=0;
				cnt_Lp=0;
				state_Lp=1;
			}
			break;

		case 1:
			if((F5sLp==1)&&(alarm_Lpr==1))
			{
				F5sLp=0;
				pin_lpr=1;
				if(!pin_lpr)//hight press alarm
				{
					alarm_Lpr=0;
					alarm|=0x02;
					state_Lp=2;
					state_ref=0xff;
					ref=0;
				}
				else
				{
					EX1=1;
					alarm_Lpr=0;
					state_Lp=0;
				}
			}	
			break;

		case 2:	
			da=alarm&0x02;
			if(da)
			{
				pin_lpr=1;
				if(pin_lpr)
				{
					F5sLp=0;
					cnt_Lp=0;
					state_Lp=3;
				}
			 }
			 break;

		case 3:	
			da=alarm&0x02;
			if((da==2)&&(F5sLp==1))
//			da=alarm&0x02;
			{
				F5sLp=0;
				pin_lpr=1;
				if(pin_lpr)
				{
					F5sLp=0;
					alarm&=0xfd;
					if(alarm==0)
					{
						alarm_Resume=1;
					}
					EX1=1;
					state_Lp=0;
				}
				else
				{
					state_Lp=2;
				}
			}
			break;

		default:
			break;
	}

}





void display(void)
{
	//alarm : bit0 Hpr alarm;bit1 Lpr alarm;bit2 SENS 00;bit3 SENS 50;
	byte da1=0;
	//fresh display TA
	if(alarm==0x00)
	{
		if(display_TA)
		{
	
			//ECCF2=0
			CCAPM1&=0xfe;
			dp_chara(addr_TA,1,1,0,18);
			da1=da_TA/10;
			dp_bigchara(da1,1,2,18,12);
			da1=da_TA%10;
			dp_bigchara(da1,1,2,30,12);
			display_TA=0;
			ee_changed=1;
			state_Ee=0;
			//Open CCF2 interrupt
		   	CCF1=0;
		   	CCAPM1|=0x01;
		}
		//fresh display WA
		if(display_WA)
		{	
			//ECCF3=0
			CCAPM3&=0xfe;
			dp_chara(addr_WA,1,1,0,18);
			da1=da_WA/10;
			dp_bigchara(da1,1,2,18,12);
			da1=da_WA%10;
			dp_bigchara(da1,1,2,30,12);
			display_WA=0;
			//control wa output
			WA_changed=1;
			state_WA=0;
			//display resume the normal state
			//only display ta
			display_resume=1;
			//Open CCF3 interrupt
		   	CCF3=0;
		   	CCAPM3|=0x01;
		}
		if(display_resume)
		{
		   	if(state_Resume==0)
			{
				cnt_Resume=0;
				F5sResume=0;
				state_Resume=1;
			}
			else if((state_Resume==1)&&(F5sResume==1))
			{
				F5sResume=0;
				state_Resume=0;
				display_resume=0;
				display_TA=1;
			}
		}
	}
	if((alarm!=0)&&(cnt_Display%37==0))
	{
		switch((alarm_state++)%4)
		{
			case 0:
				da1=alarm&0x01;
				if(da1)
				{
					lcd_clr(1);
					dp_bigchara(addr_PR,0,1,26,60);
					dp_bigchara(addr_AH,1,1,0,24);
//					speaking();
				}
				break;
			case 1:
				da1=alarm&0x02;
				if(da1)
				{
					lcd_clr(1);
					dp_bigchara(addr_PR,0,1,26,60);
					dp_bigchara(addr_AL,1,1,0,24);
//					speaking();
				}
				break;
			case 2:
				da1=alarm&0x04;
				if(da1)
				{
					lcd_clr(1);
					dp_bigchara(addr_SENS,0,1,2,60);
					dp_bigchara(addr_50,1,1,0,24);
				}
				break;
			case 3:
				da1=alarm&0x08;
				if(da1)
				{
					lcd_clr(1);
					dp_bigchara(addr_SENS,0,1,2,60);
					dp_bigchara(addr_00,1,1,0,24);
//					speaking();
				} 
				break;
			default:
				break;
		}

	}
	if(alarm_Resume)
	{
		alarm_Resume=0;
		lcd_clr(0);
		lcd_predp();
	}
}

void speaking(void)
{
	if((alarm)&&(cnt_Speaking>2))
	{
//		F54ms=0;
		cnt_Speaking=0;
		SpeakingBak=~SpeakingBak;
		if(SpeakingBak)
		{
			SPEAKER=1;	
		}
		else
		{
			SPEAKER=0;
		}

	}
	else if(alarm==0)
	{
		SPEAKER=1;
		cnt_Speaking=0;
	}
}

word sample10_adc4(void)
{
	word vresult;
	word vmax,vmin,Vd;
	byte i;
	Vd=sample_adc(4);
	vresult=vmax=vmin=Vd;
	for(i=0;i<9;i++)
	{
		Vd=sample_adc(4);
		vresult+=Vd;
		if(Vd>vmax)
		{
			vmax=Vd;
		}
		else if(Vd<vmin)
		{
			vmin=Vd;
		}
		
	}
	vresult-=vmax;
	vresult-=vmin;
	vresult>>=3;
	return(vresult);
}

void delay2(word delay)
{
 	word i;
	for(i=0;i<delay;i++);
}


unsigned char adc1(void)
{
	unsigned char da;
	//p1.1 is input of adc
	//chs2~0:001B;adc_power=1;
	//speed1~0:11B
//	P1|=0x02;
	P1M0|=0x02;
	P1M1&=0xfd;
	ADC_CONTR=0xe1;
	ADC_CONTR&=0xe7;//clear start flag and end flag
	ADC_DATA=0;		//clear result data register
	ADC_LOW2=0;
	ADC_CONTR|=0x08;
	while(!(ADC_CONTR&0x10));
//	P1M1&=0xfd;
//	P1M0&=0xfd;
	ADC_CONTR&=0x80;
	da=ADC_DATA;
	return(da);
}

unsigned int sample_adc(unsigned char ch)
{
   	unsigned int Vd,Vd2;
	switch(ch)
	{
		case 4:
			while(1)
			{
				Vd=adc4();
				Vd2=adc4();
				if(abs(Vd-Vd2)<=3)
				{
					break;
		 		}
			}
			break;

		case 1:
			while(1)
			{
				Vd=(unsigned int)adc1();
				Vd2=(unsigned int)adc1();			
				if(abs(Vd-Vd2)<5)
				{
					break;
				}
			}
			break;

		default:
			break;

	}
	return(Vd);
}


void delay(byte delay)
{
	byte i;
  	for(i=0;i<delay;i++);
}



⌨️ 快捷键说明

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