AT89S52单片机控制继电器用电炉子对水加热。通过DS18B20传感器采集温度,采用PID算法的程序

2024-12-05 05:57:03
推荐回答(2个)
回答1:

我博客上有DS18B20的程序,您可以去参考,控制继电器,加个if语句,就可以了。

回答2:

void key()
{
static uchar keycnt;
static bit keyesc;
funcnt=0x00;
funval=0x00;
if(keydone) //上次按键任务已完成
{
if(K1==0&&K2&&K3&&K4)
else if(K2==0&&K1&&K3&&K4)
else if(K3==0&&K2&&K1&&K4)
else if(K4==0&&K2&&K1&&K3)
}
if(!funcnt)
{
shans=1;
keypre=0x00;
keyesc=0x00;task=0x00;keycnt=0x00;
}
else if(!keyesc)
{
if(funcnt>1) keyesc=1;
else if(funval!=keypre)
{
keypre=funval;
keycnt=0x00;
}
else
{
keycnt++;
switch(task)
{
case 0:
if(keycnt==N)
{
shans=1;
keyprocess=1;
if(K1==0||K4==0) keyesc=1;
else
{
task++;
keycnt=0;
}
}
break;
case 1:
if(keycnt==MaxRate)
{
shans=0;
keyprocess=1;
keycnt=0;
task++;
}
break;
case 2:
if(keycnt==MinRate)
{
shans=0;
keyprocess=1;
keycnt=0;
}
break;
}
}
}
}
//功能键处理
void key1()
{
if(!keymark)
{
pb=&buffer[0];
blink=0x01;
keymark=1;
shans=1;
}
else
{
pb++;
blink<<=1;
if(pb>=&buffer[4])
{
pb=&buffer[0];
blink=0x01;
}
}
}
//*************************************//
void key2()
{
if(keymark)
{
*pb+=1;
if(*pb>=0x0a)
*pb=0x00;
}
}
//*************************************//
void key3()
{
if(keymark)
{
if(*pb<=0) *pb=9;
else *pb-=1;
}
}
void key4()
{
if(keymark)
{
blink=0x00;
keymark=0;
write_add(9,buffer[1]);
write_add(10,buffer[2]);
write_add(11,buffer[3]);
}
}
void keyXZ()
{
if(keyprocess)
{
keydone=0;
keyprocess=0;
switch(keypre)
{
case 0x01:key1();break;
case 0x02:key2();break;
case 0x03:key3();break;
case 0x04:key4();break;
}
keydone=1;
}
}
//*************************************//
/*********************************************
功能:定时器0中断服务程序
*********************************************/
void timer0() interrupt 1
{
TH0=V_TH0;
TL0=V_TL0;
flash();
key();
}
另外,站长团上有产品团购,便宜有保证