热水器压力和温度控制器(共21页).doc
精选优质文档-倾情为你奉上辽 宁 工 业 大 学智能仪表课程设计(论文) 题目:热水器压力和温度控制器院(系): 电气工程学院 专业班级: 学 号: 学生姓名: 指导教师: 起止时间:2011.12.26-2012.1.6专心-专注-专业摘要本论文主要讲述了以AT89S52为主的热水器温度和压力控制系统。本次设计中应用了以单片机为主,PT100和HM10位传感器的简约型热水器温度和压力控制系统。主控制器中的单片机芯片采用的是AT89S52。温度传感器PT100将探测到的水温的数据信号传到单片机中,经过单片机来判断温度是否达到我们所需要的预先设定的温度。本设计的温度控制系统中选用了精度较高的PT100作为温度传感器,相对于普遍的DS18B20,PT100的精度更高一些,压力传感器部分采用了德国HELM公司生产的高精度压阻式压力传感器,具有兼容性好,稳定性高的特点。显示部分采用比较便捷简便的CH451,省去了显示部分的复杂连接电路。关键词:热水器、温度控制、压力控制 目录 第1章 绪论几年来,市场上陆续出现了一些热水器控制器,但大多数控制器存在着诸如性能不稳定,容易产生误操作;温度、压力检测、控制误差大;显示器有时出现乱码;与电辅助加热装置不能很好配合等弊端。从而必然会催生性能比较稳定、功能强大、智能型的热水器控制器。在现代社会中,热水器控制电路的原理不仅应用于生活方面,其运用也涉及到了生产各个方面。随着人们生活质量的提高,酒店厂房及家庭生活中都会见到热水器控制电路的影子,其将更好的服务于社会。随着电子技术的发展,特别是随着大规模集成电路的产生,给人们的生活带来了根本性的变化,如果说微型计算机的出现使现代的科学研究得到了质的飞跃,那么单片机技术的出现则是给现代工业控制测控领域带来了一次新的革命。用单片机来设计电热水器控制器具有新颖、价廉、安全、实用等优点,并且在国产电热水器上获得了成功应用。本设计的一些方法也适用于冰箱、空调等家用电器的电脑控制设计中。目前,单片机在工业控制系统诸多领域得到了极为广泛的应用。该热水器控制器电路的设计主要由单片机、液晶显示器、PT100等配件构成;操作简便,运行成本低,同时免除了令用户不满控温精度低、可靠性差、功能单一等局面。第2章 课程设计方案2.1系统的主要任务和主要功能该热水器控制器电路主要实现对水温和压力的检测和控制,并满足不同用户的个性需求。其有以下功能:(1)水温的测量和显示;(2)压力的测量与显示及报警;(3)用户设定功能(如水温设定,水量设定,加热定时,进出水定时等);(4)对电加热管的控制功能;(5)一些功能键(如自动进、出水,压力设置,水温设置,把所设定值清零等);2.2 系统工作的基本原理热水器控制电路有单片机、键盘、液晶显示器、水温传感器(PT100)、压力传感器(HM10)等硬件组成,然后和软件结合起来实现热水器控制电路的功能。该设计的主要原理是:主控制器中的单片机芯片采用的是AT89S52。温度传感器PT100将探测到的水温的数据信号传到单片机中,经过单片机来判断温度是否达到我们所需要的预先设定的温度。如果没有达到,单片机就会发出一个指令启动热得快对水进行加热。如果水温达到我们预先设定的温度值,单片机通过温度传感器PT100接收到的数据信号进行判断,就会使热得快停止加热。如果温度高于我们预先设定的温度值,单片机也会通过温度传感器PT100 接受到的数据信号进行判断,使热得快不加热,等水温慢慢的冷却下来到达我们预先设定的温度值。如果温度要稍许的低于(高于)我们预先设定的温度值,单片机会马上给控制热得快电路一个指令,启动(停止)加热电路,从而实现了温度的控制。当然控制水温主要用到了PID算法,这样实现了精确的控制水的温度。控制压力主要通过压力传感器来实现。当压力达到预先设定的值时,探针就会通过压力传感器HM10把信号传到单片机,通过单片机的处理判断来给压力控制电路指令,从而判断是否开启报警电路。 2.3 总体设计方案与比较2.3.1方案论证方案一: 此方案采用单片机程序控制进行设计。包括键盘、数码显示、开关控制电路、加热装置、进水出水装置等部分,起原理如图2所示。采用AD590温度传感器和压力传感器分别对温度信号采集和水位信号采集,将他们转换为电流或电压信号,通过信号放大后再进行A/D转换,并通过LED数码显示管显示,将采集的数据与单片机预置温度(水位)或键盘键入的所需温度(水位)进行比较,用单片机对温度和水位进行的控制。图1 方案一原理图方案二:此方案在方案一的基础上做了很大的改进。用数字型温度传感器PT100和压力传感器进行温度和水位的采集的信号直接送入单片机中,再由单片机程序来进行控制。另外该方案还包括键盘、液晶显示电路、自动控制进水和出水的装置以及加热装置等。温度直接通过PT100完成温度数据采集,然后进行AD转换。压力由HM10把信号传递给单片机,由液晶显示器把水温和水位显示出来,并且还将采集到的数据与键盘键入的所设定的温度和压力进行比较,再由单片机对加热装置和报警装置进行控制。其原理如图2所示。2.3.2 方案比较与选择方案一:采用AD590温度传感器进行温度采集同样有方案一中的问题,即信号采集、放大与传输过程中的失真不可避免,数码管不能同时显示水温和水位,因而也不予采用。方案二:选用的数字型温度传感器(PT100)能较好的避免前述缺点,另外还设有输入设备键盘以及显示设备液晶显示器。这样既可以同时显示当前水温,当前水位,设定水温,设定水位于一个界面液晶显示屏上,从而可以更加直观明了,使人机对话更加容易,同时也方便了用户的操作和控制。经比较后最终选择方案二。温度传感器LED显示CH451单片机压力传感器键位选择报警开关晶振电路温度控制复位电路图2 方案二原理框图2.4元器件选择AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器,所以,本次设计采用AT89S52.pt100是铂热电阻,它的阻值跟温度的变化成正比。PT100的阻值与温度变化关系为:当PT100温度为0时它的阻值为100欧姆,在100时它的阻值约为138.5欧姆。它的工业原理:当PT100在0摄氏度的时候他的阻值为100欧姆,它的阻值会随着温度上升而成匀速增长的。工作于-4085(主机范围,不是外接的传感器范围)工业级PT100热电阻采集模块,按显示方式分有不带LCD显示的WD系列(WD-PT100、WD-PT1000)和带LCD显示的LM系列(LM-PT100、PT1000)两类。采集温度范围为200200,显示精度0.1。HM10高精度压阻式压力传感器,是采用德国HeLM公司先进的硅压阻力敏元件封装在不锈钢壳体内组装调试而成,外壳和接口材料均为不锈钢,介质兼容性好,性能稳定可靠,精度高,密封垫端面密封。 所以,本次设计中,主机芯片采用AT89S52,温度传感器采用PT100,压力传感器采用HM10。第3章 硬件电路设计3.1 系统硬件设计本系统的硬件以单片机AT89S52为控制核心,液晶显示电路,PT100水温检测电路,温度压力间接控制电路等。3.2 AT89S52单片机引脚图图3.1 AT89S51单片机引脚图主机的复位方式采用按键复位,根据用户的意愿或想法可以随时复位,以防止热水器产生误差,晶振电路采用12MHZ的晶振。3.2温度传感器电路(PT100)图3.2 PT100前置放大电路如采用电阻式传感器作为被测对象,传感元件的引出线有以下几种方式:二线制、三线制和四线制采用二线制接法(图1),虽然导线电阻会给测量带来影响,但在测量精度要求不高、测量仪器与被测传感元件距离较近时,常采用二线制但如果金属电阻本身的阻值很小,那末引线的电阻及其变化也就不能忽视,例如对于Pt100铂电阻,若导线电阻为1 ,将会产生2.5的测量误差为了消除或减少引线电阻的影响,通常的办法是采用三线联接法加以处理,如图2所示工业热电阻目前大多采用的都是三线制接法在三线制接线电路中,传感元件的一端与一根导线相接,另一端同时接两根导线传感元件在与电桥配合时,与传感元件相接的三根导线粗细要相同,长度要相等,阻值要一致(图中r1,r2,r3即为引线电阻)其中一根引线与测量仪表连接,由于测量仪表的内阻很大,可认为流过r2的电流接近于零另两根引线分别与电桥的两个相邻臂相连,这样引线电阻对测量就不会造成影响3.2 LED显示电路的硬件设计温度压力信号经过单片机处理之后,需要在显示电路中直观地显示出来。所以,需要选用合适的显示设备及显示电路,来实现对变压器内温度的实时显示。在本设计中,采用动态LED驱动方式来实时显示变压器内的温度。本次设计的现实电路采用CH451为显示芯片,CH451是一个整合了数码管显示驱动和键盘扫描控制以及uP监控的多功能外围芯片。CH451内置RC振荡电路,可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、位移等功能;同时还可以进行64键的键盘扫描;CH451通过可以级联的串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能。图3.3显示电路CH451可以动态驱动8个共阴数码管,所有数码管的相同段引脚(段A-段G以及小数点)并联后通过串接的限流电阻R1连接CH451的段驱动引脚SEG0-SEG7,各数码管的阴极分别由CH451的DIG0-DIG7引脚进行驱动。串接限流电阻R1的阻值越大则段驱动电流越小,数码管的显示亮度越低,R1的阻值一般在60欧姆到1000欧姆之间,在其他条件相同的情况下,应该优先选择较大的阻值。在数码管的面板布局上,建议数码管从左到右的顺序是N1靠左边,N8靠右边,一边匹配字左右移动命令和字左右循环移动命令。第4章 软件设计从温度传感器出来的电流信号,经过电流电压转换电路、A/D转换器、转换为单片机可以接收的信号之后,需要对单片机进行编程,实现对温度信号采集、计算和实时显示。本设计中,软件设计采用模块化结构。软件上,在单片机上实现多种功能,并保证控制精度,软件设计必须实现功能占CPU时间的分配上做到有主有次,既要保证完整性,又要保证实时性。温度控制器在软件上采用AT89S52开发,用模块化结构。本章给出软件设计的流程图。初始化用户键盘选择传感器扫描温度传感器压力传感器比设定值高比设定值高加热开始声光报警,开盖降压温度显示压力显示YYNN开盖降温第5章 设计总结本系统以AT89S52单片机为控制核心。用单片机做为控制器具有新颖、价廉、安全、实用等优点。本文的一些方法也适用于冰箱、空调等家用电器的电脑控制设计中。系统实现了键盘识别、液晶显示、温度水位读取以及水温水位的自动控制等多种功能。并且采用了PID算法,液晶显示器显示,高精度温度传感器,实现了环保节能的目的。用液晶显示器代替了发光二级管或数码管显示,使该控制器更加新颖、更加直观。便于用户的操作也达到了用户的特殊需求。本设计主要阐明用AT89S52单片机来控制温度和水位及其显示原理,当然在设计中还存在一些不足之处,像定时加热、定时进水、无极调节水位以及保温装置的设计等。参考文献1 孙涵芳等.单片机原理及应用M .北京:北京航空航天大学出版社,20072 徐爱钧.智能化测量控制仪表原理与设计(2)M.北京:北京航空航天大学出版社,20083 梅丽凤.单片机原理及接口技术.清华大学出版社,2006.54 周航慈等.智能仪器原理与设计.北京:北京航空航天大学出版社,2005.35 何立明.MCS-51系列单片机应用系统设计系统配置与接口技术M,北京:北京航空航天大学出版社,2009附 录总电路图附 录#include <absacc.h>#include <REG52.h>#include <stdio.h>#include <intrins.h>#define ulong unsigned long#define uint unsigned int#define uchar unsigned char#define para1 0x20;#define dat1 DBYTE0x30#define dat2 DBYTE0x31#define LCMDW XBYTE0xF0FF#define LCMCW XBYTE0xF1FF#define com DBYTE0x32#define O_Y DBYTE0x33#define O_X DBYTE0x34#define code_1 DBYTE0x35sbit ACC_0=ACC0;sbit ACC_1=ACC1;sbit ACC_3=ACC3;sbit csh=P32;sbit jsh=P31;sbit swen=P33;sbit DQ=P34;sbit L1=P23;sbit L2=P35;sbit L3=P22;sbit L4=P23;sbit s_a=P27;sbit s_b=P26;sbit s_c=P25;sbit s_d=P24;unsigned char w_s=1,s_s=1,buzzk=0,bflag=0;unsigned char t=0,tb=0,ts=0,tg=0,shs=13,shz=11,s_tb=0,s_ts=0,s_tg=0,s_sh=13,kk,mm=0,p=0;/*读取温度函数*/unsigned int read_temperature(void) unionunsigned char c2; unsigned int x; temp; ow_reset(); /总线复位 write_byte(0xCC); / 发Skip ROM命令 write_byte(0xBE); / 发读命令 temp.c1=read_byte(); /温度低8位 temp.c0=read_byte(); /温度高8位 ow_reset(); write_byte(0xCC); /Skip ROM write_byte(0x44); /发转换命令 temp.x<<=4; return (temp.c0); /return temp.x/2;void ST01(void) doACC=LCMCW; while(ACC_0=0&&ACC_1=0); void PR12(void) ST01();LCMCW=com;void PR11(void) ST01();LCMDW=dat2;PR12();void PR1(void) ST01();LCMDW=dat1;PR11();void ST3(void) doACC=LCMCW; while(ACC_3=0); void chushi_1(void) dat1=0x00; dat2=0x00;com=0x40;PR1();/*设文本显示区域首地址*/ dat1=para1;dat2=0x00;com=0x41;PR1();/* 设文本显示区域宽度 */ dat1=0x00;dat2=0x08;com=0x42;PR1(); /*设图形显示区域首地址*/ dat1=para1;dat2=0x00;com=0x43;PR1(); /*设图形显示区域宽度*/ com=0xa7;PR12(); /*光标形状设置*/ com=0x80;PR12(); /*显示方式设置逻辑"或"合成*/ com=0x9c;PR12(); /*显示开关设置 开文本和图形显示*/ /*清显示子程序*/void CLEAR(void) unsigned char i,j; dat1=0x00;dat2=0x00;com=0x24;PR1(); com=0xb0;PR12(); for(i=0;i<205;i+) /* 205 */ for(j=0;j<=40;j+) /* 40 */ ST3();LCMDW=0x00; com=0xb2;PR12(); /*PID计算*/float PIDCalc( PID *pp, int NextPoint ) int dError, Error; Error = pp->SetPoint*10 - NextPoint; / 偏差 pp->SumError += Error; / 积分 dError = pp->LastError - pp->PrevError; / 当前微分 pp->PrevError = pp->LastError; pp->LastError = Error; return (pp->Proportion * Error / 比例项 + pp->Integral * pp->SumError / 积分项 + pp->Derivative * dError / 微分项 );/*PID输出值的处理*/void active()if(fOut<=0) jwen=1; /温度高于设定值,关闭热得快 else if(fOut>30*stPID.Proportion)/温度低于设定值2摄氏度 jwen=1; /打开电热得快 /*PID控制*/unsigned int get_temperature(void) float fT; fT= read_temperature(); tb=fT/100; ts=fT/10%10; tg=fT%10; yej(); stPID.Proportion = 1; / 设置PID比例值 stPID.Integral = 0.5; / 设置PID积分值 stPID.Derivative = 0.0; / 设置PID微分值 fOut = 100*PIDCalc ( &stPID,(int)(fT*10) ); / PID计算 active();int scan(void) int i,j,r=16,key=16; for(i=0;i<=3;i+) P1|=0xff; P1&=(0x01<<i); /i行输出为0 for(j=4;j<8;j+) if(P1&(0x01<<j)=0) /j行为0 delay(30); if(P1&(0x01<<j)=0) key=P1&0xff; switch(key) case 0xe7: r=0;break; case 0xee: r=1;break; case 0xde: r=2;break; case 0xbe: r=3;break; case 0xed: r=4;break; case 0xdd: r=5;break; case 0xbd: r=6;break; case 0xeb: r=7;break; case 0xdb: r=8;break; case 0xbb: r=9;break; case 0xd7: r=10;break; case 0xb7: r=11;break; case 0x7e: r=12;break; case 0x7d: r=13;break; case 0x7b: r=14;break; case 0x77: r=15;break; default : r=16;break; return r;/*水温控制*/void std2(void) uchar ii,ws=0,i=16; w_s=0; s_s=1;s_tb=0;s_ts=0;s_tg=0; yej();while(1) if(i<10) ii=i;delay(6000);delay(6000);i=scan(); if(ws=2)&(ii=i)s_tb=s_ts;s_ts=s_tg;s_tg=i;yej();ws+;break; if(ws=1)&(ii=i)s_ts=s_tg;s_tg=i;yej();ws+;i=scan();continue; if(ws=0)&(ii=i)s_tg=i;yej();ws+;i=scan();continue; if(i=10)break; if(i=11)ws=0;s_tb=0;s_ts=0;s_tg=0;yej(); i=scan();if(s_tb>1)s_tb=1;s_ts=0;s_tg=0; else if(s_tb=1)&&(s_ts>0)|(s_tb=1)&&(s_tg>0)=1) s_tb=1;s_ts=0;s_tg=0; else ;w_s=1;s_s=1;/*探测压力*/ void control(void) switch(shz) case 9: jsh=0; if(s_a=0)shs=13; if(s_b=0)shs=14; if(s_c=0)shs=15; if(s_d=0)shs=16; break; case 10: csh=0;if(s_d=0)shs=16;if(s_c=0)shs=15;if(s_b=0)shs=14;if(s_a=0)shs=13;break; case 11: jsh=1;csh=1; if(s_a=0)shs=13; if(s_b=0)shs=14; if(s_c=0)shs=15; if(s_d=0)shs=16;break; default: break; /*主函数*/void main()static unsigned int ss=0; kk=16; In_yj(); L1=1;L2=0; L3=1;L4=1; s_a=1;s_b=1;s_c=1;s_d=1; jsh=1;csh=1; swen=1;TMOD=0x01; /初始化定时器TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1; while(1) if(ss%100)=0) t=read_temperature(); if(t<=(s_tb*100+s_ts*10+s_tg) /温度判断到没 swen=0; else swen=1; tb=t/100; ts=t/10%10; tg=t%10; yej(); if(ss=600) ss=0;L2=L2; ss+; kk=scan(); if(kk!=16) delay(100);kk=scan(); if(kk!=16)std1();else ; control(); if(jsh=0)if(s_sh<=shs)jsh=1;shz=11; bflag =1 if(csh=0)if(s_sh>=shs)csh=1;shz=11; bflag =1 /*中断程序*/void t0(void) interrupt 1 using 0TH0=(65535-50000)/256; /50ms定时TL0=(65535-50000)%256;if(bflag>0) buzzk+; if(buzzk%20=0)L4=0; else L4=1;if(buzzk=30) bflag=0;else L4=1;