1、目 录摘要1引言.12 结构设计及方案论证.22.1 温度检测系统总体设计思路.2 2.1.1 主控制器.2 2.1.2 显示电路.22.1.3 温度传感器.22.1.4 PC实时显示界面.22.2 温度检测系统方案论证.32.2.1 系统方案选择.32.2.2 单片机的选择.33 系统硬件设计部分.43.1 AT89C51简介.43.2 DS18B20传感器简介.73.3 硬件电路设计.114 系统软件设计部分.134.1 下位机软件设计.134.1.1 主程序.134.1.2 读出温度子程序.134.1.3 计算温度子程序.144.1.4 温度转换命令子程序.154.1.5 显示数据刷新子
2、程序.154.2 下位机程序.164.3 上位机软件设计.194.4 上位机程序.205 软硬件调试部分.245.1 软件调试.245.2 硬件调试.26结束语.27致谢.28参考文献.29附录.30附录一 下位机程序.30附录二 上位机程序.34附录三 PROTEUS仿真图.48附录四 VB软件界面及操作.50摘 要本文介绍了一种利用单片机实现温度数据的采集和处理的一种设计方法。其中涉及了传感器,数据采集,单片机数据处理,单片机和PC机通讯VB等一系列相关理论。本文就如何将温度这一连续的物理量转换成模拟的电压信号,再将电压信号通过单片机编码转换成数字信号这一过程,进行了阐述和分析。并且增加了
3、报警电路。同时在通过软件进行温度补偿和数据处理方面,也作为了具体介绍。在硬件电路设计方面,从电路的简单,可靠数字化,低成本等角度出发,设计者采用了硬件滤波软件补偿两方面入手,使得设计达到所需精度要求,具有较高的性能价格比。根据串行通讯原理,设计了单片机与PC机的接口电路,建立了单片机与PC机之间的串行通讯协议,并利用VB6.0对测温系统实现了对象化操作将采集到的温度信号编码进行接受和描述,将其直接显示在可视的界面当中。该测温系统具有实时存储功能,便于对信号进行分析和处理。在对实测信号进行分析的过程中发现,实测信号编码与理论上的信号编码基本呈线形关系,这说明了系统具有很高的精确度和稳定性。完成了
4、对每个通道的实测信号编码值与温度的实时曲线的绘制,如果再实现对各个通道建立独立的数据库,即可达到对每个通道的温度标定的目的。关键词:温度 AT89C51 DS18B20 VB6.0 MSCOMM控件1 引言随着科技的发展,在各个领域都要用到数据采集系统,其中就包括最普遍的温度的数据采集。传统的温度采集方法费时且精度较差,而如今各个行业对温度数据的要求越来越高,如科研实验室,因此新型的数字温度计大量出现,其中最普遍的是使用传感器和单片机组成采集电路就可以 获得较高的精度要求。在这种背景下,选择基于VB6.0的数据采集系统这个课题具有很大的现实意义,用VB编写上位机程序,在PC上通过图形界面就能控
5、制下位机即单片机采集温度数据信号,设计直观大方,使用DS18B20高灵敏度的温度传感器采集温度数据,再用AT89C51处理数据,由7位共阳极的LED数码管显示当前温度,并且可以通过串口向上位机传送数据,显示实时温度曲线和把数据存入数据库中,方便查询历史温度记录。读数方便,测量范围广,测温准确。硬件电路较简单,所以软件设计较复杂,DS18B20只有一个数据口,所以它的读写程序对时序有很高的要求。在整个采集系统中,包括温度采集程序,串口通信程序,和上位机VB的程序,数据库等等几个部分,为了避免干扰,当上位机VB界面点击“采集温度”时,向下位机发送特定字符,当下位机识别正确字符,才将温度数据传送给上
6、位机。此外在设计要求的基础上,还做了一定程度的功能扩展,使用蜂鸣器来判断温度传感器是否工作正常,并且在图形界面上可以显示历史平均温度,最大温度,最小温度。可以选择串口和波特率满足不同要求,设置采集间隔时间,显示不同时间范围的温度满足不同场合的测温要求。硬件简单,成本也低。在设计过程中,对整个系统硬件和软件的分析,采用模块化程序设计的方法,流程图分析设计思路,将系统分成几个模块,最终进行整合,从而实现了基于VB6.0的数据采集系统的设计。2 结构设计及方案论证2.1 温度检测系统总体设计思路设计一个基于Visual Basic 6.0的数据采集系统。总体设计方框图如图2.1所示,控制器采用单片机
7、AT89C51,温度传感器采用DS18B20,用8位LED数码管以串口传送数据实现温度显示并通过串口与上位机PC通讯,把数据传送给上位机,并用VB编写的图形界面把温度的变化曲线显示出来,并通过数据库存储,可查询历史温度记录。单片机LED显示温 度 传 感 器复位电路时钟振荡蜂鸣器图2.1总体设计框图2.1.1主控制器单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。2.1.2显示电路显示电路采用8位共阳极LED数码管,从P0口输出段码,P2口为LED的位选信号。2.1.3温度传感器采用DS18B
8、20温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。2.1.4 PC实时显示界面显示实时温度数据变化曲线的界面,采用VB6.0编辑,在程序使用VB6.0的通用串口控件MSCOMM来对发送到串口的数据进行采集处理。上下位机定义好通信协议和波特率。2.2 温度检测系统方案论证2.2.1系统方案选择由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。进而考虑到用温度
9、传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。2.2.2单片机的选择对于单片机的选择,如果用8031系列,由于它没有内部RAM,系统又需要大量内存存储数据,因而不可用;AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机
10、的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。3 系统硬件设计部分3.1 AT89C51简介 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS处理器,俗称
11、单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 图3.1 AT89C51管脚图主要特性:与MCS-51 兼容4K字节可编程闪烁存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:0Hz-24Hz三级程序存
12、储器锁定128*8位内部RAM32可编程I/O线两个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路 管脚说明:VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高
13、,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高
14、八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同
15、时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE
16、禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出
17、。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。芯片擦除:整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统
18、仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。3.2 DS18B20传感器简介DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。DS18B20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信;多个DS18B20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.05.5;零待机功耗;温度以9或12位数字;用户可定义报警设置;报警搜索命令识别并标
19、志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; DS18B20采用脚PR35封装或8脚SOIC封装,其内部结构框图如图3.2所示。64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。温度报警触发器和,可通过软件写入户报警上下限。 C64 位ROM和单线接口高速缓存存储器与控制逻辑温度传感器高温触发器TH低温触发器TL配置寄存器8位CRC发生器Vdd图3.2 DS18B20内部结构图DS18B20温度传感器的内部存
20、储器还包括一个高速暂存和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节的存储器,结构如图3.3所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3.4所示。低5位一直为,是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。温度 LSB温度 MSBTH用户字节1TL用户字节2配
21、置寄存器保留保留保留CRC图3.3 高速暂存RAM结构图图3.4 DS18B20字节定义由表3.1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。 表3.1 DS18B20温度转换时间表高速暂存的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有字节的CRC码,可用来检验数据,从而保证通信数据的正确性。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高
22、位在后,数据格式以0.0625LSB形式表示。当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表3.2是一部分温度值对应的二进制温度数据。表3.2 一部分温度对应值表温度/二进制表示十六进制表示+1250000 0111 1101 000007D0H+850000 0101 0101 00000550H+25.06250000 0001 1001 00000191H+10.1250000 0000 1010 000100A2H+0.50000 0000 0000 00100008H0000
23、0 0000 0000 10000000H-0.51111 1111 1111 0000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 0110 1111FE6FH-551111 1100 1001 0000FC90HDS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若TTH或TTL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM前56位来计算CRC值,并
24、和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将55所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在55所对应的一个基数值。减法计数器1对低温度系数晶振产生的
25、脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。3.3 硬件电路设
26、计系统整体硬件电路包括,传感器数据采集电路,温度显示电路,报警电路,单片机主板电路等,如图3.5所示图3.5 电路设计原理图温度传感器的数据线接单片机的P3.3口,单片机通过反复读写P3.3口的状态采集数据,不过硬件简单,软件肯定复杂,读写时都有严格的时序要求。显示电路采用8个共阳极的LED显示,显示代码由P0口发送,当使用P0口时需要接上拉电阻,P2口的逻辑状态作位选线信号,达到分时选通的目的,当相应口为高电平时LED才能显示相应代码。实际使用中只用到七个LED,最后2个用来显示摄氏度符号,第二个用来显示温度的正负,当温度为负时,显示“”号,为正时不显示,同样由软件可以实现,当百位为零时,百
27、位不显示,百位十位为零时,百位十位都不显示,这样设计方便观察,更加直观。此外还接有蜂鸣器,当DS18B20不能正常工作时可以达到报警的目的。最后还要实现单片机与上位机通信的功能,所以要连接好串口,以便能向上位机发送或接受数据。按健复位电路是最简单的手动复位,使用比较方便,在程序跑飞时,以手动复位,这样就不用在重起单片机电源,就可以实现复位。4 系统软件设计部分4.1下位机软件设计系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。4.1.1主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次
28、。这样可以在一秒之内测量一次被测温度,其程序流程见图4.1所示。初始化调用显示子程序1S到?初次上电读出温度值温度计算处理显示数据刷新发温度转换开始命令的法国风格 法国 NYNY 图4.1 主程序流程图4.1.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图4.2所示Y发DS18B20复位命令发跳过ROM命令发读取温度命令读取操作,CRC校验9字节完?CRC校验正?确?移入温度暂存器结束NNY 图4.2 读流程图 4.1.3 计算温度子程序计算温度子程序将RAM中读取值进行转换运算,并进行温度值正负的判定
29、,其程序流程图如图4.3所示。 开始温度零下?温度值取补码置“”标志计算小数位温度值 计算整数位温度值 结束置“+”标志NY发DS18B20复位命令发跳过ROM命令发温度转换开始命令 结束图4.3 计算温度流程图 图4.4 温度转换流程图4.1.4 温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成,如图4.4所示。4.1.5 显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图4.5所示。温度数据移入显示
30、寄存器十位数0?百位数0?十位数显示符号百位数不显示百位数显示数据(不显示符号) 结束NNYY图4.5显示数据刷新流程图4.2 下位机程序下位机程序的编写主要使用C语言进行编写,可读性要比汇编语言好很多。其中包括DS18B20的测温模块,显示模块和串口通信模块,当上位机向下位机发送读温度指令时,单片机才会将所测得的数据传给上位机。温度采集系统的主程序设计如下:void main(void)uchar receive; init(); while(1) Read_Temperature(); if (flash=0) Disp_Temperature(); else P2 = 0x00; if
31、(RI) RI = 0;receive = SBUF;if (receive = s) send_char(); 主程序为一无限循环,单片机不断从DS18B20的数据口采集数据信号,用flash标志DS18B20是否正常,当flash=1时表示DS18B20不正常,就由软件设置及时关闭LED显示并由蜂鸣器报警。当一帧数据采集完毕即RI接受中断标志位为1,判断下位机是否接受到来自上位机的字符“1”对应的ASC码49时接收到时才开始将采集到的数据发送给上位机进行处理,RI标志位必须由软件清零。在串口通信模块中,baudrate的在程序初始化时已经定义为9600b/s,晶振频率(11.059MHZ)
32、也已设定好。波特率的产生用定时器产生,在设置时选择定时器1,并将它的设为工作方式2,8位的常数自动重新装载的定时器,这种工作方式可以省去用户软件中重装初值的程序,简化定时初值的计算方法,可以相当精确的确定定时时间。计算出定时器的初值之后,在设定串行口的工作方式,在这里令SCON=0X50,即SCON各位中,SM0=0,SM1=1,REN=1,其他控制字为0,选择为工作方式1,8位异步收发。令TCON中的TR1=1,启动定时器,并禁止其他中断。程序设计内容如下所示:void init(void)EA = 1; TMOD = 0x20;TH1=(unsigned char)(256 - (XTAL
33、 / (32L * 12L * baudrate);TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate); SCON = 0x50;PCON &= 0x00;TR1 = 1;IE = 0x00;此外,在显示模块中,小数位的转化才用了一定的技巧,由于实际显示中只要求显示一位小数,而DS18B20每一位的转化温度为0.0625LSB,当每一位变化时,第一位小数只有16种状态,我们只需一一算出放在一个数组中,通过查表指令即可获取第一位小数的十进制值。由于每一位变化为0.0625LSB,通过移位操作,即可获得一个新的关于温度整数部分的数据,部分设计显示转化程序如下:display4=temp_data0&0x0f;display0=ditabdisplay4; display4=(temp_data0&0xf0)4)|(temp_data1&0x0f)4);display3=display4/100;display1=display4%100;display2=display1/10;display1=display1%10;其中小数位所查的表为:Unsigned char code ditab16 = 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,