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

📄 functions.c

📁 开发的一个温控仪完整代码
💻 C
字号:
#include "TempCtrl.h"

void FunSwitch(void);

/////////////////////////////////////////////////
//按键监视及Led显示
void Monitor()
{

//////////-------------------------------------------FUN键---------------------------------------------
	if((KeySta & 0x01) && (FunCnt>25))
	{
		///TODO:在此添加处理
		if(MeterSta!=STA_MAN)
			FunSwitch();//纯粹的方便看而做
		///END TODO
		FunCnt=0;
		FunFlag=0;//kf:905
	}
	else if((FunFlag && (!(KeySta & 0x01))))
	{
		///TODO:在此添加处理
		if(MeterSta!=STA_MAN)
			FunSwitch();//纯粹的方便看而做
		///END TODO
		FunFlag=0;
	}
	//////-----------------------------------------------MAN键-------------------------------------
	if(ManFlag && (!(KeySta & 0x08)))//Man健处理
	{//单次触发
	///TODO:在此添加处理
		if(MeterSta!=STA_MAN)//
		{//变为手动
			MeterSta=STA_MAN;
			LedBuf[0]=LedCode[C_Fuhao];
			LedBuf[1]=LedCode[C_Fuhao];
			LedBuf[2]=LedCode[C_Fuhao];
			LedBuf[3]=LedCode[C_Fuhao];
			MAN_ON();
			AdmitFlag=1; //0
			PassWordLock=1;
			FFSta=0;
		}
		else
		{//变为自动,并且锁定
			MeterSta=STA_AUTO;
			PassWordLock=1;
			
			//更新显示				
			LedH(Temperature);
			DPA();

			DataTemp=Read(EP_Sv);
			InputTemp=DataTemp;
			InputLimit=10000;
			LedL(DataTemp);//设定
			DPB();
			AdmitFlag=1;//允许上排数据更新
			MAN_OFF();
		}

	///END TODO
		ManFlag=0;
	}


/////=============================================上下键控制=================================
	if((KeySta & 0x06)==0x06)
	{//依赖密码来决定那种校正
		if(InputCnt<10)
			InputCnt+=1;
		else					    
		{//触发一次校准s
			k1=Read(EP_Sr);
			if(k1==3000)
				FFSta=3000;//借用FFSta
			else if(k1==3001)
				FFSta=3001;
		}
	}
	else if(KeySta & 0x02)//向上健优先
	{
		if(MeterSta==STA_MAN)
		{
			Output=100;
		}
		else if(UpCnt>InputSpeed)//8
		{
			///TODO:
			if(InputCnt<5)
			{
				InputCnt+=1;
				InputSpeed=10;
				InputTemp+=1;
			}
			else if(InputCnt<25)
			{
				InputCnt+=1;
				InputSpeed=2;
				InputTemp+=1;
			}
			else if(InputCnt<80)
			{
				InputCnt+=1;
				InputSpeed=1;
				InputTemp+=11;
			}
			else
			{
			//	InputCnt+=1;
				InputSpeed=1;
				InputTemp+=111;
			}

			while(InputTemp>=InputLimit)
				InputTemp-=InputLimit;
			if(MeterSta!=STA_AUTO)
				ShowInputTemp();
			else if((MeterSta==STA_AUTO)&&(InputTemp!=DataTemp))
			{////自动时可以调整设定值
				Setted_Temperature=InputTemp;
				PassWordLock=0;
				Write(EP_Sv,InputTemp);
				PassWordLock=1;
				LedL(Setted_Temperature);
				DPB();
				DataTemp=InputTemp;
			}

			///END TODO
			UpCnt=0;
		}
	}
	else if(KeySta & 0x04)
	{
		if(MeterSta==STA_MAN)
		{
			Output=-100;
		}
		else if(DownCnt>InputSpeed)
		{
			///TODO
			
			if(InputCnt<5)
			{
				InputCnt+=1;
				InputSpeed=10;
				InputTemp-=1;
			}
			else if(InputCnt<25)
			{
				InputCnt+=1;
				InputSpeed=5;
				InputTemp-=1;
			}
			else if(InputCnt<80)
			{
				InputCnt+=1;
				InputSpeed=1;
				InputTemp-=11;
			}
			else
			{
			//	InputCnt+=1;
				InputSpeed=1;
				InputTemp-=111;
			}

			while(InputTemp<0)
				InputTemp+=InputLimit;
				//InputTemp=0;

			if(MeterSta!=STA_AUTO)
				ShowInputTemp();
			else if((MeterSta==STA_AUTO)&&(InputTemp!=DataTemp))
			{////自动时可以调整设定值
				Setted_Temperature=InputTemp;
				PassWordLock=0;
				Write(EP_Sv,InputTemp);
				PassWordLock=1;
				LedL(Setted_Temperature);
				DPB();
				DataTemp=InputTemp;
			}

			///END TODO
			DownCnt=0;
		}
	}
	else
	{
		if(MeterSta==STA_MAN)
		{
			Output=0;
		}
		InputCnt=0;
		InputSpeed=10;
	}

}

////////////////////////////////////////////////////////////
//公用子函数
void Wait(unsigned char x)
{
	while(x>0)
	{
		_nop_();
		x-=1;
	}
}

//Led显示
void LedH(unsigned int dat)
{
	char i=0;
	
	while(dat>=10000)
		dat-=10000;
	while(dat>=1000)
	{
		dat-=1000;
		i+=1;
	}
	LedBuf[0]=LedCode[i];

	i=0;
	while(dat>=100)
	{
		dat-=100;
		i+=1;
	}
	LedBuf[1]=LedCode[i];

	i=0;
	while(dat>=10)
	{
		dat-=10;
		i+=1;
	}
	LedBuf[2]=LedCode[i];

	LedBuf[3]=LedCode[dat];
}

void LedL(unsigned int dat)
{
	char i=0;
	
	while(dat>=10000)
		dat-=10000;
	while(dat>=1000)
	{
		dat-=1000;
		i+=1;
	}
	LedBuf[4]=LedCode[i];

	i=0;
	while(dat>=100)
	{
		dat-=100;
		i+=1;
	}
	LedBuf[5]=LedCode[i];

	i=0;
	while(dat>=10)
	{
		dat-=10;
		i+=1;
	}
	LedBuf[6]=LedCode[i];

	LedBuf[7]=LedCode[dat];
}

void Led(unsigned int dat)//调试使用
{
	
	char i=0;
	while(dat>=10000)
	{
		dat-=10000;
		i++;
	}
	LedH(i);
	
	//dat%=10000;
	LedL(dat);
}



void ShowInputTemp()
{
	if(AdmitFlag==1)
		return;
	if((MeterSta!=STA_Sr)&&(PassWordLock==1))
		return;

	LedH(InputTemp);

	switch(MeterSta)//加个小数点
	{
		//case STA_Sr://1
		case STA_AUTO:
		case STA_Sv://		2
		case STA_SH://		3
		case STA_SL://		4
		//case STA_oH://		5
		//case STA_oL://		6
		//case STA_P://		7
		//case STA_I://		8
		//case STA_d://		9
		//case STA_db://		10
		//case STA_Fd://		11//Fun只在上述循环
			DPA();
			break;
		case STA_oL://
		case STA_P://		7
		case STA_I://		8
		case STA_d://		9
			LedBuf[1]+=128;
			break;
		default:
			;
	}
}

void FunSwitch()
{
	MeterSta++;
	if(MeterSta>=13)//不包含13
	{
		MeterSta=0;
		MAN_OFF();
	}
	AdmitFlag=0;
	switch(MeterSta)
	{//此处仅存储和显示即可,更新InputTemp,DataTemp
	 	case 0://STA_AUTO
			//存储
			if(DataTemp!=InputTemp)
			{//功能键处理=========
				k0=Read(EP_Fd);
				switch(k0)
				{
					case 0:
						if(InputTemp!=0)
						switch(InputTemp)
						{//单次功能实现
							case 5555:
								Write(	EP_FT,	0xffff);
								break;
							case 1000:
							case 2000:
							case 2001:
								FFSta=InputTemp;
								break;
						}
						break;
					case 1://升温下线
						if(InputTemp>LineB)
						{
							Write(EP_FF1,InputTemp);
							LineA=InputTemp;
						}
						break;
					case 2://
						if((InputTemp<LineA)&&(InputTemp>LineC))
						{
							Write(EP_FF2,InputTemp);
							LineB=InputTemp;
						}
						break;
					case 3://
						if((InputTemp<LineB)&&(InputTemp>0))
						{
							Write(EP_FF3,InputTemp);
							LineC=InputTemp;
						}
						break;
					case 4://
						if(InputTemp>LineC)
						{
							Write(EP_FF4,InputTemp);
							LineD=InputTemp;
						}
						break;
					default:
						break;
				}
			}
		
			
			//更新
			LedH(Temperature);
			DPA();
			DataTemp=Read(EP_Sv);
			InputTemp=DataTemp;
			InputLimit=5001; //400.0 degree is upper limit
			LedL(DataTemp);
			DPB();
			if(AdmitFlag==0)
				AdmitFlag=1;//允许上排数据更新
			break;
		case 1://Sr 密码
			//存储:不需
			//更新
			LedBuf[4]=LedCode[C_S];
			LedBuf[5]=LedCode[C_r];
			MieDown();				
			//更新
			DataTemp=Read(EP_Sr);
			LedH(DataTemp);
			InputTemp=DataTemp;				
			InputLimit=10000;
			break;
		case 2://Sv 设定值
			//存储	
			if(InputTemp!=DataTemp)
			{//
				PassWordLock=0;
				Write(EP_Sr,InputTemp);				
			}
			if(InputTemp==2000)
				PassWordLock=0;//开锁
			else
				PassWordLock=1;
			
			//更新
			LedBuf[4]=LedCode[C_S];
			LedBuf[5]=LedCode[C_v];
			MieDown();				
			DataTemp=Read(EP_Sv);
			InputTemp=DataTemp;
			InputLimit=5001;///most 400.0 degree
			LedH(DataTemp);
			DPA();
			break;
		case 3://SH	上限
			if(DataTemp!=InputTemp)
			{
				Setted_Temperature=InputTemp;
				Write(EP_Sv,InputTemp);
			}
			//更新
			LedBuf[4]=LedCode[C_S];
			LedBuf[5]=LedCode[C_H];
			MieDown();				
			DataTemp=Read(EP_SH);
			InputTemp=DataTemp;
			InputLimit=5001;//
			LedH(DataTemp);
			DPA();
			break;
		case 4://SL	下限
			if(DataTemp!=InputTemp)
			{
				Write(EP_SH,InputTemp);
				UpperLimit=Read(EP_SH);
			}
			//更新
			LedBuf[4]=LedCode[C_S];
			LedBuf[5]=LedCode[C_L];
			MieDown();				
			DataTemp=Read(EP_SL);
			InputTemp=DataTemp;
			InputLimit=5001;//99%
			LedH(DataTemp);
			DPA();
			break;
		case 5://oH	开度上
			if(DataTemp!=InputTemp)
			{
				Write(EP_SL,InputTemp);
				LowerLimit=Read(EP_SL);
			}
			//更新
			LedBuf[4]=LedCode[C_o];
			LedBuf[5]=LedCode[C_H];
			MieDown();				

			DataTemp=Read(EP_oH);
			InputTemp=DataTemp;
			InputLimit=101;//最大值加1
			LedH(DataTemp);
			break;
		case 6://oL	开度下
			if(DataTemp!=InputTemp)
			{
				Write(EP_oH,InputTemp);
				//更新PID系数
				UpdatePid();
			}
			//更新
			LedBuf[4]=LedCode[C_o];
			LedBuf[5]=LedCode[C_L];
			MieDown();				

			DataTemp=Read(EP_oL);
			InputTemp=DataTemp;
			InputLimit=100;//99
			LedH(DataTemp);
			LedBuf[1]+=128;
			break;
		case 7://P
			if(DataTemp!=InputTemp)
			{
				Write(EP_oL,InputTemp);
				//更新输出下限
				MinOutputLimit=MinOutputLimit;
			}
			//更新
			LedBuf[4]=LedCode[C_P];
			LedBuf[5]=LedCode[C_Mie];
			MieDown();				

			DataTemp=Read(EP_P);
			InputTemp=DataTemp;
			InputLimit=10000;
			LedH(DataTemp);
			LedBuf[1]+=128;
			break;
		case 8://I
			if(DataTemp!=InputTemp)
			{
				Write(EP_P,InputTemp);
				UpdatePid();
			}
			//更新
			LedBuf[4]=LedCode[C_I];
			LedBuf[5]=LedCode[C_Mie];
			MieDown();				

			DataTemp=Read(EP_I);
			InputTemp=DataTemp;
			InputLimit=10000;
			LedH(DataTemp);
			LedBuf[1]+=128;
			break;
		case 9://d
			if(DataTemp!=InputTemp)
			{
				if(InputTemp!=0)
					Write(EP_I,InputTemp);
				UpdatePid();
			}
			//更新
			LedBuf[4]=LedCode[C_d];
			LedBuf[5]=LedCode[C_Mie];
			MieDown();				

			DataTemp=Read(EP_d);
			InputTemp=DataTemp;
			InputLimit=10000;
			LedH(DataTemp);
			LedBuf[1]+=128;
			break;
		case 10://db 闸位死区
			if(DataTemp!=InputTemp)
			{
				Write(EP_d,InputTemp);
				UpdatePid();
			}
			//更新
			LedBuf[4]=LedCode[C_d];
			LedBuf[5]=LedCode[C_b];
			MieDown();				

			DataTemp=Read(EP_db);
			InputTemp=DataTemp;
			InputLimit=100;//99
			LedH(DataTemp);
			break;
		case 11://Fd
			if(DataTemp!=InputTemp)
			{
				Write(EP_db,InputTemp);
				DeathZone=InputTemp;
			}
			//更新
			LedBuf[4]=LedCode[C_F];
			LedBuf[5]=LedCode[C_d];
			MieDown();				

			DataTemp=0;//Read(EP_Fd);
			InputTemp=DataTemp;
			InputLimit=100;//0~99
			LedH(DataTemp);
			break;
		case 12://FF 功能键
			Write(EP_Fd,InputTemp);
			//更新

			LedL(InputTemp);
			LedBuf[4]=LedCode[C_F];
			LedBuf[5]=LedCode[C_F];
			//MieDown();			
			switch(InputTemp)
			{
				case 0:
					InputLimit=10000;
					break;
				case 1://升温下线
					DataTemp=Read(EP_FF1);
				//	InputTemp=DataTemp;
					InputLimit=10000;//9999
					break;
				case 2://Pid区
					DataTemp=Read(EP_FF2);
					
					InputLimit=10000;//9999
					break;
				case 3://降温上线
					DataTemp=Read(EP_FF3);
				//	InputTemp=DataTemp;
					InputLimit=10000;//9999
					break;
				case 4://
					DataTemp=Read(EP_FF4);
					//InputTemp=DataTemp;
					InputLimit=10000;//9999
				default:
					;
			}
			
			LedH(DataTemp);
			InputTemp=DataTemp;
			break;
		default:
			MeterSta=0;
		}
}

void UpdatePid()
{
	k0=Read(EP_P);
	fK1=k0/100.0;//Kp
	k0=Read(EP_I);
	fK2=k0/100.0;//Ki
	k0=Read(EP_d);
	fK3=k0/100.0;//Kd
}

void UpdateFrZero()
{
	k0=Read(EP_FrMin);
	if(k0 & 0x8000)
	{
		k0=k0 & 0x7fff;
		FrZero=-k0;
	}
	else
		FrZero=k0;
	k0=Read(EP_FrMax);
	if(k0 & 0x8000)
	{
		k0=k0 & 0x7fff;
		FrZero=FrZero-k0;
	}
	else
		FrZero=FrZero+k0;

	FrZero=FrZero/2;
}

⌨️ 快捷键说明

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