基于单片机的温度控制系统.docx
- 文档编号:27429908
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:20
- 大小:269KB
基于单片机的温度控制系统.docx
《基于单片机的温度控制系统.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度控制系统.docx(20页珍藏版)》请在冰豆网上搜索。
基于单片机的温度控制系统
基于单片机的温度控制系统设计
摘要
本设计是以单片机AT89C52为控制核心,开发了一种全数字式操作器。
该控制器操作简便,控制精度高,采用LCD液晶显示,具有RS-485通信接口,并可应用于各种温度控制系统系统中。
有效地提高了温度控制系统的可靠性、合理性及其稳定性。
本系统包括硬件和软件两个部分,硬件设计中包括六个部分,分别为主控部分、RS485通讯电路、LCD显示、看门狗和电源部分以及传感器采集放大电路。
设计时,考虑到系统的可靠性及其性价比,在未扩展外部存储的情况下,只采用了一片AT89C51完成了整个系统的所有功能。
软件部分则以C语言为编程语言,编写相应的软件程序,使本操作器在温度控制中作为控制单元具有液晶显示、按键操作、温度指示、RS-485总线结构等功能。
能够方便实现对温度参数的设定和控制。
关键词:
控制系统,温度测量,单片机,RS-485,C语言。
TheDesignofTemperatureControlSystemBasedonMCU
ABSTRACT
ThisdesignwithMicrocontrollerthemachineAT89C51forcontrolcore,hasdevelopedakindoftotalcharacterstylemanipulator.Thismanipulatoroperationissimple,hasthehighercontrolprecision,usestheLCDliquidcrystaldisplay,includesRS-485munication,andmayapplytoinkindsoftemperaturesystem.Effectivelyenhancedthetransmissioncontrolsystemreliability,therationalityandit’sthestability.Thissystemisconsistedoftwoparts,boththehardwareandthesoftware.Thehardwaredesignincludessixparts,controller,RS485munication,theLCDdemonstration,watchdogandpowerandamplify(电路).Consideredwhensystemreliabilityandnaturalpriceparedto,design,inhasnotexpandedexteriormemoryinthesituation,onlyusedpieceofAT89C51topleteoverallsystemallfunctions.ThenewmanipulatorhasLCDdisplay,keyscanoperation,automaticparametermemorization,RS-485busandetc.Atthepartofsoftware,theClanguagehasalsobeenpresentedandmakespletelyprogrammer.Itcancarryouttocontrolthetemperatureofsystemandsetparameter.
Keywords:
microcontroller,temperature,AT89C51,Clanguage,RS-485.
引言
现今,随着计算机的广泛应用,单片机的应用正在不断地走向深入。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及具体应用对象特点的软件结合,以作完善。
在温度控制系统中,温度作为被控量,是表征物体冷热程度的物理量,温度测量则是工农业生产过程中一个很重要而普遍的参数。
温度的测量及控制对保证产品质量、提高生产效率、节约能源、生产安全、促进国民经济的发展起到非常重要的作用。
由于温度测量的普遍性,温度传感器的数量在各种传感器中居首位。
而且随着科学技术和生产的不断发展,温度传感器的种类还是在不断增加丰富来满足生产生活中的需要。
在单片机温度测量系统中,关键是对温度的测量、保持和控制。
温度是工业对象中主要的被控参数之一。
在单片机温度控制系统中,通过传感器将外界模拟信号进行采集,并通过运放电路进行放大,然后经A/D转换器将模拟量转化为数字量送到单片机然后通过汇编语言或C语言编程进行软件设计,进而控制执行器达到控制温度的目的。
在控制系统中,单片机是核心器件,外加按键对系统参数设置,LCD液晶显示用于显示控制系统参数。
还有单片机的外围电路,包括看门狗和RS485通讯,用于计算机和单片机之间信息传输。
温度控制在单片机基础上的技术已经完善,在工业领域以及医疗等方面具有广泛的应用。
传感器技术和单片机技术等不断发展,为智能温度测控系统精度的提高和稳定性改善等提供了条件。
本次的课程设计是一种基于单片机的温度闭环控制装置,通过硬件、软件以及对机内数字PID参数的设置,可以对不同受控对象的不同温度进行高精度控制。
一、系统参数要求:
1.1温度参数:
要求温度控制为(学号+50)℃,在本方案中标准温度为66℃;
1.2外设口地址:
以(学号+30)H为起始地址,本方案中以66H为起始地址,同时每增加一个外设,口地址+1。
二、系统方案设计:
2.1方案一:
基于A/D转换的温度控制系统设计方案:
2.1.1控制系统连接图:
2.1.2控制系统硬件结构图:
2.2方案二:
基于DS18B20的温度控制系统设计方案:
2.1.1控制系统连接图:
2.1.2控制系统硬件结构图:
2.3控制系统硬件电路图
三、控制算法:
3.1Bang-Bang算法:
Bang-Bang算法又称为时间最优控制。
在本设计中Bang-Bang算法是指通过控制晶闸管关断的占空比为100%,即就是通过全功率加热来用最短的时间使水的温度升高到接近所需标准值,一般为低于标准值15℃左右。
Bang-Bang算法的优点除了可以节约控制时间,提高控制系统的效率,同时也可以使控制系统的性能指标更加良好。
3.2纯比例算法:
在经过Bang-Bang算法使水温快速升高到50℃左右后,就不能再继续用Bang-Bang算法了,这是为了防止因温度过快超过标准温度,要想实现温度恒定所需要的各种时间就会增多,同时也浪费能源,提高成本。
为了能够更好的控制温度的变化,我们在48℃~53℃这个温度X围内采取纯比例算法,即直接将实际温度和标准温度的差值比例放大后来改变晶闸管的占空比,占空比的大小依据加热装置和外界环境条件而定,需要实际测取数据来进行计算,最后通过改变加热装置的平均加热功率来控制温度升高的速率。
3.3PID算法:
在温度在53℃~63℃X围内时,我们应采用PID算法。
PID算法为比例,积分,微分同时作用,原因是因为适应性强,鲁棒性强,抗干扰能力强。
具体来说,比例的作用是为了快速响应,积分的作用是为了减少稳态误差,微分的作用是为了克服被控对象的滞后,消除高频干扰。
本次设计PID控制为增量式PID控制公式:
Datau(k)=Kc*[e(k)-e(k-1)]+Ki*e(k)+Kd*[e(k)-2*e(k-1)+e(k-2)],其中e(k),e(k-1),e(k-2)分别为偏差,Datau(k)为控制电压。
PID参数的确定,需要根据实际系统不同的元素来决定,具体方法是先整定P参数,实现快速响应,并且稳态误差不是过大,基本满足4:
1比例;然后是整定I参数,在保证快速响应的同时使稳态误差尽可能小;最后是D参数,消弱滞后带来的影响,实现即时响应。
综合微调各参数使温度变化实现“稳”“准”“快”。
四、软件设计:
软件是整个控制系统的核心,也是决定系统最终能否实现预期指标的重要环节。
控制系统由单片机为主,外加一些必要的外围设备。
所以软件设计也分单片机延时、键盘扫描、液晶显示、温度控制、传感器等部分子程序构成。
4.1单片机延时子程序
*延时程序*
#ifndefDelay
#defineDelay
#defineuintunsignedint
#defineucharunsignedchar
voiddelayl(uintn)//长延时n毫秒
{
uinti,j;
for(i=n;i>0;i--)
for(j=114;j>0;j--);
}
voiddelays(uchari)//短延时
{
while(i--);
}
#endif
4.2键盘扫描
*键盘扫描程序*
#ifndefKeyScan
#defineKeyScan
#include
#include"Delay.h"
intSetValue;//定义温度设定值
intkeyscan()
{
uchartemp;//定义按键
P1=0xff;
temp=P1;
if(P1!
=0xff)//判断键是否被按下
{
delayl(10);//延时,已达到消抖的目的
P1=0xff;
temp=P1;
if(temp!
=0xff)//再次判断,确定键被按下
{
temp=P1&0xff;
switch(temp)//按键处理
{
case0xf7:
SetValue+=1;break;//+0.1度
case0xef:
SetValue-=1;break;//-0.1度
case0xfe:
SetValue+=100;break;//+1度
case0xfd:
SetValue+=10;break;//-1度
case0xfb:
SetValue-=10;break;//+10度
case0xdf:
SetValue-=100;break;//-10度
default:
;break;
}
}
}
returnSetValue;
}
#endif
4.3液晶显示
LCD1602驱动程序
#ifndefLCD1602
#defineLCD1602
#include"Delay.h"
/*********端口定义*****************/
sbitledrs=P2^5;//读写控制字,数据/命令,H/L
sbitleden=P2^3;//使能端控制字,高有效
sbitledrw=P2^4;//读/写,H/L,1=读,0=写,
ucharbuffer[3];
voidwrite_(uchar)
{
ledrw=0;
ledrs=0;
P0=;
delays(200);
leden=1;
delays(200);
leden=0;
}
voidwrite_data(uchardate)
{
ledrw=0;
ledrs=1;
P0=date;//准备数据
delays(200);
leden=1;//激活LCD(Enabled)
delays(200);
leden=0;
}
voidLCD_init()//初始化LCD
{
leden=0;
write_(0x38);
write_(0x0c);
write_(0x06);
write_(0x01);
}
voidsetPosition(ucharx,uchary)
{
ucharpos;
switch(x%2)
{
case1:
pos=0x80+y;break;//第一行
case0:
pos=0xc0+y;break;//第二行
}
write_(pos);//写入定位命令
}
voidprintc(uchara)//写入一个字符
{
write_data(a);
}
voidprints(uchar*str)//写入字符串
{
uchari=0;
while(str[i]!
='\0')
{
write_data(str[i++]);//写一个字符,指向下一个
}
}
voidIntToStr(uintt,uchar*str,ucharn)
{
uchara[5];chari,j;//取得整数值到数组
a[0]=t/100;//百位
a[1]=(t/10)%10;//十位
a[2]=t%10;//个位
for(i=0;i<3;i++)//转成ASCII码+32
{
a[i]=a[i]+'0';
}
for(i=0;a[i]=='0'&&i<=3;i++);
for(j=3-n;j
{
*str='';str++;
}
for(;i<3;i++)
{
*str=a[i];str++;
}//加入有效的数字
*str='\0';
}
#endif
4.4温度控制
/*********************************************************************************
*标题;基于单片机的温度控制实验*
**
*描述:
1.用温度传感器DS18B20测得温度值;*
*2.用LCD1602液晶显示器作为人机界面,其可以显示当前温度值,设定温度值等;*
*3.使用PID控制算法,控制水温,从而达到恒温。
*
**
*目的:
1.学会DS18B20的驱动;*
*2.学会LCD1602的驱动;*
*3.理解PID控制原理;*
*********************************************************************************/
#include
#include
#include"Delay.h"//包含用户头文件delay.h,作用:
延时
#include"LCD1602.h"//包含用户头文件LCD_1602.h,作用:
驱动1602液晶显示器显示
#include"DS18B20.h"//包含用户头文件ds18b20.h,作用:
驱动温度传感器测量当前温度
#include"KeyScan.h"//包含用户头文件Keyscan.h,作用:
键盘扫描,获取按键值
#defineucharunsignedchar//用uchar代替unsignedchar
#defineuintunsignedint//用uint代替unsignedint
sbitkaitong=P3^3;//定义电热杯开通关断引脚
intPrevError=0;//定义上上一次偏差值
intLastError=0;//定义上一次偏差值
intError=0;//定义当前偏差值
intPError,IError,DError;//中间变量
intLastValue;//上一次的输出值
intNowValue;//本次的输出值
intFull,Part;//加热占空比调节参数
intSetValue=600;//初始化温度值60度
floatProportion=0.5;//定义比例参数
floatIntegral=0.1;//定义积分参数
floatDerivative=5;//定义微分参数
/**************************************************************************************
*名称:
增量式PID计算函数*
**
*描述:
增量式PID表达式如下*
*datau(k)=Kc*[e(k)-e(k-1)]+Ki*e(k)+Kd*[e(k)-2*e(k-1)+e(k-2)]*
*或datau(k)=Kc*{e(t)-e(k-1)}+Kc*T*e(k)/Ti+Kd*Td*[e(t)-2*e(t-1)+e(t-2)]/T**
**
*说明:
e(t)为设定值与实际值之差,*
*Kc为比例系数*
*Ki=Kc*T/Ti积分系数*
*Kd=Kc*Td/T微分系数*
*T为采样周期*
*Ti为积分时间*
*Td为微分时间*
**************************************************************************************/
intPIDCalc(intNextValue)//增量式PID计算部分
{
PrevError=LastError;//将上一次偏差LastError赋给上上一次偏差PrevError
LastError=Error;//将当前偏差Error赋给上一次偏差LastError
Error=keyscan()-NextValue;//将新的偏差赋给当前偏差Error偏差是绝对值,有错
LastValue=NowValue;//将本次输出值赋给上一次输出值
if(Error>=100)
{
return(20);
}
elseif((Error<100)&&(Error>=50))
{
return(14);
}
elseif((Error<50)&&(Error>=20))
{
return(10);
}
elseif((Error<20)&&(Error>0))
{
PError=Proportion*(Error-LastError);
IError=Integral*Error;
DError=Derivative*(Error-2*LastError+PrevError);
NowValue=PError+IError+DError+LastValue;
returnNowValue;//计算PID控制值
}
else
{
PError=Proportion*(Error-LastError);
IError=Integral*Error;
DError=Derivative*(Error-2*LastError+PrevError);
NowValue=PError+IError+DError+LastValue;
return0;
}
}
/****************************************************************
**
*主函数*
**
****************************************************************/
voidmain()
{
uintccc=100;
LCD_init();//初始化LCD
setPosition(1,2);//从第1行第2个字符位开始显示“Welto”
prints("Welto");
setPosition(2,5);//从第1行第2个字符位开始显示“SUST”
prints("SUST");
delayl(1000);//延时,使欢迎界面在屏幕上停留片刻
write_(0x01);//初始化LCD
while
(1)
{
if(ccc==0)
{
Part=PIDCalc(readtemp());
ccc=100;
}
for(;ccc>0;ccc--)
{
Full++;//加1,相当于dd=dd+1
if(Full>20)//如果dd大于20,则复位为1
{
Full=1;
}
if(Full<=Part)//判断PID计算值,如果Full小于等于该值,则开通发热管;否则关断
kaitong=0;
else
kaitong=1;
/*从第2行第2字符位开始显示设定温度值*/
setPosition(1,0);
IntToStr(keyscan(),buffer,3);//处理温度值,以便显示
prints("S:
");//显示"SET:
"
printc(buffer[0]);//显示十位
printc(buffer[1]);//显示个位
printc('.');//显示小数点
printc(buffer[2]);//显示十分位
printc(0xDF);//显示摄氏度符号右上角的小圆圈
printc('C');//显示摄氏度符号“C”
/*从第1行第2字符位开始显示当前温度值*/
setPosition(1,8);
IntToStr(readtemp(),buffer,3);//处理温度值,以便显示
prints("P:
");//显示"CUR:
"
printc(buff
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 温度 控制系统