📄 water.c
字号:
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 + -