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

📄 main.c

📁 开发的一个温控仪完整代码
💻 C
字号:
//korfi make this file
//Updata:
//korfi,13/09/2006:修改第一次验收时的缺点
//korfi,14/09/2006:添加模糊自整定pid算法
//korfi,15/09/2006:修正了校准办法
//korfi,20/09/2006:第一次实物调试后的修改,比较大的改动


#include "TempCtrl.h"

sfr T2MOD  = 0xC9;

#define __EEPROM_DEBUG__	0//调试用1,每次复位重新装载初始值到EEPROM
							 //产品用0,	除了第一次装载初始值外不在覆盖设定值
/////////////////////////////////////////
void main()
{


	/////////////////////////////////////////////
//EEPROM操作

	DataTemp=Read(EP_FT);
	if((DataTemp!=0xaa)||__EEPROM_DEBUG__)
	{//将初始化数据拷贝到EEPROM中
		
		PassWordLock=0;

		Write(	EP_FT,	0xaa);//EEPROM 标记
		Write(	EP_Sr,	2000);//初始密码
		Write(	EP_Sv,	Setted_Temperature);//设定值
		Write(	EP_SH,	UpperLimit);
		Write(	EP_SL,	LowerLimit);
		Write(	EP_oH,	42);//全开时间:s
		Write(	EP_oL,	(unsigned int)MinOutputLimit);//最小输出时间:分辨率0.01s
		Write(	EP_P,	000);//P-->Kp*10,分辨率0.01
		Write(	EP_I,	500);//I-->Ti*10,分辨率0.01
		Write(	EP_d,	400);//d-->Td*10,分辨率0.01
		Write(	EP_db,	(unsigned int)DeathZone);//闸位死区
		Write(	EP_Fd,	100);//分度号

		Write(EP_FrMin,0);
		Write(EP_FrMax,0);
		Write(EP_FF1,LineA);
		Write(EP_FF2,LineB);
		Write(EP_FF3,LineC);
		Write(EP_FF4,LineD);
		
		PassWordLock=1;	
		
	} 
	else
	{
		//EEPROM 标记
		//初始密码
				
		Setted_Temperature=Read(EP_Sv);//设定值

		UpperLimit=Read(EP_SH);//上限
		LowerLimit=Read(EP_SL);
		MinOutputLimit=Read(EP_oL);//

		DeathZone=Read(EP_db);
		LineA=Read(EP_FF1);
		LineB=Read(EP_FF2);
		LineC=Read(EP_FF3);
		LineD=Read(EP_FF4);
	}

	UpdatePid();
	UpdateFrZero();
/////////////////////////////////////////////
	TMOD=0x15;//T0 16bit 计数器,
	TH0=0x00; TL0=0x00;//
	//T2  16bit 定时器
	TH1=0xf6; TL1=0x3c;//T=(65536-X)*12/fosc,X=65536-T*fosc/12,T=2.5ms
	ET1=1;TR1=1; 
//	T2MOD=0x00;	//2.5ms		0.01s	0.1s	max=0.131s
	RCAP2H=0xec;//0xfb		0xec		0x3c
	RCAP2L=0x78;//0x1e		0x78		0xb0
	TR2=1;
	ET2=1;
	
	ET0=1;
	TR0=1;

	P1=Channel[0];//0x1f;//ch0

	KeySta=0x00;
	P_KEY=1;
	EA=1;
	AdmitFlag=1;
	DataTemp=Read(EP_Sv);
	InputTemp=DataTemp;
	
	while(1)
	{
		Monitor();//监视按键,完成相应动作,因电路特定,显示亦在其中

		if(SampleFlag)
		{
			///TODO
			IdTimeCnt+=1;
			if(IdTimeCnt>=5)
				IdTimeCnt=0;
			SamplingProcess();
		
			//显示切换
			if(DlySecond>0)//&&(AdmitFlag==0))
				DlySecond-=1;
			else
				PassWordLock=1;
			if((DlySecond==1)&&(MeterSta!=STA_MAN))
			{//更新一次显示
				LedH(Temperature);
				DPA();

				DataTemp=Read(EP_Sv);
				InputTemp=DataTemp;
				InputLimit=5001; //400.0 degree is upper limit
				LedL(DataTemp);
				DPB();
				MeterSta=STA_AUTO;
				AdmitFlag=1;//允许上排数据更新
			}
			
			if(CloseOpenTimeCnt>0)
			{
				Output=100;
				CloseOpenTimeCnt-=1;
			}
			else if(CloseOpenTimeCnt<0)
			{
				Output=-100;
				CloseOpenTimeCnt+=1;
			}
			///END TODO
			SampleFlag=0;
		}
		else
			for(i=0;i<50;i++);//改变此数值以改变亮度
	}

}

//////////////////////////////////////////////////////////////////////////
void timer0()interrupt 1 using 2	//溢出记录
{//测频
	TF0=0;
	OverCnt+=1;	
	TH0=00;
	TL0=0x00;
	LedBuf[0]=LedCode[C_o];
	LedBuf[1]=LedCode[C_o];
	LedBuf[2]=LedCode[C_o];
	LedBuf[3]=LedCode[C_o];
}

void timer2()interrupt 5 using 3//定时0.01s 可以加长
{//定时
	TF2=0;

	SampleTimeCnt++;
	if(SampleTimeCnt==100)////1s/
	{////
		SampleTimeCnt=0;
		
		TR0=0;///--		
		TpTL0=TL0;
		TL0=0;
		TpTH0=TH0;
		TH0=0;
		TR0=1;///--	

		OverCnt=0;
		SampleFlag=1;
	}
	//输出下限处理
	/*
	if(Output!=TwinOutput)
	{//新一轮输出
		if((Output<MinOutputLimit)&&(Output>-MinOutputLimit))
		{
			SpareOutput+=Output;
			Output=0;
		}
		else
		{
			Output+=SpareOutput;
			SpareOutput=0;
		}
	}
	if((Output==0)&&((SpareOutput>MinOutputLimit)||(SpareOutput<-MinOutputLimit)))
	{
		Output=SpareOutput;
		SpareOutput=0;
	}
	*/

	if(Output>0)
	{
		PosOutput();
		R_ON();
		L_OFF();
		Output--;
	}
	else if(Output<0)
	{
		NegOutput();
		L_ON();
		R_OFF();
		Output++;
	}
	else
	{
		OffOutput();
		L_OFF();
		R_OFF();		
	}
	TwinOutput=Output;
}

void time1() interrupt 3
{
	TF1=0;
	if(LedCnt>=8)
	{
		P_KEY=1;
		LedCnt=0;
		LedBitCnt=0x01;
	}
	P2=0xff-LedBitCnt;
	P0=LedBuf[LedCnt];

//
	if(LedCnt<4)
	{//前4bit,读按键
//		P_KEY=1;//拉高,任外面拉低以确认按键
		_nop_();
		_nop_();
		switch(LedBitCnt)
		{
			case 0x01://Fun
				if(P_KEY)
				{
					KeySta|=0x01;
					FunFlag=1;
					FunCnt+=1;
					DlySecond=11;//10s
				}
				else
				{
					KeySta &= (0xff-0x01);
					FunCnt=0;
				}
				break;
			case 0x02://Up
				if(P_KEY)
				{
					KeySta|=0x02;
					UpCnt+=1;
					DlySecond=11;//10s
				}
				else
				{
					KeySta &= (0xff-0x02);
					UpCnt=0;
				}
				break;
			case 0x04://Down
				if(P_KEY)
				{
					KeySta|=0x04;
					DownCnt+=1;
					DlySecond=11;//10s
				}
				else
				{
					KeySta &= (0xff-0x04);
					DownCnt=0;
				}
				break;
			case 0x08://Man
				if(P_KEY)
				{
					KeySta|=0x08;
					ManFlag=1;
					DlySecond=11;//10s
				}
				else
					KeySta &= (0xff-0x08);
				break;
			default:
				;
		}
	}
	else
	{//后4bit,显示状态
		if(LedBitCnt & KeySta)//
			P_KEY=0;//亮
		else
			P_KEY=1;//灭
	}

	LedCnt++;
	LedBitCnt<<=1;

	TH1=0xfc;
	TL1=0x18;
}

⌨️ 快捷键说明

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