基于STC12C5A60S2的水温控制系统_第1页
基于STC12C5A60S2的水温控制系统_第2页
基于STC12C5A60S2的水温控制系统_第3页
基于STC12C5A60S2的水温控制系统_第4页
基于STC12C5A60S2的水温控制系统_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要随着微机测量和控制技术的迅速开展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计论述了一种以STC12C5A60S2单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。通过PID算法和PWM脉宽调制实现温度的精确控制,由温度传感器返回温度值,再与设定温度比拟,经过单片机的处理后发出相应的控制信号从而将温度控制在设定的范围之内。硬件电路主要包括STC12C5A60S2单片机最小系统,测温电路、LCD液晶显示电路以及加热控制电路等。系统程序主要包括主程序,读出温度子程序,PID控制温度子程序、PWM子程序、按键处理程序、LCD显示程序以及模式选择程序等。[关键词]STC12C5A60S2单片机;DS18B20;显示电路Abstract:Alongwiththecomputermeasurementandcontroltechnologyoftherapiddevelopmentandwideapplication,basedonsinglechiptemperaturegatheringandcontrolsystemdevelopmentandapplicationgreatlyimprovetheproductionoftemperatureinlifelevelofcontrol.ThisdesignSTC12C5A60S2describesakindofmainlybyMCUcontrolunit,fortemperaturesensorDS18B20temperaturecontrolsystem.Thecontrolsystemcanreal-timestoragetemperaturedataandrecordrelatedtothecurrenttime.Systemdesignrelatedhardwarecircuitandrelatedapplications.STC12C5A60S2microcontrollerhardwarecircuitincludetemperaturedetectioncircuitsmallestsystem,andreal-timeclockcircuit,LCDdisplaycircuit,communicationmodulecircuit,etc.Systemprogrammingmainlyincludemainprogram,readtemperaturesubroutine,thecalculationoftemperaturesubroutines,keyprocessingprocedures,LCDdisplayproceduresanddatastorageprocedures,etc.[Keywords]STC12C5A60S2microcontroller;DS18B20;displaycircuit选题依据及研究意义选题依据:随着社会的开展,科技的进步,以及测温仪器在各个领域的应用,智能化已是现在温度控制系统开展的主流方向。特别是近年来,温度控制系统已深入应用到人们生活的各个方面,但温度控制一直是一个潜在开发的领域,其又是与人们息息相关的一个实际问题。针对这种情况,设计一个温度控制系统具有广泛的应用于实际意义。研究意义:温度是科学技术中最根本的物理量之一,物理,化学,生物等学科都离不开温度。在工业生产和实验研究中,温度常常是表征对象和过程状态的最重要的参数之一。比方:发电厂锅炉的温度必须控制在一定范围内;许多化学反响的工艺过程必须在适当的温度下才能正常进行;炼油工程中,原油必须在不同的温度和压力条件下进行分流才能得到汽油,柴油,煤油等产品。没有适宜的温度环境,许多电子设备就不能正常工作,粮仓的储粮就会变质霉烂,就累得品质就没有保障。因此,各行各业对温度控制的要求越来越高。可见。温度的测量和控制是非常重要的。选题的研究现状研究现状:自18世纪工业革命以来,工业开展对是否能掌握温度有着绝对的联系。在冶金,钢铁,石化,水泥,玻璃,医药等等行业,可以说几乎80%的工业部门都不得不考虑着温度的因素。在人类的生活环境中,温度扮演着极其重要的角色。温度是工业生产中常见的工艺参数之一,任何物理变化和化学反响过程都与温度密切相关,因此温度控制是生产自动化的重要任务。比方温室,水池,发酵缸,电源等场所的温度控制。而以往温度控制是由人工完成的而且不够重视,其实在很多场所温度都需要监控以防意外发生。对于不同生产情况和工艺要求下的温度控制,所采用的加热方式,燃料,控制方案也有所不同。无论你生活在哪里,从事什么工作,无时不刻不在与温度打着交道。单片微型计算机是随着超大规模集成电路技术的开展而诞生的,由于它具有体积小、功能强、性价比高等特点,所以广泛应用于电子仪表、家用电器、节能装置、军事装置、机器人、工业控制等诸多领域,使产品小型化、智能化、既提高了产品的功能和质量,又降低了本钱,简化了设计。本文主要介绍单片机在温度控制中的应用。根本设计思路单片机温度控制驱动模块单片机温度控制驱动模块显示模块温度信号采集模块键盘处理模块电热元件图1系统设计框架方案论证〔1〕温度传感器方案一:DS18B20是达拉斯公司生产的数字温度传感器,测温范围在-55℃~+125℃,采用单总线通信微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,精度可以到达0.0625图2DS18B20接口电路方案二:采用AD590作温度传感器,AD590是一种恒流源形式的温度传感器,只要在其两端加上一定工作电压,那么其输出电流随温度变化而变化,其线性电流输出为1uA/K,电流信号再由运放转换为电压信号,通过A/D转换器将输入的模拟电压量转换为数字量,并通过并行接口芯片将数字量送给计算机。具体接口电路如下:图3AD950接口电路由以上来看我们选用方案一DS18B20足以满足系统要求而且使设计更加简单可行。〔2〕主控芯片方案一:51系列AT89C51。方案二:增强型8051单片机STC12C5A60S2,STC12C5A60S2具有1个时钟/机器周期,速度比普通8051快8~12倍。兼容普通8051定时器T0/T1,2路PCA实现两个定时器,内含2通道捕获/比拟单元〔PWM/PCA/CCP〕。本系统中需要通过调节PWM波的占空比来控制加热电路的通断时间,STC12C5A60S2中含有PWM特殊功能存放器,不需要独立设计PWM产生电路,AT89C51那么无此功能,应选用方案二。〔3〕显示及键盘方案一:八位数码管显示。方案二:12864液晶显示。由于需要显示的数据比拟多且数码管不能显示曲线,为电路设计简便起见,我们选用方案二又因为所需按键较多,应选用4*4键盘。键盘功能布置如下:一、硬件电路设计〔一〕单片机最小系统电路在温度控制系统设计中,控制核心是STC12C5A60S2单时钟/机器周期〔1T〕单片机,该单片机有32个I/O口,其外部晶振为12MHz,一个指令周期为1/12μS。使用该单片机完全可以完成设计任务,其最小系统主要包括:复位电路、震荡电路等,电路如下列图4所示:(图4STC12C5A60S2最小系统图〔二)LCD显示电路本设计的温度控制系统是采用液晶屏无字库型12864作为显示模块,此液晶共有8页,64行,128列,含有两个液晶驱动器C1和C2。其接口电路图如下列图5所示:图5LCD显示接口〔三〕加热驱动电路本设计中的加热元件使用固态继电器SSR-1P/45A及加热棒,由P1.3口输出PWM波形,从而控制固态继电器的通断。电路如下列图6所示:图6温度控制驱动电路二、软件程序设计〔一〕总体设计为了实现控制功能,本系统采用通过按键来设置控制温度并进行模式选择,通过LCD液晶显示屏显示实际温度和设置温度以及实际温度变化曲线。设定模式1为根本控制加热模式,模式2为分段恒温控制模式,模式3为恒速控制模式。主流程图如图7所示:图7程序主流程图其中通过键盘设置控制温度,采用按位直接给定数值并可进行屡次设置,使得操作简单方便。在键盘扫描程序中1—9键设置标志位,用以判断设定位。具体流程图如图8所示:图8设定控制温度流程图模式1:根本温度控制模式。当实际温度与设定温度相差大于5℃时采用PWM全速加热,小于5℃时采用PID控制调节PWM占空比,流程图如图9所示:图9模式1流程图模式2:分段恒温控制模式。将设定温度给定为50度,当温度为50度时,定时中断恒温控制3分钟,再将设定温度给定为70度。流程图如图10所示:图10模式2流程图模式3:恒速温度控制模式。如下列图所示:附录:#include<reg51.h>#include<intrins.h>//_nop_();延时函数用#include<math.h>#include<string.h>#defineuncharunsignedchar#defineunintunsignedintsfrCCON=0xD8;//PCA控制存放器sfrCMOD=0xD9;//PCA模式存放器sfrCCAPM0=0xDA;//PCA模块0模式存放器//模块0对应P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)sfrCL=0xE9;//PCA定时存放器低位sfrCH=0xF9;//PCA定时存放器高位sfrCCAP0L=0xEA;//PCA模块0的捕获存放器低位sfrCCAP0H=0xFA;//PCA模块0的捕获存放器高位sfrAUXR=0x8e;sbitCR=CCON^6;//PCA计数器运行控制位sbitE=P3^0;sbitRW=P3^1;sbitRS=P3^2;sbitCS1=P3^6;sbitCS2=P3^7;sbitDQ=P1^0;sbitM1=P1^5;sbitM2=P1^6;sbitM3=P1^7;sbitp=P1^3;charcodetablenum[][16]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//00x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//10x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//20x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//30x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//40x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//50x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//60x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//70x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//80x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//90x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//:0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//.};charcodetablesnum[][4]={0x00,0x7c,0x44,0x7c,//小00x00,0x00,0x7c,0x00,//小10x00,0x74,0x54,0x5c,//小20x00,0x54,0x54,0x7c,//小30x00,0x3c,0x20,0x7c,//小40x00,0x5c,0x54,0x74,//小50x00,0x7c,0x54,0x74,//小60x00,0x04,0x04,0x7c,//小70x00,0x7c,0x54,0x7c,//小80x00,0x5c,0x54,0x7c,//小90x08,0x08,0x08,0x08,};unintbz0,bz1,bz2,t1=180,t2=200,t3=12,bj=1,bj1=0;unintnum,ql=13,qp=1,Temperature;unintTen,One,Dot1,sa,sb,sc,js,set_temper,rout;structPID{unintProportion;//比例常数ProportionalConstunintIntegral;//积分常数IntegralConstunintDerivative;//微分常数DerivativeConstunintLastError;//Error[-1]unintPrevError;//Error[-2]};structPIDspid;//PIDControlStructure//PIDResponse(Output)ukrin实温//****定时初始化intids(){AUXR=0x80;EA=1;ET0=1;TMOD=0x01;TR0=1;TH0=(65536-5000)/256;TL0=(65536-5000)%256;}//********所有温度采集程序******//**************延时11us函数voiddelay(unintt){for(;t>0;t--);}//****************复位程序voidreset(){DQ=1;delay(56);//22usDQ=0;delay(630);//55usDQ=1;delay(100);}//*************检测应答脉冲子程序voidyingda(){while(DQ);while(~DQ){delay(16);//88usbreak;}}//***********写命令函数,写一个字节voidwrite_byte(uncharval){unchari;for(i=8;i>0;i--){DQ=1;//_nop_();//_nop_();_nop_();//_nop_();_nop_();_nop_();DQ=0;_nop_();_nop_();//_nop_();//_nop_();//_nop_();//5us//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();////_nop_();//_nop_();//_nop_();_nop_();_nop_();DQ=val&0x01;//取操作命令字节的每一枚数值,必须由低到高进行,//最低位移出,对于数据的传输均为串行输入,先输入val的最低位,delay(50);//66us//30val=val>>1;//右移1位,先为低位后为高位}DQ=1;delay(1);}//**************读一字节函数uncharread_byte(void)//无参函数{unchari;uncharvalue=0;for(i=8;i>0;i--){DQ=1;//_nop_();//_nop_();//_nop_();//_/nop_();//_nop_();//_nop_();//_nop_();_nop_();_nop_();value=value>>1;//value>>=1;DQ=0;//_nop_();//_nop_();///_nop_();_nop_();//4us//_nop_();_nop_();//_nop_();//_nop_();//_nop_();_nop_();//_nop_();//_nop_();DQ=1;_nop_();//_nop_();_nop_();//_nop_();//4us//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();//_nop_();_nop_();if(DQ)//假设DQ=1,那么读取的位即为1,假设DQ=0,那么直接右移一位,{value|=0x80;}delay(60);//66us,至少需要60us才能完成后一个读程序的过程}DQ=1;return(value);}//**********处理采集温度voidchuli(unchargaowei,unchardiwei){Temperature=(diwei+gaowei*256)*(0.0625*10);//Temperature=125Ten=Temperature/100;//1One=Temperature/10%10;//0Dot1=Temperature%10;//1}//**********采集温度并处理voidcaijiwendu(){uncharwenh,wenl;//存上下温度 reset();//芯片初始化指令,在每一次温度采集时都需要进行复位,初始化yingda(); write_byte(0xcc); //R0M操作指令,功能为跳过读DS18B20的ROM的编码,//跳过读ROM指令,直接温度转换 write_byte(0x44);//存储器操作命令,启动温度转换,结果存于9字节的内容中reset(); yingda(); write_byte(0xcc); write_byte(0xbe);//发读命令,存储器操作指令,读内部RAM中的九字节的内容wenl=read_byte();//温度低八位 wenh=read_byte();//温度高八位 chuli(wenh,wenl);//数据处理}//**************************************************************//************LCD显示程序//**************是否忙碌voidreadbusy(){P0=0x00;RS=0;RW=1;E=1;while(P0&0x80);E=0;} //***********写命令voidwritecommand(uncharcommand){readbusy();RS=0; RW=0; P0=command; E=1;_nop_();_nop_();E=0; }//***********写数据voidwritedate(unchardate){readbusy();RS=1;RW=0;P0=date;E=1;_nop_();_nop_();E=0;}//**********设置页voidsetpage(uncharpage){page=0xb8|page;writecommand(page);}//*************设置行voidsetline(uncharline){line=0xc0|line;writecommand(line);}//**************设置列voidsetcolumn(uncharcolumn){column=column&0x3f;column=0x40|column;writecommand(column);}voidsetonoff(uncharonoff){onoff=0x3e|onoff;writecommand(onoff);}//**************选屏voidselectscreen(uncharscreen){switch(screen){case0:CS1=1;CS2=1;break;case1:CS1=1;CS2=0;break;case2:CS1=0;CS2=1;break;default:break;}}//************清屏voidclearscreen(uncharscreen){unchari,j;selectscreen(screen);for(i=0;i<8;i++) { setpage(i); setcolumn(0); for(j=0;j<64;j++){ writedate(0x00); }}}//************初始化voidInitLCD(){readbusy();selectscreen(0);setonoff(0);selectscreen(0);setonoff(1);selectscreen(0);clearscreen(0);setline(0);clearscreen(0);writecommand(0xc0);}//***************显示数据voiddisplay(uncharss,uncharpage,uncharcolumn,uncharj){unchari;selectscreen(ss);setpage(page);setcolumn(column);for(i=0;i<8;i++){writedate(tablenum[j][i]);}setpage(page+1);setcolumn(column);for(i=0;i<8;i++){writedate(tablenum[j][i+8]);}}//****************显示小数据voiddisplays(uncharss,uncharpage,uncharcolumn,uncharj){unchari;selectscreen(ss);setpage(page);setcolumn(column);for(i=0;i<4;i++){writedate(tablesnum[j][i]);}}//**********显示坐标数据voiddissnum(){displays(1,3,0*4,7);displays(1,3,1*4,5);displays(1,5,0*4,4);displays(1,5,1*4,5);displays(1,7,0*4,1);displays(1,7,1*4,5);}//*************坐标轴voiddiszhou(){unchari,b;selectscreen(1);for(i=2;i<7;i++){setcolumn(11);setpage(i);writedate(0xff);}setcolumn(11);setpage(7);writedate(0x0f);for(b=2;b<8;b++){setcolumn(12);setpage(b);writedate(0x08);}}//************************************************************************//**************************键盘处理程序//*******************延时voiddelay1(unintz){ unintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}//***********扫描键盘voidkeyscan(){unchartemp; P2=0xfe; temp=P2; temp=temp&0xf0; while(temp!=0xf0) { delay1(5); temp=P2; temp=temp&0xf0; while(temp!=0xf0) { temp=P2; switch(temp) { case0xee:num=0;js++; break; case0xde:num=1;js++; break; case0xbe:num=2;js++; break; case0x7e:num=3;js++; break; } while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } } } P2=0xfd; temp=P2; temp=temp&0xf0; while(temp!=0xf0) { delay1(5); temp=P2; temp=temp&0xf0; while(temp!=0xf0) { temp=P2; switch(temp) { case0xed:num=4;js++; break; case0xdd:num=5;js++; break; case0xbd:num=6;js++; break; case0x7d:num=7;js++; break; } while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } } } P2=0xfb; temp=P2; temp=temp&0xf0; while(temp!=0xf0) { delay1(5); temp=P2; temp=temp&0xf0; while(temp!=0xf0) { temp=P2; switch(temp) { case0xeb:num=8;js++; break; case0xdb:num=9;js++; break; case0xbb:num=10; break; case0x7b:num=11; break; } while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } } } P2=0xf7; temp=P2; temp=temp&0xf0; while(temp!=0xf0) { delay1(5); temp=P2; temp=temp&0xf0; while(temp!=0xf0) { temp=P2; switch(temp) { case0xe7:num=12; break; case0xd7:num=13; break; case0xb7:num=14; break; case0x77:num=15; break; } while(temp!=0xf0) { temp=P2; temp=temp&0xf0; } } }}//**************************************************//***************pid控制voidPIDInit(structPID*pp){memset(pp,0,sizeof(structPID));//全部初始化为0}unintPIDCalc(structPID*pp){unintdError,Error,pError;Error=set_temper-Temperature;//偏差ekpError=Error-pp->LastError;//ek-e(k-1)dError=Error-2*pp->LastError+pp->PrevError;//e(k)-2*e(k-1)+e(k-2)//当前微分pp->PrevError=pp->LastError;pp->LastError=Error;return(pp->Proportion*pError+pp->Integral*Error+pp->Derivative*dError);//积分项//微分项}voidpwmint(){CCON=0x00;CL=0;CH=0;CMOD=0x04;CCAPM0=0x42;CR=1;}voidcompare_temper(){unchari;if(set_temper>Temperature)//是否设置的温度大于实际温度{if(set_temper-Temperature>50)//设置的温度比实际的温度是否是大于2度{CCAP0H=0x00;CCAP0L=0x00;//如果是,那么全速加热//rout=0;}else//如果是在2度范围内,那么运行PID计算{for(i=0;i<10;i++){rout=PIDCalc(&spid);//PerformPIDInteration}CCAP0H=255-rout;CCAP0L=255-rout;}}if(set_temper<=Temperature){CCAP0L=0xff;CCAP0H=0xff;//CCAP0L=CCAP0H;//rout=0;}}//***************************************//*************显示曲线voidxstu(uncharpian,uncharlie){unchari,zu,b,c,g,j,a;zu=(int)((Ten*10+One-15)*8/15)+5;b=7-(int)(zu/8);//页c=zu%8;//行for(g=0x80;c>1;c--) g=g>>1;if(b==7){for(i=2;i<7;i++){selectscreen(pian);setpage(i);setcolumn(lie);writedate(0x00); }selectscreen(pian);setpage(7);setcolumn(lie);writedate(g+8);}else{for(i=2;i<7;i++){ if(i==b) {selectscreen(pian);setpage(i);setcolumn(lie); writedate(g); } else{selectscreen(pian);setpage(i);setcolumn(lie); writedate(0x00); }}for(j=3;j<16;j++)//横轴左{displays(1,7,j*4,10);}for(a=0;a<16;a++){displays(2,7,a*4,10);}}}voidquxian(){if(ql==64) {if(qp==1) {ql=0; qp=2; } else {ql=13; qp=1; } }xstu(qp,ql);ql++;}//*************显示测量数据voiddisnum(uninta,unintb,unintc){intpp;display(1,0,1*8,11);display(1,0,2*8,10);display(1,0,3*8,a);display(1,0,4*8,b);display(1,0,5*8,13);display(1,0,6*8,c);pp++;if(pp==20){quxian();pp=0;}}//****显示设置温度voiddisnum1(unintx,uninty,unintz){display(2,0,1*8,12);display(2,0,2*8,10);display(2,0,3*8,x);display(2,0,4*8,y);display(2,0,5*8,13);display(2,0,6*8,z);}//******************//*****设置温度voidshewen(){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论