电子设计大赛水温控制系统报告.docx
《电子设计大赛水温控制系统报告.docx》由会员分享,可在线阅读,更多相关《电子设计大赛水温控制系统报告.docx(19页珍藏版)》请在冰豆网上搜索。
电子设计大赛水温控制系统报告
天津大学
2013“信芯杯”电子设计大赛实验报告
题目:
水温控制系统
实验地点:
时间:
1.单片机供电模块选择方案:
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈5
附录:
使用说明┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈21
摘要
随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。
本设计论述了一种以STC89C52单片机为主控制单元,以DS18B20为温度传感器的温度自动控制系统。
该控制系统可以根据设定的温度,通过单片机控制继电器开启和关闭,从而控制水泥电阻的加热和停止。
硬件电路主要包括STC89C52单片机最小系统、稳压电路、DS18b20测温电路、键盘电路、锁存器SN74HC573、MT05011AR数码管显示电路、继电器电路,加热模块电路等。
系统程序模块主要包括主程序控制模块,温度处理子程序模块、按键处理程序模块、锁存器控制模块、数码管显示模块。
[关键词]STC89C52单片机;DS18B20;MT05011AR;SN74HC573;稳压电源供电模块。
设计任务与要求
一、任务
设计并制作一个水温自动控制系统,控制对象为500ml净水,容器为搪瓷器皿。
水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。
二、要求
1.基本要求
(1)温度设定范围为50~70℃,最小区分度为1℃,标定温度≤1℃。
(2)环境温度降低时(例如用电风扇降温)温度控制的静态误差≤3℃。
(3)用十进制数码管显示水的实际温度。
2.发挥部分
(1)采用适当的控制方法,当设定温度突变(由50℃提高到60℃)时,减小系统的调节时间和超调量。
(2)温度控制的静态误差≤1℃。
(3)在设定温度发生突变(由50℃提高到60℃)时,自动打印水温随时间变化的曲线。
方案论证
1.单片机供电模块的方案选择:
方案一:
直接用GP品牌的9v电池,然后接通过三端稳压芯片7805稳压成5伏直流电源提供给单片机系统使用,右边接两个5伏电源的滤波电容,并且接上电阻和绿色的LED组成5伏电源的工作指示电路。
方案二:
通过变压器,将220v的市电转换成5v左右的直流电。
由于需要给继电器提供稳定的5V电压,而方案一中导致电池的过度损耗,无法稳定带动继电器持续工作,所以我们选用能够提供更加稳定5v电源的方案二。
2.温度检测电路的方案选择:
方案一:
用普通半导体温度传感器作为敏感元件,再结合电压放大器和AD转换器将感应到的温度数值转换为数字量存储在某一单元内。
但由于该方案所需元件较多,且电路较繁,调试起来较复杂,所以舍之不用。
方案二:
使用数字温度传感器DS18B20检测温度,内含AD转换器,因此线路连接十分简单,它无需其他外加电路,直接输出数字量,可直接与单片机通信,读取测温数据,电路十分简单,它能够达到0.5℃的固有分辨率,使用读取温度暂存寄存器的方法还能达到0.0625℃以上精度,应用方便。
这样的电路主要工作量就集中到了单片机软件编程上,故我们选用该方案。
3.显示电路的方案选择:
方案:
使用数码管显示,通过数码管显示被测温度和设定温度。
该方案程序简单,数码管为并联状态,方便测试。
4加热方案的选择:
方案一:
使用电热炉进行加热,控制电炉的功率即可控制加热速度,当水温过高时,关掉电炉即可,但考虑到电炉成本较高,且精度不好控制,故不选用。
方案二:
固态继电器控制加热器工作,固态继电器使用非常简单,而且没有触点,无需外加光耦,自身就可以实现电气隔离,还可以频繁动作。
通过控制固态继电器的开,断时间比来达到控制加热器功率的目的,适合功率不大,简易水温控制系统,我们选择用几个水泥电阻作为加热器,简单实用。
故我们使用方案二。
5控制方法选择方案:
方案一:
采用普通的控制方法,即随着水温的变化调节温度,但局限性太小,由于水温变化快,且惯性大,不易控制精度,故采用普通控制方法显得力不从心。
方案二:
通过继电器控制加热电路的通断,继电器由单片机控制,当温度高于设定温度时单片机控制继电器断开,停止加热,自动通断,所以我们选择方案二。
硬件电路设计
对题目进行深入的分析和思考,可以将整个系统分为以下几个部分:
单片机最小系统,测温电路,功率电路,继电器控制指示电路,显示电路,系统框图如下:
给单片机提供5v稳定电压
一.测温电路
测温电路是使用DS18b20数字式温度传感器,它无需其他的外加电路,直接输出数字量,可直接与单片机通信,读取测温数据,电路十分简单。
它能够达到0.5
的固有分辨率,使用读取温度的暂存寄存器的方法还能达到0.0625
以上的精度。
DS18B20温度传感器只有三根外引线:
单线数据传输总线端口DQ,外供电源线VDD,共用地线GND。
外部供电方式(VDD接+5V,且数据传输总线接10k的上拉电阻,其接口电路如图2.1所示。
图2.1温度传感器接口
二.功率电路
本系统要控制水泥电阻加热,固态继电器控制加热器工作,固态继电器使用非常简单,而且没有触点,无需外加光耦,自身就可以实现电气隔离,还可以频繁动作。
通过控制固态继电器的开、断时间比来达到控制加热器功率的目的,适合功率不大,简易水温控制系统。
三.控制.键盘.显示电路
这部分实际上是一个单片机最小系统的基本电路,选用STC89C52,足够满足系统的要求。
键盘用三个按键即可,通过按键分别实现所设定温度的复位、加减操作。
在显示方面选用数码管显示模块。
单片机的输出控制锁存器,锁存器一个控制数码管的选通,另一个控制数码管的显示.
四.部分整体硬件电路:
软件程序设计
一.程序流程
单片机控制程序如下:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitds=P2^2;//温度传感器信号线
sbitdula=P2^6;//数码管段选线
sbitwela=P2^7;//数码管位选线
sbitbeep=P2^3;//蜂鸣器
sbitjidianqia=P1^0;
uintyuzhi=0;
uinttemp;
floatf_temp;
uintwarn_l1;
uintwarn_l2;
uintwarn_h1;
uintwarn_h2;
uintwarn_h3;
sbitkey1=P3^4;
sbitkey2=P3^5;
sbitkey3=P3^6;
sbitkey4=P3^7;
unsignedcharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0xbf,0x86,
0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef};//不带小数点的编码
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddsreset(void)//18B20复位,初始化函数
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bittempreadbit(void)//读1位函数
{
uinti;
bitdat;
ds=0;i++;//i++起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchartempread(void)//读1个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
voidtempwritebyte(uchardat)//向18B20写一个字节数据
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;//写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidtempchange(void)//DS18B20开始获取温度并转换
{
dsreset();
delay
(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令
}
uintget_temp()//读取寄存器中存储的温度数据
{
uchara,b;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();//读低8位
b=tempread();//读高8位
temp=b;
temp<<=8;//两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625;//温度在寄存器中为12位分辨率位0.0625°
temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
returntemp;//temp是整型
}
uintkeyscan()
{
if(key1==0)
{
delay(3);
if(key1==0)
{
yuzhi=60;
while(!
key1);//等待按键释放
}
}
if(key2==0)
{
delay(3);
if(key2==0)
{
yuzhi++;
while(!
key2);
}
}
if(key3==0)
{
delay(3);
if(key3==0)
{
yuzhi--;
while(!
key3);
}
}
returnyuzhi;
}
////////////////////显示程序//////////////////////////
voiddisplay(ucharnum,uchardat)
{
uchari;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));
P0=i;
wela=1;
wela=0;
delay
(1);
}
voiddis_temp(uintt)
{
uchari;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
voidxianshi(uintyuzhi)
{
uchari;
i=yuzhi/10;
display(4,i);
i=yuzhi%10;
display(5,i);
}
//////////////////////////////////////////////
voidwarn(uints,ucharled)//蜂鸣器报警声音,s控制音调
{
uchari;i=s;
dula=0;
wela=0;
beep=1;
while(i--)
{
dis_temp(get_temp()+13);
}
beep=1;
i=s;
while(i--)
{
dis_temp(get_temp()+13);
}
}
voiddeal(uintt)
{
uchari;
uintwarn_l2=(yuzhi*10-7);
uintwarn_h1=(yuzhi*10+13);
uintwarn_h2=(yuzhi*10+3);
uintwarn_h3=(yuzhi*10-27);
uintwarn_h4=(yuzhi*10+23);
if(t<=60)
{
if((t>warn_l2)&&(t<=warn_h1))
{
P1=0XFE;
}
elseif((t>warn_h2)&&(t<=warn_l2))
{
P1=0XFC;
}
elseif((t>warn_h3)&&(t<=warn_h2))
{
P1=0xF8;
}
elseif(t<=warn_h3)
{
P1=0xf0;
}
elseif(t>warn_h4)
{
beep=0;
}
else
{
P1=0XFF;
beep=1;
i=40;
while(i--)
{
dis_temp(get_temp()+13);
}
}
}
if(t>61)
{
if((t>warn_l2)&&(t<=warn_h1))
{
P1=0XFE;
}
elseif((t>warn_h2)&&(t<=warn_l2))
{
P1=0XF0;
}
elseif((t>warn_h3)&&(t<=warn_h2))
{
P1=0xF0;
}
elseif(t<=warn_h3)
{
P1=0xf0;
}
elseif(t>warn_h4)
{
beep=0;
}
else
{
P1=0XFF;
beep=1;
i=40;
while(i--)
{
dis_temp(get_temp()+13);
}
}
}
}
voidinit_com(void)
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFd;
TL1=0xFd;
TR1=1;
}
voidcomm(char*parr)
{
do
{
SBUF=*parr++;//发送数据
while(!
TI);//等待发送完成标志为1
TI=0;//标志清零
}while(*parr);//保持循环直到字符为'\0'
}
voidmain()
{
ucharbuff[4],i;
dula=0;
wela=0;
init_com();
while
(1)
{
keyscan();
tempchange();
for(i=10;i>0;i--)
{
dis_temp(get_temp()+13);
xianshi(yuzhi);
}
deal(temp);
sprintf(buff,"%f",f_temp);
for(i=10;i>0;i--)
{
dis_temp(get_temp()+13);
xianshi(yuzhi);
}
comm(buff);
for(i=10;i>0;i--)
{
dis_temp(get_temp()+13);
xianshi(yuzhi);
}
}
}
二.控制方法
在控制温度方面,我们经过反复的调试与修改源程序,不断改变水泥电阻的加热及断电时间比,使整个系统不断趋于题设要求。
测试结果及结果分析
一、静态温度测量
测量方式:
断开系统的加热装置,装入一定温度的水,保持环境温度和其他测量条件不变,利用标准的温度计测量水温,与系统给出的温度相比较。
由于在这种条件下,与测温速度相比,水温下降较慢,在测量中可认为是一个静态过程,因此可以测出系统的静态温度测量结果。
测量仪器:
DM6801热电偶式数字温度计。
测量结果:
如表4.1所示。
表4.1测量结果数据
标定温度/℃
57.1
58.7
60.1
61.9
63.4
65
测量温度/℃
57.3
59.4
60.5
62.4
63.9
65.4
误差/℃
0.2
0.7
0.4
0.5
0.5
0.4
二动态温控测量
测量方式:
接上系统的加热装置,装入500mL室温的水,设定控温温度。
记录调节时间、超调温度、稳态温度波动幅度等。
测量仪器:
DM6801热电偶式数字温度计。
测量条件:
环境温度24.2℃。
测量结果:
如表4.2所示。
在此仅以数值的方式给出测量结果,略去升温曲线图。
调节时间按温度进入设定温度±0.5℃范围时计算。
表4.2测量结果数据
设定温度/℃
60
65
70
静态误差/℃
0.3
0.4
0.6
三.温度从50℃到70℃的测试:
测试数据如下:
超调量
调节时间
稳态误差
0.5℃
10min
0.45
数码管显示温度与实测温度折线图:
四.结果分析
由以上测量可见,系统性能基本上可达到所要求的指标。
附录:
使用手册
接通电源后,加热装置默认为开启状态。
打开单片机电源开关,指示灯亮。
此时单片机上的数码管开始显示当时温度。
设定温度默认为60度。
单片机上一共有四个按键,从左到右分别为复位键、温度初始化键、温度控制温度+1键,温度控制温度-1键。
使用时只需调整到自己想要的温度即可。
当实际温度小于设定温度是,正常加热。
当实际温度接近设定温度是,通过继电器自身档位调节,可实现达到并维持设定温度的要求。
当实际温度大于设定温度是,蜂鸣器警报响起。
本加热装置可在误差允许范围内精确调节并维持水温。
需特别注意的是,由于装置采用220V电源加热,且实验中加热装置所达到的温度较高。
接通电源后,切忌触摸装置任何部位,谨防触电。
同时应避免水洒溅导致电路烧毁。
温馨提示,小心烫伤。