水温控制系统设计摘要考虑到题目的要求,本设计采用单片机开实现,设计采用现成有的AT89C52单片机(实际AT89C2051即可满足要求)。单片机软件编程灵活,自由度大,可用软件编程实现各种控制算法和各种逻辑控制。本设计的主要特点:1)温度采集部分采用DS18B20单总线数字温度传感器。DS18B20具有微型化,低功耗,高性能,抗干扰能力强的特点。该器件将半导体温敏器件,A/D转换器,存储器等集成在一个芯片上,传感器输出的就是温度信号数字值。使用该器件不仅大大简化了温度采集部分,而且也提高了温度采集部分的抗干扰性。2)控制部分采用固态继电器。a固态继电器内部采用光耦合方式,可实现弱电部分与强电部分的完全隔离。b固态继电器的反应时间较短。考虑到加热器件的热惯性,使用固态继电器在实际温度接近设定温度时可采用调节输出信号占空比的方式(即PWM方式)来控制继电器的通断,使系统稳定时间缩短。3)设定值可被记忆。DS18B20内部含有EEPROM电擦除ROM用于存储设定的上下限报警值,因此每次设定的值都可以被存储下来,直到下一次设定为止。一.方案论证和比较(1)方案一采用二位式模拟控制方案,利用上下限比较电路,提高精度。这种方法是模拟控制方式,因此不能实现复杂的控制算法使控制精度做得较高,而且不能用数码显示和键盘设定。(框图见C-1)(图C-1)二.系统原理(1)传感器选择常见的感温元件有热电偶、热电阻、半导体和集成等传感器,它们的主要优缺点是:热电偶价格便宜,但精度低,需冷端补偿,电路设计复杂;热电阻精度高,但需要标准稳定电阻匹配才能使用。而半导体温度传感器需要经过模数转换,数据线多,电路设计比较难。而集成温度传感器具有精度高,线性度好,电路简单,价格适中等优点。因此我们选用由美国DALLAS半导体公司生产的智能型温度传感器DS18B20。采集信号信号放大上限比较下限比较信号处理固态继电器负载温度预置(2)控制算法实验表明,水温控制系统中,由于加热电炉的热惯性,温度会有一定的超调。而采用单纯的PID控制始终具有较大的超调,因此在输出控制上我们采用PWM方式实现,PWM的基本原理是在一定周期内调节占空比,设定值与实测温度值之差和输出信号的占空比成正比,即实测值与设定值越接近,则输出信号的占空比越小。当实测温度值等于设定值时,输出信号占空比为0,控制继电器关断,停止加热。(3)单元电路描述1.CPU本系统采用AT89C52芯片作为核心部件,89C52内部带有8K字节FLASH闪速存储器,256字节内部RAM,32个I/O口线。(图见1—1)2.信号采集电路本系统信号主要由温度传感器DS18B20组成,因为是集成芯片,可以不加其它电路直接将芯片数据输出口接到CPUI/O口上。(见图1-2)(图1—1)(图1—2)3.键盘设定本系统共设4个键:其中一个键是单片机系统复位用,一个是温度设定键(p1.6)、加一(p1.4)、减一键(p1.5)。(图见1—3)(图1—3)(图1—4)4.数码显示数码管采用三位共阳数码管。使用单片机P0口输出段码,用P2.5—P2.7控制三极管的导通和截至,进行位选择,实现三位数据动态显示。(图见1—4)5.超温报警报警电路利用单片机P3.7进行控制有源蜂鸣器。(当温度超过设定温度上限时开始报警)(图略)6.继电器控制该部分利用单片机P1.0引脚对固态继电器进行控制,以实现对电炉的加热进行控制,既在温度达到设定值时断开电炉的电源停止加热。(图略)7.电源电路电源采用采用7805稳压,对系统供电。如图(图略)一.硬件原理总图(见图C—4)实测温度与设定温度比较(图C—4)二.软件系统设计1.系统软件总流程图如下2.功能键扫描子程序:K1是否按下K3是否按下Y/进入设定状态Y/设定值加1K2是否按下NNK3是否按下Y/退出设定状态N开始设置堆栈,T0中断复位与检测DS18B20发跳过ROM命令发温度转换命令延时复位DS18B20发跳过ROM命令将温度转换成BCD码发读存储器命令显示转换后的温度更新显示缓冲区读温度数据及设定值功能键扫描执行相应的控制操作Y/设定值减1N控制操作子程序:五.调试过程(1)在搪瓷器皿中存放1L水,放置在1KW的电炉上打开控制电源,系统进入准备工作、状态。(2)用温度计(精度为0.2度)对照测温系统测温,在水温分别为40、50、60、70、80、90摄氏度观察系统测量温度值与实际温度值,(3)动态测试:设定温度为75摄氏度系统由低温开始进入升温状态。开始记录数据,观测超调量、调节时间和稳态误差;系统进入稳态后,用电扇吹凉观测系统的抗干扰能力。设定温度为80度系统由低温开始进入升温状态。开始记录数据,观测超调量、调节时间和稳态误差;系统进入稳态后,用电扇吹凉观测系统的抗干扰能力。1.温度测量测试条件及仪器:水银温度计,1000W电炉,环境温度为32℃T温度计40℃50℃60℃70℃80℃90℃T测39.7℃49.9℃59.8℃69.6℃79.7℃90.1℃误差0.3℃0.1℃0.2℃0.4℃0.3℃0.1℃2.设定温度值(度)稳定时间(小于等于0.2度)最大超调量T温度计(误差)758分32秒0.6度75.2(0.2度)8010分12秒0.8度80.4(0.4度)稳定到75℃,经实验得知在稳定后,精度可以达到≤0.1℃六.总结本系统采用AT89C52芯片为核心部件,利用数字温度传感器DS18B20进行温度采集,设定值是否大于实测值Y/加热N报警,停止加热设定值—实测值《5度P1.0输出PWM波进行控制设定值大于等于实测值提高了测温精度,充分利用软件编程,使温度精确度和稳定度均到达题目要求。另外可以改进算法以解决超调和测温精度问题。附程序:TIMER_LDATA23HTIMER_HDATA24HTIMER_COUNDATA25HTEMPLDATA26HTEMPHDATA27HTEMP_THDATA28HTEMP_TLDATA29HTEMPHCDATA2AHTEMPLCDATA2BHTEMP_ZHDATA2CHBEEPEQUP3.7DATA_LINEEQUP3.3RELAYEQUP1.0FLAG1EQU20H.0;K1EQUP1.4K2EQUP1.5K3EQUP1.6K4EQUP1.7;ORG0000HJMPMAINORG001BHJMPT1INT1T1INT1:PUSHACCPUSHPSWINC2DHMOVA,2DHCJNEA,#50,T1INT1EMOV2DH,#0CPLP1.0INC2EHMOVA,2EHCJNEA,#3,T1INT1ESETB7FHMOV2EH,#0T1INT1E:POPPSWPOPACCRETI;MAIN:movSP,#30HMOVTMOD,#11H;T0,方式1MOVTIMER_L,#00H;50ms定时值MOVTIMER_H,#4CHMOVTH1,#00HMOVTL1,#00HMOVIE,#82H;EA=1,ET0=1SETBET1LCALLREAD_E2MOV20H,#00HSETBBEEPSETBRELAYMOV7FH,#0AH;熄灭符CALLRESET;复位与检测DS18B20JNBFLAG1,MAIN1;FLAG1=0,DS18B20不存在JMPSTARTMAIN1:CALLRESETJBFLAG1,STARTLCALLBEEP_BL;DS18B20错误,报警JMPMAIN1START:MOVA,#0CCH;跳过ROM匹配CALLWRITEMOVA,#044H;发出温度转换命令CALLWRITECALLRESETMOVA,#0CCH;跳过ROM匹配CALLWRITEMOVA,#0BEH;发出读温度命令CALLWRITECALLREAD;读温度数据CALLCONVTEMPCALLDISPBCDCALLDISP1CALLSCANKEYLCALLTEMP_COMPJMPMAIN1;;DS18B20复位与检测子程序;FLAG1=1OK,FLAG1=0ERROR;RESET:SETBDATA_LINENOPCLRDATA_LINEMOVR0,#64H;主机发出延时600微秒的复位低脉冲MOVR1,#03HRESET1:DJNZR0,$MOVR0,#64HDJNZR1,RESET1SETBDATA_LINE;然后拉高数据线NOPMOVR0,#25HRESET2:JNBDATA_LINE,RESET3;等待DS18B20回应DJNZR0,RESET2JMPRESET4;延时RESET3:SETBFLAG1;置标志位,表示DS1820存在JMPRESET5RESET4:CLRFLAG1;清标志位,表示DS1820不存在JMPRESET6RESET5:MOVR0,#064HDJNZR0,$;时序要求延时一段时间RESET6:SETBDATA_LINERET;===========================================================WRITE:MOVR2,#8;一共8位数据CLRCYWR1:CLRDATA_LINE;开始写入DS18B20总线要处于复位(低)状态MOVR3,#09DJNZR3,$;总线复位保持18微妙以上RRCA;把一个字节DATA分成8个BIT环移给CMOVDATA_LINE,C;写入一个BITMOVR3,#23DJNZR3,$;等待46微妙SETBDATA_LINE;重新释放总线NOPDJNZR2,WR1;写入下一个BITSETBDATA_LINERET;;从DS18B20中读出温度低位、高位和报警值TH、TL;;重新对DS18B20初始化;将设定的温度报警值写入DS18B20RE_18B20:JBFLAG1,RE_18B20ARETRE_18B20A:CALLRESETMOVA,#0CCH;跳过ROM匹配LCALLWRITEMOVA,#4EH;写暂存寄存器LCALLWRITEMOVA,TEMP_TH;TH(报警上限)LCALLWRITEMOVA,TEMP_TL;TL(报警下限)LCALLWRITEMOVA,#7FH;12位精确度LCALLWRITERET;功能键扫描子程序SCANKEY:MOVP1,#0F0HSCAN_K3:JBK3,SCAN_ENDCALLBEEP_BLLCALLRESET_THLCALLRE_18B20LCALLWRITE_E2SCAN_END:CLRTR0RET;设置温度报警值RESET_TH:CALLALERT_THCALLALERT_PLAYJNBK3,$SETBTR0RESET_TH1:CALLALERT_THmov75h,7Eh;mov76h,7DhCALLALERT_PLAYR_TH02:JNBK1,K021AJNBK2,K021BJNBK3,TH_DELJNBK3,SCAN_ENDJMPRESET_TH1K021A:INCTEMP_THMOVA,TEMP_THCJNEA,#90,K022A;没有到设定上限值,转MOVTEMP_TH,#70K022A:CALLTH_DELJMPRESET_TH1K021B:DECTEMP_TH;减1MOVA,TEMP_THCJNEA,#70,K022B;没有到设定下限值,转MOVTEMP_TH,#90K022B:CALLTH_DELJMPRESET_TH1K002:CALLBEEP_BLCLRTR0;关闭中断RET;键延时子程序;多次调用报警值显示程序来延时TH_DEL:;报警高值延时MOVR2,#0AHTH_DEL1:CALLALERT_THCALLALERT_PLAYDJNZR2,TH_DEL1RET;;实时温度值与设定报警温度值TH比较子程序;当实际温度大于TH的设定值时,,继电器关闭蜂鸣器报警;当实际温度小于TH的设定值时,”,继电器吸合。TEMP_COMP:SETBTR0;启动中断MOVA,TEMP_THSUBBA,TEMP_ZH;减数被减数,则JCCHULI1JMPL0CJNEA,#5,LLL1LLL1:JCCHULI1;借位