毕设帮助、开题指导、技术解答(有偿)见文末。
目录
目录
摘要
主要实现:实时温度测量及显示,超出温度范围相应的继电器工作,继电器可以驱动相应的加热或制冷负载,上下限温度可通过按键设定等功能。
本数字温度报警器是基于51单片机及温度传感器DS18B20来设计的,温度测量范围0到99.9摄氏度,精度为0.1摄氏度,可见测量温度的范围广,精度高的特点。可设置上下限温度,默认上限温度为38℃、默认下限温度为5℃(通过程序可以更改上下限初始值)。报警值可设置范围:最低上限报警值等于当前下限报警值,最高下限报警值等于当前上限报警值。将下限报警值调为0时为关闭下限报警功能。
关键词:PID,单片机,水温
一、硬件方案
硬件构成:51单片机+最小系统+LCD1602液晶+按键+DS18B20温度传感器+加热棒+LED灯+继电器而成。
二、设计功能
1、本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)单片机。
2、采用LCD 1602液晶显示当前温度值(带单位),以及温度阈值。
3、采用DS18B20温度传感器测温,防水型传感器的。
4、按键可以设置温度阈值,当温度低于设定的阈值时,相应的指示灯亮,同时相应的继电器吸合,继电器可以驱动负载加热棒加热。当温度高于设定的阈值时,相应的指示灯灭,同时相应的继电器断开,加热棒不加热。
5、两个按键:加键和减键。可设置温度阈值。
三、实物图
四、原理图
五、PCB图
六、Proteus仿真
七、程序
部分代码
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error//比例
+ pp->Integral * pp->SumError //积分项
+ pp->Derivative * dError); // 微分项
}
/***********************************************************
温度比较处理子程序
***********************************************************/
void compare_temper(void)
{
unsigned char i;
if(set_temper>temper) //设置温度大于当前温度
{
ledred=0;
ledgreen=1;
if(set_temper-temper>1) //温度相差1度以上
{
high_time=100;
low_time=0;
}
else //设置温度不大于当前温度
{
for(i=0;i<10;i++)
{
get_temper();
rin = s; // Read Input
rout = PIDCalc ( &spid,rin ); // Perform PID Interation
}
if (high_time<=100) high_time=(unsigned char)(rout/800);
else high_time=100;
low_time= (100-high_time);
}
}
else if(set_temper<=temper) //设置温度不大于当前温度
{
ledred=1;
ledgreen=0;
if(temper-set_temper>0) //温度相差0度以上
{
high_time=0;
low_time=100;
}
else
{
for(i=0;i<10;i++)
{
get_temper();
rin = s; // Read Input
rout = PIDCalc ( &spid,rin ); // Perform PID Interation
}
if (high_time<100) high_time=(unsigned char)(rout/10000);
else high_time=0;
low_time= (100-high_time);
}
}
}
/*****************************************************
T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期
******************************************************/
void serve_T0() interrupt 1 using 1
{
if(++count<=(high_time)) output=0;
else if(count<=100)
{
output=1;
}
else count=0;
TH0=0x2f;
TL0=0x40;
}
/***********主函数**********/
void main(void)
{
unsigned char i;
init();//LCD初始化
TMOD=0x01;
TH0=0x2f;
TL0=0x40;
EA=1;
ET0=1;
TR0=1;
high_time=50;
low_time=50;
PIDInit ( &spid ); // Initialize Structure
spid.Proportion= 10; // Set PID Coefficients
spid.Integral = 8;
spid.Derivative =6;
spid.SetPoint =100; // Set PID Setpoint
set[0]=set_temper/10;
set[1]=set_temper%10;
wr_com(0x80+0x40+9); //显示设置温度
wr_data(table[set[0]]);
delay(1);
wr_com(0x80+0x40+10);
wr_data(table[set[1]]);
delay(1);
wr_com(0x80+0x40+14); //显示温度符号
wr_data(0xdf);
delay(1);
while(1)
{
keyscan(); //按键扫描
for(i=0;i<10;i++) //循环10次
{
dis_temp(get_temper()); //显示温度值
if((key0==0)||(key1==0)) break; //如果有按键退出显示循环
}
if((key0!=0)&&(key1!=0)) compare_temper(); //比较温度
}
}
八、资料包括
需要完整的资料可以点击下面的名片,找我要资源压缩包的百度网盘下载地址及提取码。