DH11数字温湿度测量系统设计1.1.1项目背景介绍随着单片机和传感技术的迅速发展,自动检测领域发生了巨大变化,本文参考了一种基于单片机并采用数字化单总线技术的温度测控系统应用于仓库车间的的设计方案,根据实用者提出的问题进行了改进,提出了一种新的设计方案,在单总线上传输数字信号。即采用DHT11温湿度传感器解决传输模拟量误差大的问题,以及采用高技术的无线收发模块来代替之前大量的电缆,具有更好的经济与实用价值。1.1.1功能要求采用8051单片机和DHT11传感器设计一个数字温-湿度测量系统,温湿度测量范围为-20~100℃相对湿度测量范围为0~100%,采用LED数码管显示器,同时二极管作为工作正常指示灯和出错指示灯。1.1.2硬件电路设计图1.1温湿度检测原理示意图DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为给类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装,连接方便。技术参数供电电压:3.3~5.5VDC输出:单总线数字信号测量范围:湿度20-90%RH,温度0~50℃测量精度:湿度+-5%RH,温度+-2℃分辨率:湿度1%RH,温度1℃互换性:可完全互换,长期稳定性:±1%RH/年图1.2DH11通讯过程图1.3部分硬件1.1.3上位机界面:上位机可方便地实现与单片机之间进行信息传递交互,能够更加容易对执行机构进行控制,实现操作可视化,更加直观,保存重要数据等功能。我们利用VisualBasic6.0(以下简称VB)来编制上位机,VB是一种功能强大、简单易学的程序设计语言。界面是软件和用户交互最直接的层,界面的好坏决定了用户对软件的第一印象,目前流行的界面风格有三种:单窗体、多窗体一届资源管理器风格,无论是哪种风格以下规则是应该被重视的。易用性,规范性,合理性,美观和协调性,独特性,快捷性,安全性,多窗口的应用与系统资源。1.登录界面设计图1.4温湿度检测系统登录界面设计窗体代码如下:PrivateSubForm_Load()DimIAsStringMe.Top=2500Me.Left=5000Me.Width=10000Me.Height=6500Me.AutoRedraw=TrueEndSubPrivateSubForm_Resize()Me.PaintPictureMe.Picture,0,0,ScaleWidth,ScaleHeightEndSubPrivateSubCommand1_Click()IfCombo1.Text=zzhAndText2=zzh123ThenfrmMain.ShowElseIfCombo1.Text=zzh3AndText2zzh123OrText2zzh123ThenMsgBox密码有误或该用户名不存在,vbOKCancel,提醒!Text2=EndIfEndSubPrivateSubCommand2_Click()Form1.HideUnloadForm1EndSub2.登录界面运行如下图所示:图1.5正常登录界面登录成功后自动跳转到温湿度显示数据监控界面。1.1.4主要上位机子界面及对应代码程序介绍一.温湿度数据监控界面设计监控界面设计思路:(1)温度湿度实时数据要随时间一起动态显示在文本框中。这样可以及时查看当前温湿度值。(2)仓库车间内温度变化较湿度变化范围大因此对温度数据应绘制出曲线图以方便了解温度变化趋势并可在需要时利用原始曲线做进一步分析。(3)同时能将你温湿度值保存下来以便查询,所以设置一个日志管理按钮,通过该按钮切换到日志记录界面查看数据列表。(4)通讯状态的正常与否关系到数据传输的有效性,因此观测数据的同时需要对照通讯状态,本设计中通信端口设置为1,波特率设置为9600,在数据传输要保证通讯正常,所以设置系统状态显示文本框,只有文本框显示通讯正常,所观测到的数据才有效。(5)接收采样数据需要以一定频率进行来,所以在界面中设置时钟控件。图1.6温湿度数据监控界面监控界面显示当前时刻、相对湿度值和摄氏温度值,温、湿度利用DH11模块检测数据并通过单片机I/O口输送到上位机VB的MSComm控件接收。1.MSComm控件介绍:MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能,每个MSComm控件对应于一个串行端口。MSComm控件的主要属性及说明如下。在工具栏中找到“工程”选项里的——“部件”,选中MicrosoftCommcontrol6.0,“确定”完成MSComm控件的添加。然后从左边控件工具箱里往窗体添加MSComm控件就可以了,本设计中因为有温度、湿度两组数据需要通信所以添加两个MSComm控件,分别命名为tempMSComm和humiMSComm。图1.7添加MSComm控件点击按钮通过MSComm控件接收下位机数据的程序代码如下:PrivateSubcmdReceive_Click()IfbinReceiveflagThenfrmMain.cmdReceive.Caption=开始接收ElseIfNotfrmMain.tempMSComm.PortOpenOrfrmMain.humiMSComm.PortOpenThenfrmMain.tempMSComm.PortOpen=TruefrmMain.humiMSComm.PortOpen=True'打开串行口EndIffrmMain.tempMSComm.InputLen=0frmMain.tempMSComm.InputMode=0frmMain.tempMSComm.InBufferCount=0frmMain.tempMSComm.RThreshold=1frmMain.humiMSComm.InputLen=0frmMain.humiMSComm.InputMode=0frmMainhumiMSComm.InBufferCount=0frmMain.humiMSComm.RThreshold=1frmMain.cmdReceive.Caption=停止接收EndIfbinReceiveflag=NotbinReceiveflag2.接收读取数据程序代码PrivateSubTimer1_Timer()DimaAsIntegerDimstr1AsStringStaticxAsLongStaticyAsLongDimy1AsIntegerText1.Text=Text2.Text=a=0Text4.Text=Time$()IftempMSComm.InBufferCount0AndhumiMSComm.InBufferCount0Then'程序检查输入缓冲区中是否有数据,若有数据a=tempMSComm.Inputb=humiMSComm.InputEndIfIfa155Thent0=a\100t1=t0\10a=t0+t1-1Elsea=aEndIfIfb155Thenh0=b\100h1=h0\10b=h0+h1-1b=bEndIfText1.Text=Str(a)+°C'则将此数据读取后,指定给文本框的Text属性Text2.Text=Str(b)+%y1=Picture1.ScaleHeight/2-(a*Picture1.ScaleHeight)/200Picture1.Line(x,y)-(x+((Picture1.ScaleWidth-600-Picture1.ScaleLeft))/60,y1)x=x+(Picture1.ScaleWidth-600-Picture1.ScaleLeft)/60Ifx=Picture1.ScaleWidthThenSavePicturePicture1.Image,c:\temp.bmp'保存图画,可以根据实际需要命名图片x=Picture1.ScaleLeft+300Picture1.Cls'清屏重画3.温度曲线图图1.2温湿度数据监控界面中右边Fram显示的是温度数据曲线图,出于分析预测温度数据变化趋势的需要,我们在实时显示数据时还应反映历史数据曲线。数据曲线图绘制的程序如下:Picture1.ScaleMode=1'以VB的基本单位作为建立坐标轴以及绘制图形的单位;Picture1.RefreshPicture1.CurrentX=Picture1.ScaleWidth-100Picture1.CurrentY=Picture1.ScaleHeight/2-30Picture1.PrintTPicture1.CurrentX=Picture1.ScaleLeft+20Picture1.CurrentY=Picture1.ScaleTop+20Picture1.PrintC'***************************************************************'画纵坐标'***************************************************************ForI=Picture1.ScaleLeft+300ToPicture1.ScaleWidth-300Step(Picture1.ScaleWidth-Picture1.ScaleLeft-600)/6Picture1.CurrentX=IPicture1.Line(I,Picture1.ScaleTop)-(I,Picture1.ScaleHeight-300)Picture1.CurrentX=I-100CurrentY=Picture1.ScaleHeight-300Picture1.Print(I*60)\(Picture1.ScaleWidth-Picture1.ScaleLeft-600)-2NextI'***************************************************************'画上半平面的横坐标'***************************************************************Forj=Picture1.ScaleTopToPicture1.ScaleHeight/2Step((Picture1.ScaleHeight/2-Picture1.ScaleTop)/10)Picture1.CurrentY=jPicture1.Line(Picture1.ScaleLeft+300,j)-(Picture1.ScaleWidth-300,j)Picture1.CurrentX=Picture1.ScaleLeft+80Picture1.CurrentY=jPicture1.Print((Picture1.ScaleHeight/2-j)*200)\(Picture1.ScaleHeight)Nextj'****************************************************************'画下半平面的横坐标'****************************************************************Fork=Picture1.ScaleHeight/2ToPicture1.ScaleHeightStep((Picture1.ScaleHeight-Picture1.ScaleHeight/2)/1