资源描述
内蒙古科技大学智能化仪表说明书基于热敏电阻的测温控制系统 摘要随着社会的进步和工业技术的发展,人们越来越重视温度对产品的影响,许多产品对温度范围要求严格,目前市场上普遍存在的问题有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。在这样的形式下,有了一种实时性高、精度高的温度采集系统。 本系统的温度测量采用的就是热阻效应。测温电桥的主要部分是热敏电阻。热敏电阻的主要特点是:灵敏度较高,其电阻温度系数要比金属大10100倍以上,能检测出10-6的温度变化;工作温度范围宽,常温器件适用于-55315,高温器件适用温度高于315(目前最高可达到2000),低温器件适用于-27355;体积小,能够测量其他温度计无法测量的空隙、腔体及生物体内血管的温度;使用方便,电阻值可在0.1100k间任意选择;易加工成复杂的形状,可大批量生产;稳定性好、过载能力强。 其中运算放大电路的作用就是把传感器输出的微弱的模拟信号进行一定倍数的放大,以满足A/D转换器对输入信号电平的进行各种转换处理的要求。关键字:温度传感器 ; 热敏电阻 ; A/D数模转换 目录摘要1第一章 前言和概述31.1前言31.2概述4第二章 硬件设计52.1测温模块52.1.1特点52.1.2应用原理52.1.3模块接口四线制62.2 A/D转换模块62.2.1 性能指标72.2.2 功能描述72.2.3 接口说明82.3显示模块92.4单片机模块10第三章 软件设计113.1 软件设计概述113.2 I2C简介113.3 温度显示模块程序12第四章 总结心得14参考文献15附录A 电路图16附录B 程序编程19第一章 前言和概述1.1前言在人类的生活环境中,温度扮演着极其重要的角色。无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。自18世纪工业革命以来,工业发展对是否能掌握温度有着绝对的联系。在冶金、钢铁、石化、水泥、玻璃、医药等等行业,可以说几乎80%的工业部门都不得不考虑着温度的因素。温度对于工业如此重要,由此推进了温度传感器的发展。进入21世纪后,温度传感器正朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。在工农业生产中,温度检测及其控制占有举足轻重的地位,随着现代信息技术的飞速发展和传统工业改造的逐步实现 ,能够独立工作的温度检测和显示系统已经应用于诸多领域。要达到较高的测量精度需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差等问题,使温度检测复杂化。模拟信号在长距离传输过程中,抗电磁干扰时令设计者伤脑筋的问题,对于多点温度检测的场合,各被检测点到监测装置之间引线距离往往不同,此外,各敏感元件参数的不一致,这些都是造成误差的原因,并且难以完全清除。单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,成为自动化和各个测控领域中必不可少且广泛应用的器件,尤其在日常生活中也发挥越来越大的作用。采用单片机对温度采集进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控数据的技术指标,从而能够大大提高产品的质量和数量。如最简单的温度的测量,有热电偶、光纤温度传感器等等。但是,热敏电阻是开发早、种类多、发展较成熟的敏感元器。热敏电阻由半导体陶瓷材料组成,利用的原理是温度引起电阻变化。热敏电阻器是敏感元件的一类,按照温度系数不同分为正温度系数热敏电阻器(PTC)和负温度系数热敏电阻器(NTC)。热敏电阻器的典型特点是对温度敏感,不同的温度下表现出不同的电阻值。正温度系数热敏电阻器(PTC)在温度越高时电阻值越大,负温度系数热敏电阻器(NTC)在温度越高时电阻值越低,它们同属于半导体器件。随着半导体技术的不断发展,热敏电阻作为一种新型感温元件应用越来越广泛。 1.2概述测量过程是热敏电阻随着温度的变化电阻值发生变化,然后利用精密电阻器以电压模式对热敏电阻进行线性化,由热电阻传感器测的外界温度,经过信号放大,然后送给模数转换,将原有的模拟信号转换为可以贝单片机识别和运算的数字信号,然后在通过软件编程通过显示电路显示出来当前所测得的温度。而热敏电阻具有体积小、灵敏度高、重量轻、热惯性小、寿命长以及价格便宜等优点,最重要的是作为温度传感器的热敏电阻的灵敏度非常高,这是其他测温传感器所不能比拟的. 第二章 硬件设计2.1测温模块2.1.1特点 1、灵敏度较高,其温度系数要比金属大10100倍以上,能检测出10-6的温度变化 2、温度作用宽,常温器件适用于-55315,高温器件适用温度高于315(目前最高可达到2000),低温器件适用于-27355 3、体积小,能够测量其他温度计无法测量的空隙、腔体及生物体内血管的温度 4、使用方便,电阻值可在0.1100k间任意选择 5、易加工成复杂的形状,可大批量生产 6、稳定性好、过载能力强2.1.2应用原理热敏电阻都是指半导体热电阻由于半导体热电阻温度系数要比金属大10100倍以上,能检测出10-6的温度变化,而且电阻值可在0.1100k间任意选择。所以称为热敏电阻但是热敏电阻阻值随温度变化的曲线呈非线性,而且每个相同型号的线性度也不一样,并且测温范围比较小。模块如图2.1所示。 图 2.1热敏电阻测温模块2.1.3模块接口四线制(图2.2) VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连) GND 外接GND DO 小板数字量输出接口(0和1) AO 小板模拟量输出接口 图 2.2电路图2.2 A/D转换模块介绍:PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输(图2.3)。 图 2.3 A/D转换模块 2.2.1 性能指标 1、单电源供电 2、PCF8591的操作电压范围2.5V-6V 3、低待机电流 4、通过I2C总线串行输入/输出 5、PCF8591通过3个硬件地址引脚寻址 6、PCF8591的采样率由I2C总线速率决定 7、4个模拟输入可编程为单端型或差分输入 8、自动增量频道选择 9、PCF8591的模拟电压范围从VSS到VDD 10、PCF8591内置跟踪保持电路 2.2.2 功能描述(图2.4): 1、模块芯片采用PCF8951 2、模块支持外部4路电压输入采集(电压输入范围0-5v) 4、模块集成热敏电阻,可以通过AD采集环境温度精确数值 5、模块集成1路0-5V电压输入采集 6、模块带DA输出指示灯,当模块DA输出接口电压达到一定值,会点亮 板上DA输出指示灯,电压越大,指示灯亮度越明显 图 2.4模块图2.2.3 接口说明(图2.5、2.6)本模块左边和右边分别外扩2路排针接口,分别说 明如下: 1、左边 AOUT 芯片DA输出接口 2、AINO 芯片模拟输入接口0 3、AIN1 芯片模拟输入接口1 4、AIN2 芯片模拟输入接口2 5、AIN3 芯片模拟输入接口3 图 2.5 PCF8591引脚显示 图 2.6引脚电路2.3显示模块 LED数码管(共阴极):对于单个数码管来说,从正面看,左下角那个脚为1脚,以逆时针方向依次为110脚,左上角那个脚便是10脚了,上面两个图中的数字分别与这10个管脚一一对应。注意,3脚和8脚是连通的,这两个都是公共脚,如图2.7。 图 2.7共阴极 2.4单片机模块 单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。 STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-FlashProgramableandErasableReadOnlyMemory)的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,如图2.8。 图 2.8单片机引脚显示第三章 软件设计3.1 软件设计概述软件系统初始化时把温度数据做成表格存储到ROM中,通过AD对热敏电阻两端的进行测量,然后通过运算将电压值对应于电阻值,通过查表把电阻值对应于温度值,再通过运算把温度数据送到LED显示,其中程序初始化主要是对AD和LED进行初始化,如图3.1所示。 图 3.1程序流程图 3.2 I2C简介 概念: I2C 总线支持任何IC 生产过程(CMOS、双极性)。通过串行数据(SDA)线和串行时钟 SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。LCD 驱动器只能作为接收器,而存储器则既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机。主机是初始化总线的数据传输并产生允许传输的时钟信号 的器件。此时,任何被寻址的器件都被认为是从机。 特征:1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;3、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;4、串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;5、连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。3.3 温度显示模块程序LED采用+5V电压驱动,其数据接口和读写控制引脚与STC89C52片机的I/O口直接相连。将采集到的模拟电压值经过A/D转换后送给单片机,单片机查表得到温度值,通过I/O口传输给LED显示,如图3.2所示。 图 3.2显示流程图 第四章 总结心得通过这次的课程设计实习,让我们深刻的体会到我们专业知识的重要性,还有组员之间的配合。在五周的课程设计时间里,我们从最开始的找资料,了解我们要做的是关于什么的题目,到懂得他的运作过程,到买所需要的模块和匹配的型号,再到我们自己组建我们的设计雏形,更是到我们自己调试,最后到我们写报告和上交我们的实习成果,在这个过程里,我们充分体现了自己动手的价值。当我们从热电阻测温系统到热敏电阻测温系统,从中间的一系列错误到最后的正确使用,从找不到热电阻而心急到买来热敏电阻而代替,在这个过程中,一直是我们自己解决,在这样出现问题,在解决问题,在这个独一无二的过程中,我们学会了如何看待问题的发生,再去解决它。在我们做设计的时候,首先先要选择的是硬件方面。选择硬件,要比较同类产品的稳定性、功耗、体积、价格等,另外还要符合设计的全部要求。在显示方面,就采用数码管显示的方法。其次是软件方面。把程序分块编写能够有效地提高正确性和编程效率。其中有重要的两个步骤:第一,把温度采集部分的程序调试成功,其中包括A/D转换程序。第二,把显示程序调试成功。在做完这两步后,大体上就出现了我们设计的轮廓了。参考文献1 郭艳玲,陈利军.基于AT89C52单片机的温湿度控制采集系统J.林业机械与木工设备.2007(05).2 陈杰. 传感器与检测技术M北京:高教出版社,2004.3 沙占友,王彦朋,孟志永.单片机外围电路设计.电子工业出版社,2003.4 谢宜仁.单片机实用技术问答. 人民邮电出版社,2003.5 孙传友,汉泽西.测控系统原理与设计.北京航空航天大学出版社,2002.6 章吉良,周勇,戴旭涵等微传感器原理、技术及应用M上海:上海交通大学出版社,2005.7 李全利,仲伟峰,徐军.单片机原理及应用.北京:清华大学社,2006.8 谭浩强.程序设计与开发技术.北京:清华大学出版社,1991.9 王平,刘伟. 数字温度传感器在CPU测温中的应用. 河海大学电气院自动化 系,江苏南京(210098).10 赵海兰,赵祥伟.智能温度传感器DSl8B20原理与应用.现代电子技术,2003年. 11 唐丽华.基于PASCO平台的温度信息采集.集美大学.12 刘希民.基于电流法的热电阻温度测量装置J.仪器仪表学报,2007(S1).13 李齐放,陈蕴.热敏电阻的直接积分式A/D转换原理J.三峡大学学报(自然科学版),2001(02).14 姜宇鹏,陈越惠,肖棋文.基于51单片机的数字温度计设计J.企业技术开发,2011(14).15 刘丙友,凌有铸.基于单片机AT89C52的多路温、湿度测试系统J.自动化与仪表,2007(03).附录A 电路图 附录B 程序编程#include #include/*aaaaaaaaaa#include i2c.h*/#include delay.h#define _Nop() _nop_() /定义空指令#define DataPort P0bit ack; sbit SDA=P11;sbit SCL=P10;sbit LATCH1=P20;sbit LATCH2=P23;/*- 启动总线-*/void Start_I2c() SDA=1; /发送起始条件的数据信号 _Nop(); SCL=1; _Nop(); /起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /发送起始信号 _Nop(); /起始条件锁定时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /钳住I2C总线,准备发送或接收数据 _Nop(); _Nop();/*- 结束总线-*/void Stop_I2c() SDA=0; /发送结束条件的数据信号 _Nop(); /发送结束条件的时钟信号 SCL=1; /结束条件建立时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /发送I2C总线结束信号 _Nop(); _Nop(); _Nop(); _Nop();void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /要传送的数据长度为8位 if(cBitCnt)&0x80)SDA=1; /判断发送位 else SDA=0; _Nop(); SCL=1; /置时钟线为高,通知被控器开始接收数据位 _Nop(); _Nop(); /保证时钟高电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); SDA=1; /8位发送完后释放数据线,准备接收应答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /判断是否接收到应答信号 SCL=0; _Nop(); _Nop();unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /置数据线为输入方式 for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /置时钟线为低,准备接收数据位 _Nop(); _Nop(); /时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL=1; /置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc=retc1; if(SDA=1)retc=retc+1; /读数据位,接收的数据位放入retc中 _Nop(); _Nop(); SCL=0; _Nop(); _Nop(); return(retc);void NoAck_I2c(void) SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /时钟低电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; /清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop();void DelayUs2x(unsigned char t) while(-t);void DelayMs(unsigned char t) while(t-) /大致延时1mS DelayUs2x(245); DelayUs2x(245); /sbit LATCH1=P20;/定义锁存使能端口 段锁存/sbit LATCH2=P23;/ 位锁存unsigned char code dofly_DuanMa10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 显示段码值09unsigned char code dofly_WeiMa=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/分别对应相应的数码管点亮,即位码unsigned char TempData8; /存储显示值的全局变量void Display(unsigned char FirstBit,unsigned char Num) static unsigned char i=0; DataPort=0; /清空数据,防止有交替重影 LATCH1=1; /段锁存 LATCH1=0; DataPort=dofly_WeiMai+FirstBit; /取位码 LATCH2=1; /位锁存 LATCH2=0; DataPort=TempDatai; /取显示数据,段码 LATCH1=1; /段锁存 LATCH1=0; i+; if(i=Num) i=0;/*- 定时器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响 /TH0=0x00; /给定初值 /TL0=0x00; EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /定时器开关打开/*- 定时器中断子程序-*/void Timer0_isr(void) interrupt 1 TH0=(65536-2000)/256; /重新赋值 2ms TL0=(65536-2000)%256; Display(0,8);code unsigned int vt_table=/ 电压温度对照表4132,4098,4063,4026,3988,3949,3908,3866,3823,3779,3733,3686,3639,3590,3540,3489,3437,3385,3331,3277,3222,3166,3110,3054,2997,2940,2882,2824,2767,2709,2651,2593,2536,2478,2421,2365,2309,2253,2198,2143,2089,2036,1984,1932,1881,1831,1782,1734,1686,1640,1594,1550,1506,1464,1422,1381,1341,1303,1265,1228,1192;#define AddWr 0x90 /写数据地址 PCF8591#define AddRd 0x91 /读数据地址 PCF8591extern bit ack;unsigned char ReadADC(unsigned char Chl);/*- 主程序-*/main() unsigned int num=0; unsigned char i,temp; Init_Timer0();while (1) /主循环 num=ReadADC(0);/变成mv 最大值255 。255x19=4845mv,如果增加精度可以使用浮点计算 num=num*28; for(i=0;i= vt_tablei) temp=i;/如果是前10个数据表明是负温度,需要把温度符号显示出来,并且前10位温度递增 if(i10) temp=10-temp; /如果i=0,表示-10 TempData0=0x40;/-号 else temp-=10; /如果大于等于10表明正温度,把前10个表格负温度去掉 TempData0=0x00;/符号位显示空 break; /检测到即跳出循环,否则继续循环 TempData1=dofly_DuanMatemp/10;/显示2位数温度值 TempData2=dofly_DuanMatemp%10; DelayMs(200); /延时防止采集频率过快 /*- 读AD转值程序输入参数范围从0-3返回值范围0-255-*/unsigned char ReadADC(unsigned char Chl) unsigned char Val; Start_I2c(); /启动总线 SendByte(AddWr); /发送器件地址 if(ack=0)return(0); SendByte(0x40|Chl); /发送器件子地址 if(ack=0)return(0); Start_I2c(); SendByte(AddWr+1); if(ack=0)return(0); Val=RcvByte(); NoAck_I2c(); /发送非应位 Stop_I2c(); /结束总线 return(Val); 25
展开阅读全文