1、摘 要:用单片机控制实现的测温系统,其精度高,稳定性好,并选用了美国DALLAS公司最新推出的DSl8B20一线式数字温度传感器,并给出了数字温度传感器的硬件接口电路及软件设计方法,通过发光数码管显示温度。关键词:STC89C52;DSl8B20;测温;1 引言随着现代信息科技的飞速发展和传统工业改造的逐步实现,能够独立工作的温度检测和显示系统已经应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件,热敏电阻成本低,但需要接信号处理电路,而且热敏电阻的可靠性较差,测量温度的准确度低,检测系统的精度差。而今电子技术和微型计算机的迅速发展,采用单片机进行温度检测、数值显示和数据的传送,具有效率高
2、、性能稳定等优点,还可以实现实时实地控制等技术要求,在工业生产中应用越来越广泛。2 技术要求在三位数码管上显示当前采集到的环境温度,并精确到0.1度。3 方案论证3.1 恰当地选择温度传感器方案1:用热敏电阻做为温度传感器。通过采集各个时间内的电压,进行A/D转换,经过电压与温度的转换、校准,测量出温度。方案2:用DS18B20数字式温度传感器。DS18B20是DS1820的换代产品,它与传统的热敏电阻温度传感器不同,它能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。其内部集成了温度的传感器及A/D转换模块,通过读取片内数据,测量出温度。 由于用热敏电阻作为温
3、度传感器误差较大,可靠性相对较差,且不方便调试校准;而DS18B20测量精度高,集成度高,方便调试,线路简单。所以本设计采用方案2。 3.2 显示器件的选择方案1:采用液晶显示,此种显示方式,液晶耗电量少,能显示复杂的符号图形。方案2:采用发光数码管显示,此种显示亮度高,且编程简单。考虑到本系统显示简单,液晶价格贵且亮度低,所以选用方案2。4 硬件设计4.1 关于单片机单片机是一种集成电路,即采用大规模集成电路技术把具有数据处理能力的CPU(中央处理器)、随机存储器RAM(random access memory )、只读存储器ROM(Read-Only Memory )、多种I/O口和中断系
4、统、定时器/计时器等功能,还可以包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路,集成到一块硅板上构成的一个小而精密的计算机系统。 我选用的单片机是stc89c52,它是深圳宏晶科技生产的,具有低功耗高性能的优点。并且有 8K 在系统可编程Flash 存储器, 512字节数据存储空间,内带4K字节EEPROM存储空间。4.2 系统结构图4.2.1 了解51单片机的内部系统结构图4.1.1单片机的内部系统结构 其中,较为重要的是串行端口。串行通信是数据的各位在同一根数据线上依次逐位发送或接收。P3.0口的第二功能是串行数据的输入口(RXD),p3.1口的第二功能是串行数据的输出
5、口(TXD)。4.2.2 根据设计要求,画出外部系统结构图电路总图见附录一图4.2.2 外部系统结构图4.3 温度传感器模块4.3.1 DS18B20温度传感器介绍DS18B20是美国Dallas半导体公司生产的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易兼容微处理器等优点,可直接将温度传感器转化成串行数字信号供处理器处理。4.3.2 DS18B20温度传感器特性(1) 适应电压范围宽,电压范围在3.05.5V,在寄生电源方式下可由数据线供电。(2) 独特的单线接口方式,他与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通信。(3)
6、 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。(4) 在使用中不需要任何外围元件,全部传感元件及转换电路形如多只三极管的组成电路。(5) 测温范围-55C +125C,在-10C +85C时精度为正负0.5C。(6) 可编程分辨率为912位,对应的可分辨温度分别为0.5C,0.25C,0.125C,0.0625C,可实现高精度测温。(7) 在9位分辨率时,最多在93.75ms内把温度转换数字;12位分辨率时,最多在750ms内把温度值转换为数字,显然速度很快。(8) 测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强
7、的抗干扰能力。CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。(9) 负压特性。电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。4.3.3 引脚介绍DS18B20实物图如图所示。图4.3.3 DS18B20实物图 4.3.4 DS18B20与单片机的连接主机可以是微控制器,从机可以是单总线器件,他们之间的数据交换只通过一条信号线。当只有一个从机设备时,系统可按单节点系统操作;当有多个从机设备时,系统则按多节点系统操作。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以
8、允许设备在不发送数据时能释放总线,而让其他设备使用总线。单总线通常要求外接一个约为5k的上拉电阻,如图所示。 图4.3.4 DS18B20和单片机的连接从图可以看出,DS18B20和单片机的连接非常简单,单片机只需要一个I/O口就可以控制DS18B20。这个图的接发是单片机与一个DS18B20通信,如果要控制多个DS18B20进行温度采集,只要将所有DS18B20的I/O口全部连接到一起就可以了。在具体操作时,通过读取各个DS18B20内部芯片的序列号来识别。4.3.5 DS18B20的工作原理硬件电路连接好以后,对于单片机需要怎样工作才能将DS18B20中的温度数据读取出来,下面将给出详细分
9、析。其控制DS18B20的指令:33H读ROM。读DS18B20温度传感器ROM中的编码(即64位地址)。44H操作RAM。发送温度转换命令,结果存入9字节RAM。55H匹配ROM。发出此命令后,接着发出64位ROM编码,访问单总线上与该编码对应的DS18B20并使之作出响应,为下一步对该DS18B20的读/写做准备。F0H搜索ROM。用于确定挂接在同一总线上DS18B20的个数,识别64位ROM地址,为操作各器件做好准备。CCH跳过ROM。忽略64位ROM地址,直接向18B20发温度变换命令,适用于一个从机工作。ECH告警搜索命令。执行后只有温度超过设定值上限或下限的芯片才作出响应。以上这些
10、指令涉及的存储器是64位光刻ROM,表1列出了它的各个定义。表1 64位光刻ROM各位定义8位48位8位CRC码序列号产品类型编号64位光刻ROM中的序列号是出厂前被光刻好的,他可以看做该DS18B20的地址序列码。其各位排列顺序是:开始8位为产品类型标号,接下来48位是该DS18B20自身的序列号,最后8位是前56位的CRC循环校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一条总线上接挂多个DS18B20的目的。4.3.6 DS18B20的工作时序图下图为时序图中各个总线状态。图4.2.6 时序图中各个总线态 (1)初始化时序图如下
11、图5所示。先将数据线至高电平1.图(1) DS18B20初始化时序图 数据线拉到低电平0。 延时(该时间要求不是很严格,但是要尽可能短一点 延时750s(该时间范围可在480960s)。 数据线拉到高电平1。 延时等待。如果初始化成功则在1560s内产生一个由DS18B20返回的低电平0,据该状态可以确定温度传感器ds18b20的存在。但是应注意,不能无限地等待,不然会使程序进入死循环,所以要进行超时判断。若CPU读到数据上的低电平0后,还要进行延时,延时的时间从发出高电平算起(第步的时间算起)最少要480s。将数据线再次拉到高电平1后结束。(2)DS18B20写数据时序图如下图6所示。写数据
12、步骤:数据线先置低电平0。掩饰确定的时间为15s。按从低位到高位的顺序发送数据(一次只发送一位)。延时时间为45s。将数据线拉到高电平1。重复循环步骤,直到发送完整个字节,注意最后将数据线拉到高位1。图(2) DS18B20写数据(1) DS18B20读数据时序图如下图7所示。图(3) DS18B20读数据 (3)DS18B20写数据时序图如上图所示。写数据步骤: 将数据线拉高到1. 延时2s。 将数据线拉低到0. 延时6s。 将数据线拉高到1。 延时4s。 读数据线的状态得到一个状态位,并进行数据处理。重复步骤,直到读取完一个字节后延时30us。时序图见上图。4.4 显示模块采用三位一体共阴
13、数码管显示温度,数码管驱动使用锁存器74hc573。采用动态显示的原理,故段选和位选都用p0口,通过p2.6口和p2.7口确定位或者段的选通,接法见附录电路原理图。5 软件设计5.1 总程序流程图 总程序流程图如下图所示。图5.1 总程序流程图5.2 程序设计其源程序见附录三。6 安装调试安装调试时,数码管会出现亮度不均匀或是数码管中有个别不显示的现象,经检查发现产生这种原因的可能是因为焊接的时候有虚焊、选用的上拉电阻阻值过大,或是接元器件的时候无意间把锁存器控制位导线弄断所导致。6.1 数码管引脚的判断用5v的直流电源串电阻接在数码管十二个引脚上,可以判断出各个引脚代表哪一段和哪一位,其中6
14、号引脚不起作用。哪个是6号引脚呢?让三位数码管正对自己右下角的引脚为1号引脚,逆时针依次为2、3、4、5、6、7、8、9、12号引脚。判断出它的内部电路图如下图所示。图6.1 数码管内部电路图6.2 排除故障 6.2.1 排除逻辑故障 这类故障往往由于设计和连线过程中工艺性错误所造成的。主要包括错线、开路、短路。排除的方法是首先将加工的电路板认真对照原理图,看两者是否一致。应特别注意电源系统检查,以防止电源短路和极性错误,必要时利用数字万用表的短路测试功能,可以缩短排错时间。6.2.1 排除元器件失效 造成这类错误的原因有两个:一个是元器件买来时就已坏了;另一个是由于安装错误,造成器件烧坏。可
15、以采取检查元器件与设计要求的型号、规格和安装是否一致。在保证安装无误后,用替换方法排除错误。6.2.3 排除电源故障 在通电前,一定要检查电源电压的幅值和极性,否则很容易造成集成块损坏。加电后检查各插件上引脚的电位,一般先检查VCC与GND之间电位,若在5V4.8V之间属正常。若有高压,联机仿真器调试时,将会损坏仿真器等,有时会使应用系统中的集成块发热损坏。7 结论本文较详细的阐述了温度测量装置设计的整体方案与软件实现。DS18B20的优势在于集温度测量、A/D转换为一体,具有单总线结构,数字量输出,直接与单片机接口等优点,温度读取简单、直观,硬件和软件的开发过程简单,因此可用它组成单路或多路
16、温度测量装置,有一定的使用和推广价值。当然,在这个过程中我遇到了很多问题,有的是我看书、上网查资料解决的,有的是同过李研达老师、同学的帮助解决的,在这里还得感谢他们的支持与厚望。参考文献1刘华东等编.单片机原理与应用M.北京:电子工业出版社,20082 吴金戌等编.8051单片机实践与应用M.北京:清华大学出版社,20013张毅刚等编.单片机原理及应用M.北京:高等教育出版社,2003Based on the digital thermometer 51 MCU designZhang Zhao Yuan(School of Physics and Electrical Engineering
17、 , Anyang Normal University, Anyang, Henan 455000)Abstract: with the realization of single-chip microcomputer control temperature measuring system, its high accuracy, good stability, and select the DALLAS company latest DSl8B20 a line in the digital temperature sensor is presented, and digital tempe
18、rature sensor hardware interface circuit and the software design method, through the digital luminescence tubes to display temperature. Keywords: STC89C52;DSl8B20;Temperature measurement;附录一 电路原理图 附录二 面包板图附录三 源程序#include #define uchar unsigned char#define uint unsigned intsbit DS=P22; /define interf
19、ace,确定接口uint temp; / variable of temperature,温度变量为无符号整形uchar flag1; / sign of the result positive or negative,结果是否生效标志sbit dula=P26; /数码管段选sbit wela=P27; /数码管位选unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/显示的依次是0funsigned char code table1
20、=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef;/显示的依次是0.9.void delay(uint count) /延时子程序 uint i; while(count) i=200; while(i0) /延时约1ms i-; count-; /功能:串口初始化,波特率9600,方式1/void Init_Com(void) TMOD = 0x20; /GATE CT M1 M0 GATE CT M1 M0 /定时T1 工作方式2 PCON = 0x00; /SMOD 波特率倍增位,PCON=0X01时倍增 /电源控制寄存器 SCON
21、= 0x50; /SM0 SM1 SM2 REN TB8 RB8 TI RI /串行控制寄存器 TH1 = 0xFd; TL1 = 0xFd; TR1 = 1;void dsreset(void) /send reset and initialization command/发送初始化及复位信号 /*为了识别已连接到单总线上的数字温度传感器*/ uint i; DS=0; i=103; while(i0)i-;/480us960us /*处理器先向DS18B20发送一个持续480960us的低电平信号*/ DS=1; /*然后进入输入模式释放总线*/ i=4; while(i0)i-; /15
22、60us /*在检测到I/O引脚上升沿之后,等待1560us*/ /*如果由DS18B20所返回的低电平持续时间少于60us,则表示就绪信号无效。主机要重新发送初始化时间序列*/* 读取数据的一位,满足读时隙要求 */bit tmpreadbit(void) /read a bit/read a bit 读一位 / DS18B20的读时序:分为读0时序和读1时序两个过程 uint i; / 对于DS18B20的读时隙是从主机把单总线拉低之后, bit dat; /dat的取值为0、1。/ 在15微秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。 DS=0;i+; /i+ for
23、delay小延时一下 / DS18B20在完成一个读时序过程,至少需要60us才能完成。 DS=1;i+;i+;/ 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效 dat=DS; i=8;while(i0)i-; return (dat);/* 读取数据的一个字节 */uchar tmpread(void) /read a byte date,读数据的一个字节 uchar i,j,dat; dat=0; for(i=1;i=8;i+) j=tmpreadbit(); dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里 return(dat);/
24、将一个字节数据返回/* 写数据的一个字节,满足写1和写0的时隙要求 */void tmpwritebyte(uchar dat) /write a byte to ds18b20,向传感器写入一个字节/DS18B20的写时序:写0时序和写1时序两个过程 /写一个字节到 DS18B20 里 / uint i; uchar j; bit testb; for(j=1;j1; 取下一位(由低位向高位) if(testb) /write 1/ 对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线
25、上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得使单总线变高,整个写1时隙不低于60us。 DS=0; /产生写0时隙的过程:MCU拉低总线后,只要在整个时隙期间保持低电平即可(至少60US) i+;i+; DS=1; i=8;while(i0)i-; else DS=0; /write 0 i=8;while(i0)i-; DS=1; i+;i+; void tmpchange(void) /DS18B20 begin change dsreset(); delay(1); tmpwritebyte(0xcc); / address all drivers on bus,
26、 /允许MCU不提供64位ROM编码就使用存储器操作命令,在单点总线情况下节省时间 tmpwritebyte(0x44); / initiates a single temperature conversion/(操作RAM)发送温度转换命令,结果存入9字节RAM。 /uint tmp() /get the temperature float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); /发送读取数据命令 ,读内部RAM9字节的内容 a=tmpread(); b=tmpread(); t
27、emp=b; temp0;a-) for(b=60;b0;b-); void display(uint temp)/显示程序 uchar A1,A2,A2t,A3,ser; ser=temp/10; /分离出三位要显示的数字 SBUF=ser; A1=temp/100;/ A2t=temp%100; A2=A2t/10; A3=A2t%10; dula=0; P0=tableA1;/显示百位 dula=1; dula=0;wela=0; P0=0x7e; wela=1; wela=0; delay(1); dula=0; P0=table1A2;/显示十位 dula=1; dula=0; we
28、la=0; P0=0x7d; wela=1; wela=0; delay(1); P0=tableA3;/显示个位 dula=1; dula=0;P0=0x7b; wela=1; wela=0; delay(1);void main() uchar a; Init_Com(); do tmpchange(); / delay(200);for(a=10;a0;a-) display(tmp(); while(1);附录四 元件清单名称参数个数单片机stc89c52直插封装 DIP401ds18b201排阻10k1瓷片电容22p274hc573DIP202无源晶振11.0592HZ1极性电容10u1色环电阻2.7k/10k1/1三位共阴数码管5361AH1 . 第16页