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

📄 water.c

📁 详细介绍了怎么利用单片机实现自身温度控制的程序!通过了实验验证!效果不错!
💻 C
📖 第 1 页 / 共 2 页
字号:

	adresult = filter(3);	
	v = adresult*5.0/4095.0; 
	logval = log(v/CUR);
	m = 1.120332914398244e-003 ;
 	n = 2.354891980894096e-004*logval;
	z = 8.289547029771934e-008*logval*logval*logval;
 	tem = 1.0/(m + n + z) - 273.15+0.11;	
	nop();	
	Tout= tem*100;      
}


void GetTemTin()   							//测入水温度
{
	uint  adresult;
	float  v,tem,logval;
	float  m,n,z;

	adresult = filter(2);	
	v = adresult*5.0/4095.0; 
	logval = log(v/CUR);
	m = 1.120332914398244e-003 ;
 	n = 2.354891980894096e-004*logval;
	z = 8.289547029771934e-008*logval*logval*logval;
 	tem = 1.0/(m + n + z) - 273.15+0.11;
	nop();	
	Tin= tem*100;     
}

void GetTemset()   								//测量外控时的设定温度
{
	uint  idata adresult;
	float idata v;
	adresult = filter(4);	
	v = adresult*5.0/4095.0; 
	nop();	
	TsetB= v*1000;      //温控1实际温度
}
/**************************************DA转换****************************************/
void SendTout()      //电流设定,DAC0,
{
	int  DAcode;			    //5v--6A需确认
	float v;
	v = Tout/1000.0;
	DAcode = (int)(4095/5.0*v);
	if(DAcode>4095)
	{
		DAcode = 4095;
	}
	else if(DAcode<0)
	{
		DAcode = 0;
	}
	DAC1H = DAcode/256;
	DAC1L = DAcode%256;
}
void SendLim()      //电流设定,DAC0,
{
	int  DAcode;			    //5v--6A需确认
	float v;
	v = Rate*1.0/100.0;
	DAcode = (int)(4095/5.0*v);
	if(DAcode>4095)
	{
		DAcode = 4095;
	}
	else if(DAcode<0)
	{
		DAcode = 0;
	}
	DAC0H = DAcode/256;
	DAC0L = DAcode%256;
}


/***********************************外控温度设定程序**********************************/
void ExTempSet()
{
	int i;
	uint k;
	uint j=0;
	for(i=0;i<15;i++)
	{
		GetTemset();
		k=TsetB;
		j=j+k;
	}
	TsetB=j/15;
	if(TsetB>3500||TsetB<500)
	{
		Errorflag[4]=1;
		ErrorNum++;
	}
	else
	{
		Tset=TsetB;
	}
}
/**********************************外控******************************************/
void Excontrol()
{
	if(Moder==0)
	{
		if(Ready==0)
		{
			begin=0;
			write7279(SEGOFF,  LED_Standby);		
		}
		if(Ready==1)
		{
			begin=1;
			write7279(SEGON,  LED_Standby);
		}
	}
}
/**********************************PWM的输出*************************************/
void Pwmout(uint p)
{
	PWM1H=26214/256;				//PWM产生10HZ的脉冲
	PWM1L=26214%256;

	PWM0H=p/256;					//控制输出占空比
	PWM0L=p%256;
	
	Star=1;
}

/***************************************控温过程*********************************/
void TempControl()
{
	int DT;
	int x;
	int y;
	int j;
	DT=Tout-Tset;
	x=Tset-Tout;
	y=Toutc-Tout;               //上次测温与此次之差
	j=Tout-Toutc;				//
	if(DT>150)
	{	
		Tc=26124;
		Pwmout(Tc);
	}
	if(x>100)
	{	
		PWMCON=0x80;
		PWM=0;
		Star=0;
		Pout=0;
	}
	if(80<DT && DT<=150)
	{
		if(Star==1)
		{
			if(y>20)
			{	
				Tc=Tc*0.70;
				Pwmout(Tc);
			}
			 else if(y<5||j>=0)
			{
				Tc=Tc*1.20;
				if(Tc>26124)
				{
					Tc=26124;
				}
				Pwmout(Tc);
			}
			else
			{
				Pwmout(Tc);
			}
		}
		if(Star==0)
		{
			Tc=26124*0.5;
			Pwmout(Tc);
		}
	}
	if(10<DT && DT<=80)
	{
		if(Star==1)
		{
			if(y>15)
			{
				Tc=Tc*0.95;
				Pwmout(Tc);
			}
			else if(y<8||j>=0)
			{
				Tc=Tc*1.015;
				if(Tc>26124)
				{
					Tc=26124;
				}
				Pwmout(Tc);		
			}
			else
			{
				Pwmout(Tc);
			}
		}
		if(Star==0)
		{
			Tc=26124*0.3;
			Star=1;
			Pwmout(Tc);
		}
	}
	if(0<DT && DT<=10)
	{
		if(Star==1)
		{
			if(y>10)
			{
				Tc=Tc*0.99;
				Pwmout(Tc);
			}
			else if(j>=0)
			{
				Tc=Tc*1.01;
				Pwmout(Tc);
			}
			else
			{
				if(y>3)
				{
					Tc=Tc*0.9996;
					Pwmout(Tc);
				}
				if(j>3)
				{
					Tc=Tc*1.0003;
					Pwmout(Tc);
				}
				else
				{
					Pwmout(Tc);
				}
			}
		}
		if(Star==0)
		{
			Tc=26124*0.1;
			Pwmout(Tc);
		}
	}

//以上为实际温度比设定温度高得情况下制冷的过程
//以下为实际温度比设定温度低的情况下控制的过程
	if(x<=50 && x>10)
	{
		if(Star==1)
		{
			Tc=Tc*0.92;
			Pwmout(Tc);
		}
		if(Star==0)
		{
			Pout=0;
		}
	}
	if(0<x && x<=10)
	{
		if(Star==1)
		{
			Tc=Tc*0.9996;
			Pwmout(Tc);
		}
		else
		{
			nop();
		}
	}
	Toutc=Tout;
}


/******************定时器1的中断服务程序**********************/

void intsvr1(void) interrupt 1
{  
	//重新装入计时器1的初值
	 TR0=0;
	 TH0 = (65536-55924)/256; 
     TL0 = (65536-55924)%256;   
     Timernum+=1;
   if (Timernum >= 300)//1S
   {
        TR1 = 0;
		Rate = (TH1*256+TL1)*5.67;
		Timernum = 0;
		TH1 = 0x00;
		TL1 = 0x00;
		TR1 = 1;			  
   }
	TR0 = 1;
}
		

/********************定时器初始化*******************************/

void Timer_init(void)
{
	//设置中断和定时器
	TMOD = 0x51;			//定时器1计数,定时器0计时
	TH1= 0x00;
	TL1 = 0x00;			
	TH0 = (65536-55924)/256;				// 单位计时50ms
	TL0 = (65536-55924)%256;
 	EA=1;           //开放总中断,
 	ET0=1;          //暂不允许计时器中断   
	ET1=0;
  	PT0=0;			//定时器中断优先级
	PT1=1;
	
	IT0 = 1;			//外部中断,电平触发
	PX0 = 1;

	TR0 = 1;            //定时器开始
	TR1 = 0;

}

/**************************************长延时*********************************/
void TimeCountInt()
{
	IEIP2 |= 0x04;  //允许计时器中断
	INTVAL = 1; //计时间隔一秒钟
}

void TimeCount_INT(void) interrupt 10
{
	Second++;
	N++;
	if(Second==3)
	{
		Time1=1;		
	}
	if(Second==4)
	{
		Time=1;
	}
	if(T-Tout>80)
	{
		Time2=1;
	}
	if(Second==6)
	{
	//	I++;
	/*	if(I>=1)
		{
			Time5=1;
			I=0;
		}*/
		Time3=1;
		Second=0;
	}
	TIMECON=0x13;
}

void Longdelay()
{
	int i=0;
	TimeCountInt();
	TIMECON=0x13;
	while(!i)
	{
		i=Time;
	}
	delay(5000);
	delay(50000);
	TIMECON=0x00;
	delay(50000);
	delay(50000);
}
/***************************************多次开关水泵测流量************************************/
void FlowDet()
{
	int j=0;
	int i=0;
	int k=0;
	int s=0;
	while(!s)
	{
		k++;
		if(k==3)
		{
			s=1;
		}
		if(Rate<20)
		{
			WATER=1;
			for(j=0;j<10;j++)
			{
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
			}
			delay(1000);
			WATER=0;
			for(i=0;i<10;i++)
			{
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
				delay(50000);
			}		
		}
		if(Rate>30)
		{
			nop();
			s=1;
		}
	}
}
void closeWater()
{
	if(Rate<30)
	{
		WATER=1;
	}
}

/***************************************save***************************************/
void StoreData1(void)
{
	bit bEA;
	bEA=EA;
	EA=0;
	EADRH = 0x00;

	EADRL=0x84;
	EDATA1=TL/256;      //保存设置电流值,按关闭键时保存
	EDATA2=TL%256;	
	ECON = 0x05;  //擦除一页
	delay(1);
	ECON = 0x02;  //写一页
	EA=bEA;
}

void StoreData2(void)
{
	bit bEA;
	bEA=EA;
	EA=0;
	EADRH = 0x00;

	EADRL=0x85;
	EDATA1=Tset/256;      //保存设置温度值,按关闭键时保存
	EDATA2=Tset%256;	
	ECON = 0x05;  //擦除一页
	delay(1);
	ECON = 0x02;  //写一页
	EA=bEA;
}

/****************************************调用存储***************************************/
void RetriveData1(void)
{
	bit bEA;
	int  s1, s2;
	bEA = EA;
	EA = 0;

	EADRH = 0x00; 
	
	EADRL = 0x84;
	delay(1);
	ECON = 0x01; //read
	delay(1);
	s1 = EDATA1;
	s2 = EDATA2;
	TL = s1 *256 + s2;
	EA=bEA;
}

void RetriveData2(void)
{
	bit bEA;
	int  s1, s2;
	bEA = EA;
	EA = 0;

	EADRH = 0x00; 
	
	EADRL = 0x85;
	delay(1);
	ECON = 0x01; //read
	delay(1);
	s1 = EDATA1;
	s2 = EDATA2;
	Tset = s1 *256 + s2;
	EA=bEA;
}


/****************************************开机测温判断********************************/
commpare()
{
	int i;
	if(WATER==0)
	{
		GetTemTout();
		delay(100);
		GetTemTout();
		T=Tout;
		Second=0;
		TimeCountInt();
		TIMECON=0x13;
		while(!i)
		{
			i=Time1;
			nop();
			GetTemTout();
		}
		TIMECON=0x00;
		Second=0;
		GetTemTout();
		if(abs(Tout-T)>0.8)
		{
			RetriveData1();	                //调用以前的值
		}
		else if(abs(Tout-T)<0.1)
		{
			Pwmout(26124);
			TIMECON=0x13;            	//满功率并计时并存储
			while(!i)
			{
				i=Time2;
				nop();
				GetTemTout();
			}
			TL=Second-1;;
			delay(5000);
			Second=0;
			StoreData1();
			TIMECON=0x00;
		}
	}
	else
	{
		nop();
	}
}


/***************************************出错报警*********************************************/
void Fault()
{
	int a;
	a=abs(Tout-ToutB);
	if(a>1)
	{
		NT = 0;
	}
	else
	{
		NT++;
	}
	ToutB=Tout;
	if(water==1)
	{
		PWMCON=0x80;
		PWM=0;
		Star=0;
		Pout=0;
		delay(100);
		WATER=1;
		write7279(SEGON,LED_LackWater);
		write7279(SEGON,LED_FlowLow);
		write7279(SEGOFF,  LED_Standby);
	}

	if(Rate<20)
	{
		PWMCON=0x80;
		PWM=0;
		Star=0;
		Pout=0;
		WATER=1;
		Errorflag[0] = 1;
		ErrorNum ++;
		write7279(SEGON,LED_FlowLow);
		write7279(SEGOFF,  LED_Standby);
	}
	else if(Rate<40)
	{
		Errorflag[1] = 1;
		ErrorNum ++;
		write7279(SEGON,LED_FlowLow);
	}
	else if(Tout>4000&&Star==1)
	{
		Errorflag[2] = 1;
		ErrorNum ++;
		write7279(SEGON,LED_Fault);
	}
	else if(NT>80)
	{
		if(abs(Tout-Tset)>100&&Star==1)
		{
			Errorflag[3] = 1;
			ErrorNum ++;
			write7279(SEGON,LED_Fault);
		}
	}
	else if(Tout<450)
	{
		PWMCON=0x80;
		PWM=0;
		Star=0;
		Pout=0;
		Errorflag[5] = 1;
		ErrorNum ++;
		write7279(SEGON,LED_Fault);
		write7279(SEGOFF,  LED_Standby);
	}
	else
	{
		ErrorNum=0;
		write7279(SEGOFF,LED_FlowLow);
		write7279(SEGOFF,LED_Fault);
		write7279(SEGOFF,LED_LackWater);
	}
}
/****************************************错误显示********************************/
void FaultDisp()
{
	if(ErrorNum == 0)
	{
		lcd_DispString(3,3,"    OK    ");
	}
	else if (Errorflag[0] == 1)                
	{                                          
		lcd_DispString(3,3," BlockFlow");
		write7279(SEGON,LED_Fault);
	}
	else if (Errorflag[1] == 1)
	{
		lcd_DispString(3,3," Low Flow ");
		write7279(SEGON,LED_Fault);
	}
	else if (Errorflag[2] == 1)
	{
		lcd_DispString(3,3," Full cool");
		write7279(SEGON,LED_Fault);
	}
	else if (Errorflag[3] == 1)
	{
		lcd_DispString(3,3," Full cool");
		write7279(SEGON,LED_Fault);
	}
	else if (Errorflag[4] == 1)
	{
		lcd_DispString(3,3," Tset Err ");
		write7279(SEGON,LED_Fault);
	}
	else if (Errorflag[5] == 1)
	{
		lcd_DispString(3,3," Temp low ");
		write7279(SEGON,LED_Fault);
	}	
}

void initlization()
{	
	PLLCON &= 0xf8;   					//设置时钟频率16.777216M
	PWM=0;
	Ready=0;
	water=0;							//水位状态
	WATER=1;							//关闭水泵
	delay(5000);
	delay(5000);

	CFG842 = 0x81;    					//扩展堆栈指针,使能2k片上数据存储区	ADCCON1=0x64;  	// power up ADC
	ADCCON1 = 0xec;   					// power up ADC
	DACCON = 0x1f;    					//power up DAC
	DAC1H = 0x00;   					//force both DAC out put 0 V
	DAC1L = 0x00;
	DAC0H = 0x00;
	DAC1H = 0x00;
	delay(1000);
	Moder=0;
	Lcd_Start();

	Tc=26124;							//满功率计数值
	TimeCountInt();
	Timer_init();
	delay(1000);
	delay(1000);
	delay(1000);
	WATER=0;							//开水泵
					
	delay(5000);
	Longdelay();					//5S
	RetriveData2();
	delay(500);
	FlowDet();
	delay(10000);
	closeWater();
	delay(10000);
	delay(10000);
//	ScreenFresh();
//	commpare();							//开机测温并记录水的导热延时
	EA = 0;                             //暂不不允许中断
	delay(50);      
	EA = 1;
}

main()
{
	uint i=0;
	uint j=0;
	initlization();
	TIMECON=0x13;
	while(1)
	{
		if(Time3==1)
		{
			if(begin==1)
			{
				if(Star==0)
				{
					PWMCON=0x1f;					//开启PWM	
				}
				if(Star==1)
				{
					nop();
				}
				TempControl();
			}
		    if(begin==0)
			{
				if(Star==1)
				{
					PWMCON=0x80;
					Star=0;
				}
			}
			Time3=0;
		}
		i++;
		j++;
		if(i>5000)
		{
			GetTemTout();
			delay(500);
			GetTemTin();
			delay(500);
			GetTemset();
			delay(500);
			if(Moder==0)
			{
				ExTempSet();						//外控温度读取
			}
			SendTout();
			delay(500);
			SendLim();
			key_detect();
			delay(500);
			delay(500);
			Excontrol();
			delay(500);
			Fault();
			i=0;
		}

		if(j>65000)
		{
			ScreenFresh();
			j=0;
		}
	}
}



















⌨️ 快捷键说明

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