1、水温控制系统水温控制系统目 录1.系统的设计及方案论证21.1题目要求21.1.1基本要求21.1.2 发挥部分21.2 系统的基本方案21.2.1 各模块的选择和论证21.3系统各模块的最终方案32.系统的硬件设计与实现42.1系统的硬件的基本组成部分42.1.1 部分外部电路设计42.2.2 测温部分电路设计52.2.3 控制部分62.2.4 显示部分63.程序设计74.对电路进行测试74.1 继电器测试74.2 DS18B20测试74.3显示数码管测试85.系统测试85.1 测试环境85.2 测试方法86.系统误差分析87.参考文献8附录 A9附录 B917文摘: 为了实现高精度的水温控
2、制,本文介绍了一种以STC89C52单片机为控制核心、以及辅助元件相结合的控制方法来实现的水温控制系统。文章着重介绍核心器件的选择、控制算法的确定、各部份电路及软件的设计。STC89C52单片机完善的内部结构、优良的性能和强大的中断处理能力,决定了该控制系统的特点:电路结构简单、程序简短、系统可靠性高等。本次设计还充分利用了STC89C52单片机成熟的语音处理技术来实现了语音播报温度。1.系统的设计及方案论证1.1题目要求1.1.1基本要求该系统为一实验系统,系统设计任务:设计一个水温自动控制系统,控制对象为1升净水,容器为搪瓷器皿。水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动
3、调整,以保持设定的温度基本不变。系统设计具体要求: 温度设定范围为3090。 环境温度降低时(例如用电风扇降温)温度控制的静态误差1。采用适当的控制方法,当设定温度突变(由40提高到60)时,减小系统的调节时间和超调量。用十进制数码管显示水的实际温度。 在设定温度发生突变(由40提高到60)时,led报警1.1.2 发挥部分 A.我们在基于十进制数码管显示水的实际温度的同时我们显示设定的温度方便比较。 B.设计了3个按键来控制设定的温度。1.2 系统的基本方案1.2.1 各模块的选择和论证 (1)控制器模块根据题目要求,控制器主要用于采集水的温度及控制水温在一定范围内变化。对于在数码处显示水位
4、的具体温度值。对于控制器选择有两种方案。方案一:采用FPGA作为系统的控制器,FPGA可以实现各种各样的复杂逻辑电路功能,规模大,密度高,它将所有的器件集成在一块芯片上,减小了体积,提高了稳定性,并且可以以用EDA软件仿真,调试,易于进行功能扩展。FPGA采用并行的输入输出的方式,提高了系统的处理速度,适合作为大规模实时系统控制核心。由于测模块输出的信号并行输入FPGA,FPGA通过程序设计控制水温作出相应的数字显示,有本设计要求的数据处理速度不高,FPGA的高速处理的优势得不到充分的体现,并且由于集成度较高,使其成本偏低,同时由于芯片的引脚太多,实物硬件电路板不限复杂,并加重了电路设计和实际
5、的焊接的工作。方案二:采用ATMEL公司的AT89C52作为系统的控制器的双CPU方案。单片的算术运算功能强,软件编程灵活,自由度大,可用软件编程实现各种算法和逻辑控制,并且由于功耗低体积小,技术成熟和成本低等特点,使其在各领域应用广泛。基于以上方分析使用方案二,单片机担任了由传感器过来的温度的采集,并且控制继电器,还有就是现实温度值。(2)数据采集模块方案一:用热敏电阻:通过电阻的变化来获得电压的变化,起价格虽然便宜但是精度不是很高。对于一个精度要求高的系统不宜采用。方案二:用A/D590:通过AD590温度传感器采集温度,由于AD590是电流传感器,经过电阻转换为电压。虽然价格较高但是精度
6、高。方案三:DS18B20数字温度计是DALLAS公司生产的1Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。测量范围为-35+125。最大精度为0.0625。经比较我们选用DS18B20来进行温度采集,这样使得线路更加简单。(3)数据显示模块方案一:8段LED数码管显示,数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指
7、将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。方案二:LCD1602显示。工业字符型液晶,能够同时显示16x02即32个字符(16列2行)。但价格较贵。通过比较我们选用方案一,结构简单,便宜,易于购买,在编写程序的
8、时候也比较方便。(4)自动控制控制模块方案一:电子过零晶闸管晶闸管是一种大功率的整流元件,它的整流电压可以控制,当供给整流电路的交流电压一定时,输出电压能够均匀调节,它是一个四层三端的半导体器件。在整流电路中,晶闸管在承受正向电压的时间内,改变触发脉冲的输入时刻,即改变控制角的大小,在负载上可得到不同数值的直流电压,因而控制了输出电压的大小。晶闸管导通的条件是阳极承受正向电压,处于阻断状态的晶闸管,只有在门极加正向触发电压,才能使其导通。门极所加正向触发脉冲的最小宽度,应能使阳极电流达到维持通态所需要的最小阳极电流,即擎住电流IL以上。导通后的晶闸管管压降很小。 使导通了的晶闸管关断的条件是使
9、流过晶闸管的电流减小至一个小的数值,即维持电流IH一下。其方法有二: 1、减小正向阳极电压至一个数值一下,或加反向阳极电压。 2、增加负载回路中的电阻。在这里我们主要使用的是晶闸管的开关作用。方案二:继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。电磁继电器的工作原理和特性 电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用
10、下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。1.3系统各模块的最终方案 经过仔细分析和论证,决定论系统各模块的最终方案如下。控制器模块:采用AT89C52。 数据采集模块:选用DS18B20。数据显示模块:选用数码管。自动控制模块:选用继电器。如图见附录
11、。选用AT89C52主要用于控制采集过来的温度进行处理,然后返回去控制水的温度在一个确定的值,在这个过程中如果超过或者低于我们需要的温度,继电器就做出反应,跳向另外一端导通工作,发光二极管会做出响应的反应,同时电热水器也会对水进行加热,同时数码管显示相应的数值。2.系统的硬件设计与实现2.1系统的硬件的基本组成部分STC89C52LED报警键盘、蜂鸣器、继电器热电炉子数据显示数据采集集本系统是一个简单的单回路控制系统。为了实现温度的自动测量和控制,本系统采用了STC89C52单片机作为系统的控制中心,由数据采集模块检测到的温度信号传入单片机,并根据接收到的数据进行处理和控制运算,同时将数据保存
12、,以便与下一次采样值进行比较,通过软件对所测电压进行数字非线性校正,同时由显示器进行实时显示。根据系统程序控制,以及输出控制,最终由CPU控制加热回路电热水器棒,在和继电器控制通断,达到调控目的。系统还提供了键盘设定模块,便于用户与系统之间的信息交换。系统的硬件结构较简单,由若干个功能模块组成。具体结构图及说明如上。2.1.1 部分外部电路设计 由总体框图可以看到,整个系统的设计都离不开STC89C52的输入/输出接口。在单片机中,I/O口就是单片机与外设交换信息的主要通道。输入端口从外界接收检测的输入信号、键盘信号等各种开关量信号;输出端口向外部输出处理结果、显示信息、控制命令、驱动信号等。
13、STC89C52内部有并行和串行方式的I/O口。一个8位通用的并行I/O端口,这两个口的每一位都可通过编程单独定义为输入或输出口,通常对某一位的设定包括三个基本项:数据向量Data、属性向量Attribution和方向控制向量Direction,三个向量的每个对应位组合在一起形成一个控制字,用来定义相应I/O口位的输入、输出状态和工作方式。IO口的IOA0IOA7用作输入口时具有唤醒功能,常用于键盘输入。P1口除常规的输入输出功能外,还具有特殊功能。比如后面串行通信用到的IOB7口和IOB10口,它们在此电路中就充当的是串行数据的接收和发送端口。具体的用法将在后面的电路设计中用到。键盘设置电路
14、:IOA0接KEY1,IOA1接KEY2,IOA2接KEY3。KEY1: 设置位置,十位,个位,小数位还是空闲KEY2: 设置温度的加位数;KEY3: 设置温度的减位数;键盘电路系统上电后,数码管全部显示为设计温度,检测KEY1是否按下,再根据按KEY2次数,数码管顺序增加。同样KEY3,数码管顺序减小;key1按下4次恢复!系统开始测温,并与采集的温度进行比较,通过软件来控制电炉的开关。同时LED报警时,改变温度。2.2.2 测温部分电路设计1DS18B20基本知识 DS18B20数字温度计是DALLAS公司生产的1Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系
15、统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 1、DS18B20产品的特点 (1)、只要求一个端口即可实现通信。 (2)、在DS18B20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任何元器件即可实现测温。 (4)、测量温度范围在55。C到125。C之间。 (5)、数字温度计的分辨率用户可以从9位到12位选择。 (6)、内部有温度上、下限告警设置。 由于DS18B20采用的是1Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对D
16、S18B20芯片的访问。 由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。 对于DS18B20的读时序分为读0时序和读1时序两个过程。 对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B
17、20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。 对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。2.2.3 控制部分 此部份用于在闭环控制系统中对被控对象实施控制,此处被控对象为电炉丝,采用对加在电炉丝两端的电压进行通断的方法进行控制,以实现对水加热功率的调整,从而达到对水温控制的目的。对电炉丝通断的控
18、制采用SSR固态继电器,SSR是半导体继电器,所以较小的驱动功率即可使SSR工作。它的使用非常简单,只要在控制台端加上一TTL、CMOS电平或一晶体管,即可实现对继电器的开关。电阻丝继电器GNDGNDVCC 热电炉控制电路为通过三极管NPN9013来控制继电器的开关的,继电器采用的是可控硅常开式(常闭式)固态继电器,为使其实现过零控制,就是要实现工频电压的过零检测,并给出脉冲信号,由单片机控制双向可控硅过零脉冲数目。当在其输入端加入(撤离)控制信号时,输出端接通(断开),从而控制电炉与电源的通断,来达到加热或冷却炉丝的目的,最终实现使碗中水温度稳定在设定值上。2.2.4 显示部分本图采用了共阴
19、极数码管LED5641A进行显示,LED5641A具有四位数码管,这四个数码管的段选a、b、c、d、e、f、g、dp分别接在一起,每一个都拥有一个共阴的位选端(我们使用2片)。位选口P0.0 P0.1 P0.2分别接74ls138的输入端,通过138译码器输出端来控制LED的片选。P1口传输要显示的数据,利用其串/并转换功能,送入数码管显示。数据线也可直接接凌阳RTC89C52单片机的I/O口,因为I/O口输出电流很小,驱动LED效果不好,我们使用74HC245N来传输P1口数据给LED,而它的电压值却足以驱动LED,使其能正常显示。3.程序设计有无40是否初始化采集温度设计温度值检测是否有按
20、键按下数码管显示与设计温度差是否1开始LED闪亮+1时pwm=0;-1时pwm=1;系统流程图4.对电路进行测试4.1 继电器测试 测触点电阻用万能表的电阻档,测量常闭触点与动点电阻,其阻值应为0;而常开触点与动点的阻值就为无穷大。由此可以区别出那个是常闭触点,那个是常开触点。 测线圈电阻可用万能表R10档测量继电器线圈的阻值,从而判断该线圈是否存在着开路现象。 测量吸合电压和吸合电流找来可调稳压电源和电流表,给继电器输入一组电压,且在供电回路中串入电流表进行监测。慢慢调高电源电压,听到继电器吸合声时,记下该吸合电压和吸合电流。为求准确,可以试多几次而求平均值。 测量释放电压和释放电流也是像上
21、述那样连接测试,当继电器发生吸合后,再逐渐降低供电电压,当听到继电器再次发生释放声音时,记下此时的电压和电流,亦可尝试多几次而取得平均的释放电压和释放电流。一般情况下,继电器的释放电压约在吸合电压的1050,如果释放电压太小(小于1/10的吸合电压),则不能正常使用了,这样会对电路的稳定性造成威胁,工作不可靠。4.2 DS18B20测试在温水中测试,并用温度计测量水温,实验测试表明18B20的温差在0.1内。次数测试1测试2测试3测试4DS18B2043.656.368.288.2实测43.656.268.188.24.3显示数码管测试8位8 段数码管显示正常。5.系统测试系统整体进行测试,测
22、试时LED闪烁时,系统供电不稳定。改进时将LED闪烁时间加长,消除了不稳定的状况!5.1 测试环境 环境温度28摄氏度; 测试仪器: 数字万用表; 温度计0-100摄氏度;5.2 测试方法 在搪瓷器皿中存放1L净水,放置在1KW的电炉上,打开控制电源,系统工程进入准备工作状态; 用温度计标定测温系统。分别使水温稳定在40、50、60、70、80、90观察系统测量温度值与实际温度值,校准系统使测量误差在1以内。 动态测试:设定温度为60,系统由低温开始进入升温状态。开始记录数据,观察超调量、调节时间和稳态误差;系统进入稳态后,用电风扇吹凉,观察系统的抗扰能力。设定温度为90系统由低温开始进入升温
23、状态。开始记录数据,观察超调量、调节时间和稳态误差;系统进入稳态后,用电风扇吹凉,观察系统的抗扰动能力。检验系统的显示、报警、设定等功能。6.系统误差分析从整个电路原理框图来看,系统的主要误差来源于以下几个方面: 因为我们的设计都是在理想的情况下设计的,所以必须综合考虑多方面因素。 继电器引起的误差。当有交流负载时有漏电流。随着对电炉的加热,环境温度升高,流经继电器的电流将减小。交流电源线上的负载可能增加许多干扰信号,这些干扰信号有可能使继电器误导通。 由于实验所用测量工具(如温度计)本身精度以及所带来的视觉误差,加上温度变化惯性较大,动态测量时准确控制测量精度略有难度。7.参考文献1.赵志英
24、,涂时亮,单片机微型原理应用与实验(第三版),上海:复旦大学出张有版社,2005年。2.何立民。MCS-51系列单片机应用系统设计,系统配置与接口技术。北京:北京航空航天大学出版社,2008。3.陆坤,奚大顺,李之权等,电子设计技术,程度:电子科技大学出版社,2000年。4.谢自美,阎树兰,赵云弟等,电子线路设计实验测试(第二版)。武汉:华中理工大学出版社。2006年。5.杨帮文,新型电路制作2000例。北京:人民邮电出版社。2006年。6.高吉祥,黄志伟,丁文霞,数字电子技术,北京:电子工业出版社,2003,第一版。7.全国大学生电子设计委员会编,全国大学生电子设计竞赛作品选编。2009年。
25、附录 A水温控制电路图附录 B(源程序)#include#define uchar unsigned char#define uint unsigned intsbit s1=P20; sbit s2=P21;sbit s3=P22; sbit beep=P23;sbit led=P24;sbit DQ=P26; sbit pwm=P27;/code uchar table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x39,0x40,0x00; /0-9 . C - 空;code uchar table=0xfc,0x60,
26、0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x01,0x9c,0x02,0x00;/引脚倒置,失误char shi=3,ge=3,fen=5;uint temp1,temp2,temp;uchar s1num=0;delay(uint z) /延时程序延时3*y*z us uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);delay1(uchar z) /延时z*10usuchar x,y;for(x=z;x0;x-)for(y=3;y0;y-);void int_time()/中断初始化TMOD=0x01; TH0=(655
27、36-1000)/256; /1msTL0=(65536-1000)%256; EA=1;ET0=1; TR0=1; void despaly1(uint temp1,uint temp2)/显示温度 P0=0x00; /显示十位P1=tabletemp1/10;delay1(25);P0=0x01; /显示个位P1=tabletemp1%10;delay1(25);P0=0x01; /显示小数点P1=table10;delay1(30); P0=0x02; /显示小数P1=tabletemp2*5/8;/*0.0625*10delay1(30);P0=0x03;P1=table11;dela
28、y1(25); /显示 CP1=0;delay1(10);void desplay2(char shi,char ge,char fen) /设定温度部分P0=0x04;/十位P1=tableshi;delay1(25);P0=0x05; /个位P1=tablege;delay1(25);P0=0x05; /小数点P1=table10;delay1(25);P0=0x06; /小数P1=tablefen;delay1(25);P0=0x07;P1=table11;delay1(25);P1=0;delay1(10);/18B20采集程序/*ds18b20延迟子函数(晶振12MHz )*/ vo
29、id delay_18B20(uint i)while(i-);/*ds18b20*/*ds18b20初始化函数*/void Init_DS18B20(void) unsigned char x=0; DQ=1; /DQ复位 delay_18B20(8); /稍做延时 DQ=0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ=1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*ds18b20读一个字节*/ unsigned char ReadOn
30、eChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DQ=0; / 给脉冲信号 dat=1; DQ=1; / 给脉冲信号 if(DQ) dat|=0x80; /?/ delay_18B20(4); return(dat);/*ds18b20写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ=0; DQ = dat&0x01; /?/ delay_18B20(5); DQ=1; dat=1; /*读取ds18b20当前温度*/void ReadT
31、emperature(void)uchar a=0;uchar b=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b=Re
32、adOneChar(); /读取温度值高位temp1=b4; /整数位/ b的低4位+a的高4位temp2=a&0x0f; /小数位/ a的低4位 temp=(b*256+a)4); /当前采集温度值除16得实际温度值 0.0625约为1/16c /报警 做按键提示音 及报警void tishi()beep=1;delay(100);beep=0;/delay(50);void shan()led=0;delay(150);led=1;delay(100);/*按键检测*/ void keyscan() TR0=0; if(s1=0)/s1控制选择改变位置/最好在按键部分加一个小报警(当做按键
33、按下提示)/吧报警用二极管 这样,系统电压也稳定 看硬件来 加软件部分 delay(10); if(s1=0) while(!s1); s1num+; TR0=0; if(s1num=4)s1num=0; tishi(); /*加*if(s1num=1)if(s2=0) /s2控制+delay(10);if(s2=0)while(!s2);fen+;if(fen=10)fen=0;tishi();if(s1num=2)if(s2=0)delay(10);if(s2=0)while(!s2);ge+;if(ge=10)ge=0;tishi();if(s1num=3)if(s2=0)delay(1
34、0);if(s2=0)while(!s2);shi+;if(shi=10)shi=0;tishi(); /*减*if(s1num=1)if(s3=0) /s3控制-delay(10);if(s3=0)while(!s3);fen-;if(fen=-1)fen=9;tishi();if(s1num=2)if(s3=0)delay(10);if(s3=0)while(!s3);ge-;if(ge=-1)ge=9;tishi();if(s1num=3)if(s3=0)delay(10);if(s3=0)while(!s3);shi-;if(shi=-1)shi=9;tishi();TR0=1;/*控
35、制*报警*/ void kongzhi()char cha,sheji;sheji=shi*10+ge;cha=sheji-temp; /粗略估计差值 设计-实际最大设计30.9 误差30加热 31停if(cha=1)/30 29加热 31停shan();pwm=1; /可用LED替else if(cha=-1)shan();pwm=0; /*主函数*/main()int_time(); /中断初始化beep=0;Init_DS18B20();/18B20初始化while(1)ReadTemperature();/采集温度delay(1);despaly1(temp1,temp2);/显示采集温度desplay2(shi,ge,fen);/显示设定温度kongzhi();/控制?/*中断服务*/void time0() interrupt 1 /检测按键 TH0=(65536-10000)/256; /10msTL0=(65536-10000)%256;keyscan();