温度控制系统设计.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流温度控制系统设计.精品文档.温度控制系统摘要:随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计论述了一种以STC89C52单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。系统设计了相关的硬件电路和相关应用程序。硬件电路主要包括STC89C52单片机最小系统,测温电路、实时时钟电路、LCD液晶显示电路以及通讯模块电路等。系统程序主要包括主程序,读出温度子程序,计算温度子程序、LCD显示程序以及数据存储程序等。关键词:STC89C52, DS18B20,LCD Abstract:Along with the computer measurement and control technology of the rapid development and wide application, based on singlechip temperature gathering and control system development and application greatly improve the production of temperature in life level of control. This design STC89C52 describes a kind of mainly by MCU control unit, for temperature sensor DS18B20 temperature control system. The control system can real-time storage temperature data and record related to the current time. System design related hardware circuit and related applications. STC89C52 microcontroller hardware circuit include temperature detection circuit smallest system, and real-time clock circuit, LCD display circuit, communication module circuit, etc. System programming mainly include main program, read temperature subroutine, the calculation of temperature subroutines, LCD display procedures and data storage procedures, etc.Keywords: STC89C52, DS18B20,LCD目 录1前言12总体方案设计22.1方案设计22.2方案论证32.3方案选择33单元模块的设计43.1单片机模块43.2 18B20温度模块53.3显示器模块64软件设计74.1 系统总框图74.2温度采集子程序85系统功能与调试方法介绍95.1系统功能9 5.2系统指标. .95.3系统调试96参考文献10附录1: 相关设计图.11附录2:元器件清单.13附录3:源程序. .141前言 工业控制是计算机的一个重要应用领域,计算机控制系统正是为了适应这一领域的需要而发展起来的一门专业技术,它主要研究如何将计算机技术、通过信息技术和自动控制理论应用于工业生产过程,并设计出所需要的计算机控制系统。随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平。本设计就是基于单片机STC89C52温度控制系统的设计,通过本次课程实践,我们更加的明确了单片机的广泛用途和使用方法,以及其工作的原理。2总体方案设计 2.1方案设计 方案一: 采用热敏电阻作为温度检测模块,热敏电阻是半导体材料,随着温度的改变,其阻值也不一样,因此可作为温度检测传感器。 方案二:采用DS18B20作为温度传感器采集温度,18B20是总线结构,结构简单精度高。其原理如下图:图2.1数字温度计原理图2.2方案论证方案一:这种方法电路设计比较困难,电阻值的改变要通过电压反映,电压要用AD采集,输出的数字量再转化成温度,设计较复杂。方案二:这种方法实现起来比较容易,传感器可以和单片机直接进行通信,将电压采集回来,电路简单,精度较高。2.3方案选择通过上述论证比较,我们最终选择方案二。方案二通过单片机输出通过简单可行的时序指令给18B20,18B20将温度采样量化后直接传给单片机,单片机再做简单的处理后将温度计算出来,最后将温度显示出来。通过简单可行的方法完成了设计,不仅成本低廉,而且可以方便的显示当前工作状态。本方案较圆满的完成了设计的要求。3单元模块的设计3.1单片机模块本次设计选用的单片机芯片是STC89C52单片机。STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶休或陶瓷谐振器一起构成自激振荡器。外接石英晶体(或陶瓷诺振器)及电容C1, C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1, C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,这里选择使用石英晶休,我们的电容使用22pF。如使用陶瓷谐振器的话,应选择40pF士10pF的容值的电容。也可以采用外部时钟。采用外部时钟的电路的情况时,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。 图3.1单片机最小系统(1)主电源引脚(2根) VCC(Pin40):电源输入,接5V电源GND(Pin20):接地线(2)外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端(3)控制引脚(4根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(Pin30):地址锁存允许信号PSEN(Pin29):外部存储器读选通信号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。(4)可编程输入/输出引脚(32根)AT89S51单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32 根。每一根引脚都可以编程。 PO口(Pin39Pin32):8位双向I/O口线,名称为P0.0P0.7P1口(Pin1Pin8):8位准双向I/O口线,名称为P1.0P1.7 P2口(Pin21Pin28):8位准双向I/O口线,名称为P2.0P2.7 P3口(Pin10Pin17):8位准双向I/O口线,名称为P3.0P3.73.2 18B20温度模块 本次试验选择的温度传感器是DS18B20,DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:(1)系统的特性:测温范围为-55+125 ,测温精度为士0.5;温度转换精度912位可变,能够直接将温度转换值以16位二进制数码的方式串行输出;12位精度转换的最大时间为750ms;可以通过数据线供电,具有超低功耗工作方式。(2)系统成本:由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右。(3)系统复杂度:由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。(4)系统的调试和维护:由于引线的减少,使得系统接口大为简化,给系统的调试带来方便。同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强,因此,减少了系统的日常维护工作。DS18B20温度传感器只有三根外引线:单线数据传输总线端口DQ ,外供电源线VDD,共用地线GND。DS18B20有两种供电方式:一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短。电路如图3.2。图3.2温度传感器接口3.3显示器模块显示模块采用LCD1602液晶显示器。LCD1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,每一个字符都有一个固定的代码,因此使用简单,显示效果良好。电路如图3.3。图3.3 1602显示接口4软件设计4.1 系统总框图图4.1 系统总框图4.2温度采集子程序图4.2按键子程序框图5系统功能与调试方法介绍5.1系统功能该系统能够准确的检测到环境温度,精度达到两位小数,反应迅速,测量范围广泛,出错率低。5.2系统指标温度判断结果显示指示25度低于安全值LOW35 度处于安全范围SUIT45度高于安全值HIGH5.3系统调试单片机发送初始化时序,使传感器初始化,然后再发送温度采集指令,采集完毕后给单片机返回结束信号,单片机开始读取温度信息,进行转换后显示出来。硬件调试时,主要是给单片机上电,检查各部分电路是否正常,是否存在虚焊的情况。各器件逻辑连接是否正确。软件调试时先搭建程序框架,先写ds18b20程序,检测其是否能够将温度采集出来,调试该部分可用串口将数据传送到电脑上来,观察是否正确。温度采集正确后,调试LCD1602显示模块,将数据显示到该显示器上。最后将判断语句加上,其运行状态显示到1602上。6参考文献1 徐爱钧,智能化测量控制仪表原理与设计,北京航空航天大学出版社,20042 徐爱钧,Keil Cx51 V7.0单片机高级语言编程与u Vision2应用实践,电子工业出版社,2004.3 刘乐善.微型计算机接口技术及应用M.北京:北京航空航天大学出版社,2001.258264.4 童诗白.模拟电路技术基础M.北京:高等教育出版社,2000.171202.5 杜华.任意波形发生器及应用J.国外电子测量技术,2005.1:3840.6 张友德.单片微型机原理、应用与实践M.上海:复旦大学出版社,2004.4044. 7 程朗.基于8051单片机的双通道波形发生器的设计与实现J.计算机工程与应用,2004.8:100103.8 张永瑞.电子测量技术基础M.西安:西安电子科技大学出版社,2006.61101.9 李叶紫. MCS-51单片机应用教程M.北京:清华大学出版社,2004.232238.10 周润景等,基于PROTEUS的电路的及单片机系统设计与仿真,北京航空航天大学出版社,2006附录1:相关设计图附录2:元器件清单表序号元件名称型号参数封装数量1单片机AT89C51PDIP12温度传感器Ds18b20TO-9213电阻10K色环44底座40脚15晶振11.0592M16陶瓷电容22pf27电解电容10uf18排针409排线25101602液晶QC1602A1附录3:源程序#include <REGX52.H>#include "1602.h"#include "18b20.h"#define uchar unsigned char#define uint unsigned intsbit tem_high=P10;sbit tem_low=P11;uchar code table1="Temp:"/LCD第一行显示 uchar code table2="zhaungtai:"/LCD第二行显示 uchar code table3='0','1','2','3','4','5','6','7','8','9' uchar code high="high!"uchar code low="low!"uchar code suit="suit!"uint sdate;/测量到的温度的整数部分uint gewei,shiwei;uchar xiaoshu1;/小数第一位uchar xiaoshu2;/小数第二位int i; void main() init(); /初始化18b20函数 SET_int();/初始化1602; xianshi(table1,5,table2,10); while(1) readtemp();SET_code(0x80+6); SET_data('+'); SET_code(0x80+7); SET_data(table3shiwei); SET_code(0x80+8); SET_data(table3gewei); SET_code(0x80+9); SET_data('.'); SET_code(0x80+10); SET_data(table3xiaoshu1); SET_code(0x80+11); SET_data(table3xiaoshu2); if(sdate>40) SET_code(0x80+0x40+11); for(i=0;i<5;i+) SET_data(highi); tem_high=0; tem_low=1; else if(sdate<30) SET_code(0x80+0x40+11); for(i=0;i<5;i+) SET_data(lowi); tem_low=0; tem_high=1;else SET_code(0x80+0x40+11); for(i=0;i<5;i+) SET_data(suiti); tem_low=1; tem_high=1;#include <REGX52.H>#include "1602.h"void _delay_ms(int ms)int i,j;for(i=111;i>0;i-) for(j=0;j<ms;j+);/*写指令*参数为l602指令 查数据手册void SET_code(int com)/写指令 W_code(); P2=com; _delay_ms(5); EN=1;/ LCDEN(); _delay_ms(5); NLCDEN;void SET_data(int mydata)/写数据 W_data(); P2=mydata; _delay_ms(5); LCDEN; _delay_ms(5); NLCDEN;void SET_int()/初始化1602; LCDEN; SET_code(0x38); /设置显示模式 SET_code(0x0C); /设置开显示 不显光标 SET_code(0x06); /写一个字符后地址指针自动加1 SET_code(0x01); / 清屏/*显示函数*参数:X,Y为第一行和第二行要显示字符串首地址 m,n为字符串长度 void xianshi(char *X,int m,char *Y,int n ) int i; SET_code(0x80); /第一行首地址 for(i=0;i<m;i+) SET_data(Xi); SET_code(0x80+0x40);/第二行首地址 for(i=0;i<n;i+) SET_data(Yi); /*显示函数*参数:X,为第一行要显示字符串首地址 m为字符串长度 n为显示到第几格 的位置 void xianshi_one(char *X,int m,int n ) int i; SET_code(0x80+n); /第一行首地址 for(i=0;i<m;i+) SET_data(Xi); void xianshi_two(char *X,int m,int n ) int i; SET_code(0x80+40+n); /第二行首地址 for(i=0;i<m;i+) SET_data(Xi);#include <REGX52.H>#include "18b20.h"uchar tempL=0; /设全局变量uchar tempH=0; extern uint sdate;/测量到的温度的整数部分extern uint gewei,shiwei;extern uchar xiaoshu1;/小数第一位extern uchar xiaoshu2;/小数第二位uchar xiaoshu;/两位小数sbit ds=P13; /连接DS18B20void delay_18b20(uchar i)/这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时 for(i;i>0;i-);void init() /初始化函数 uchar x=0; ds=1; delay_18b20(8); ds=0; delay_18b20(80); ds=1; delay_18b20(5); x=ds; delay_18b20(40); ds=1;/*读一个字节*/uchar read_onechar() uchar i,date; for(i=8;i>0;i-) ds=1; delay_18b20(1); ds=0; delay_18b20(1); ds=1; date=date>>1; if(ds=1) date=date|0x80; delay_18b20(4); return(date);/*写一个字节*/void write_onechar(uchar date) uchar i; for(i=8;i>0;i-) ds=0; delay_18b20(1); ds=date&0x01; delay_18b20(5); ds=1; date=date>>1; if(ds=1) date=date|0x80; delay_18b20(4);/*读取温度*/void readtemp() init(); write_onechar(0xcc); write_onechar(0x44); delay_18b20(150); init(); write_onechar(0xcc); write_onechar(0xbe); tempL=read_onechar(); tempH=read_onechar(); sdate = tempL/16+tempH*16; /整数部分 shiwei=sdate/10; gewei=sdate%10; xiaoshu1 = (tempL&0x0f)*10/16; /小数第一位 xiaoshu2 = (tempL&0x0f)*100/16%10;/小数第二位 xiaoshu=xiaoshu1*10+xiaoshu2; /小数两位