📄 main.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 + -