仓库温度湿度控制系统的设计_第1页
仓库温度湿度控制系统的设计_第2页
仓库温度湿度控制系统的设计_第3页
仓库温度湿度控制系统的设计_第4页
仓库温度湿度控制系统的设计_第5页
已阅读5页,还剩34页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2013届本科毕业设计(一号黑体居中)仓库温度湿度控制系统的设计(二号黑体居中)院(系)名称物理与电子信息学院(小三号黑体)专业名称电子信息科学与技术(小三号黑体)学生姓名张三丰(小三号黑体)学号090524111(小三号TimesNewRoman)指导教师何大壮教授(小三号黑体)完成时间2013年5月8日(小三号黑体)目录摘要 =1\*ROMANIAbstract =2\*ROMANII1.绪论 12.总体设计方案 23.IC介绍 33.1AT89S52单片机简介 33.1.1引脚功能: 33.1.2看门狗 53.2温度传感器DS1820简介 53.2.1DS1820内部结构和原理 63.2.2提高DS1820测温精度的途径 73.2.3DS1820使用中注意事项 73.3湿度传感器SHT10简介 83.3.1SHT10产品的特性及影响 83.3.2SHT10的连接及通信 93.3.3输出转换 104.软件编程 124.1读取一总线64位ROM:(基于51开发板24M晶振) 124.2单片机程序: 144.2.1写18b20子程序 164.2.2读18b20子程序 164.2.3写SHT10子程序 184.2.4读SHT10子程序 184.3上位机vb程序: 235.总结 32致谢 33参考文献 34附录1系统原理图 35附录2系统PCB图 36附录3系统上位机界面 371.绪论防潮、防霉、防腐、防爆是仓库日常工作的重要内容,是衡量仓库管理质量的重要指标。它直接影响到储备物资的使用寿命和工作可靠性。为保证日常工作的顺利进行,首要问题是加强仓库内温度与湿度的监测工作。但传统的方法是用与湿度表、毛发湿度表、双金属式测量计和湿度试纸等测试器材,通过人工进行检测,对不符合温度和湿度要求的库房进行通风、去湿和降温等工作。这种人工测试方法费时费力、效率低,且测试的温度及湿度误差大,随机性大。因此我们需要一种造价低廉、使用方便且测量准确的温湿度测量系统。本设计所介绍的数字温湿度计与传统的温湿度计相比,具有读数方便,测量范围广,测量准确,其输出温度采用电脑上位机显示,操作简单,成本低廉。功能说明:本系统包括四个功能模块:采集、控制、报警、存储。a.采集传感器采集温度和湿度数据,经过MCU处理以后送上位机显示。b.控制上位机传输控制信号给单片机。单片机根据控制信号对两个继电器控制,便可以控制增湿设备和降温设备。c.报警可调温湿度过高、过低亮灯报警和可调温度上限嗡鸣器报警,过100℃嗡鸣器长鸣火灾报警。d.存储采集到的数据按每分钟记录一次的方式存储到EXCEL数据库中。系统概述:通过单片机检测到3点实时温度值和1点湿度值送上位机显示并调用报警函数报警,同时可操作上位机设置报警限值和控制降温、增湿设备。采集到的数据按分钟记录到EXCEL数据库中。2.总体设计方案设计流程图如图2.1所示:整体系统的构思整体系统的构思硬件电路的选材电路的焊接C51软件的编辑控制界面的编程系统调试图2.1设计流程图方案一:AT89s52+18B20+湿敏电阻+4个8段LED数码管方案二:AT89s52+18B20+SHT10+上位机温度采集18B20有测量准确、读数简单、易于扩展和技术成熟等有点。所以方案一、方案二的温度采集都选用18B20。湿度采集方案一选用湿敏电阻。优点:价格便宜、扩展简单。缺点:需加A/D转换IC(0809)、读数漂移比较大。方案二选用SHT10数字传感器。优点:读数方便、无需A/D转换、测量漂移小。缺点:扩展要占用I/O口。显示方案一选用数码管显示。优点:符合构建小系统。缺点:有显示范围限制。方案二选用上位机。优点:调用电脑显示屏显示无范围限制。综合考虑:选用方案二优点:上位机显示,减轻了MCU负担;数字信号,读取容易;电脑做主设备,扩展性强;可调用电脑硬件资源。3.IC介绍3.1AT89S52单片机简介AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。3.1.1引脚功能:VCC:电源GND:地P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表2.1所示。在flash编程和校验时,P1口接收低8位地址字节。P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表3.1所示。引脚号第二功能P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2INT0(外部中断0)P3.3INT1(外部中断1)P3.4T0(定时器0外部输入)P3.5T1(定时器1外部输入)P3.6WR(外部数据储存器写选通)P3.7RD(外部数据储存器读选通)表3.1P3口特殊功能在flash编程和校验时,P3口也接收一些控制信号。RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。EA/VPP:访问外部程序存储器控制信号。为储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。3.1.2看门狗WDT是一种需要软件控制的复位方式。WDT由13位计数器和特殊功能寄存器中的看门狗定时器复位存储器(WDTRST)构成。WDT在默认情况下无法工作;为了激活WDT,户用必须往WDTRST寄存器(地址:0A6H)中依次写入01EH和0E1H。当WDT激活后,晶振工作,WDT在每个机器周期都会增加。WDT计时周期依赖于外部时钟频率。除了复位(硬件复位或WDT溢出复位),没有办法停止WDT工作。当WDT溢出,它将驱动RSR引脚一个高个电平输出。为了激活WDT,用户必须向WDTRST寄存器(地址为0A6H的SFR)依次写入0E1H和0E1H。当WDT激活后,用户必须向WDTRST写入01EH和0E1H喂狗来避免WDT溢出。当计数达到8191(1FFFH)时,13位计数器将会溢出,这将会复位器件。晶振正常工作、WDT激活后,每一个机器周期WDT都会增加。为了复位WDT,用户必须向WDTRST写入01EH和0E1H(WDTRST是只读寄存器)。WDT计数器不能读或写。当WDT计数器溢出时,将给RST引脚产生一个复位脉冲输出,这个复位脉冲持续96个晶振周期(TOSC),其中TOSC=1/FOSC。为了很好地使用WDT,应该在一定时间内周期性写入那部分代码,以避免WDT复位。3.2温度传感器DS1820简介在传统的模拟信号远距离温度测量系统中,需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差问题等技术问题,才能够达到较高的测量精度。我们在为某水电站开发水轮发电机组轴瓦温度实时监测系统时,为了克服上面提到的三个问题,采用了新型数字温度传感器DS1820,在对其测温原理进行详细分析的基础上,提出了提高DS1820测量精度的方法,使DS1820的测量精度由0.5℃提高到0.1℃以上,取得了良好的测温效果。DS1820是美国DALLAS半导体公司生产的可组网数字式温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。与其它温度传感器相比,DS1820具有以下特性:(1)独特的单线接口方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯。(2)DS1820支持多点组网功能,多个DS1820可以并联在唯一的三线上,实现多点测温。(3)DS1820在使用中不需要任何外围元件。(4)温范围-55℃~+125℃,固有测温分辨率0.5℃。(5)测量结果以9位数字量方式串行传送。3.2.1DS1820内部结构和原理DS1820测温原理如图3.1所示:图3.1测温原理图图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2.3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。在正常测温情况下,DS1820的测温分辩率为0.5℃以9位数据格式表示,其中最低有效位(LSB)由比较器进行0.25℃比较,当计数器1中的余值转化成温度后低于0.25℃时,清除温度寄存器的最低位(LSB),当计数器1中的余值转化成温度后高于0.25℃,置位温度寄存器的最低位(LSB)。3.2.2提高DS1820测温精度的途径DS1820高精度测温的理论依据DS1820正常使用时的测温分辨率为0.5℃,这对于水轮发电机组轴瓦温度监测来讲略显不足,在对DS1820测温原理详细分析的基础上,我们采取直接读取DS1820内部暂存寄存器的方法,将DS1820的测温分辨率提高到0.1℃~0.01℃.其中第7字节存放的是当温度寄存器停止增值时计数器1的计数剩余值,第8字节存放的是每度所对应的计数值,这样,我们就可以通过下面的方法获得高分辨率的温度测量结果。首先用DS1820提供的读暂存寄存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度整数部分T整数,然后再用BEH指令读取计数器1的计数剩余值M剩余和每度计数值M每度,考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系。DS1820内部暂存寄存器的分布如表3.2所示:寄存器内容字节地址温度最低数据位0温度最高数据位1高温限值2低温限值3保留4保留5计数剩余值6每度计数值7CRC校验8表3.2DS18B20暂存寄存器分布实际温度T实际可用下式计算得到:T实际=(T整数-0.25℃)+(M每度-M剩余)/M每度用直接读取测温结果方法和采用计算方法得到的测温数据比较,通过比较可以看出,计算方法在DS1820测温中不仅是可行的,也可以大大的提高DS1820的测温分辨率。3.2.3DS1820使用中注意事项DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:A较小的硬件开销需要相对复杂的软件进行补偿,由于DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。B在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。C连接DS1820的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。图3.2SHT10D在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。图3.2SHT103.3湿度传感器SHT10简介SHT10是盛世瑞恩温湿度传感器系列中表贴型的传感器。传感器把传感元件和信号处理集成起来,输出全标定的数字信号。实物如图3.2所示;可靠性与卓越的长期稳定性。传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上,与14位的A/D转换器以及串行接口电路实现无缝连接。因此,该产品具有品质卓越、超快响应、抗干扰能力强极高的性价比等优点。3.3.1SHT10产品的特性及影响材质:传感器采用环氧LCP帽,下层为FR4。插针采用铜/铍合金制作,外层镀有镍和金。传感器符合ROHS和WEEE标准,因此不受Pb,Cd,Hg,Cr(6+),PBB,PBDE的影响焊接:可以使用标准的回流焊炉对SHT1x进行焊接。传感器完全符合IPC/JEDECJ-STD-020C焊接标准在最高260℃温度下,接触时间应小于40秒。在蒸气回流焊炉中条件为TP<233℃,tp<60秒,焊接时温度上升和下降的速度应小于10℃/秒。手动焊接,在最高350℃7的温度条件下接触时间须少于5秒。影响:气体的相对湿度,在很大程度上依赖于温度。因此在测量湿度时,应尽可能保证湿度传感器在同一温度下工作。在做测试时,应保证两个传感器在同样的温度下,然后比较湿度的读数。3.3.2SHT10的连接及通信传感器遵循I2C通信协议,但是不能按照I2C协议编址。如果I2C总线上没有挂接别的元件,传感器可以连接到I2C总线上。(1)启动传感器首先,选择供电电压后将传感器通电,上电速率不能低于1V/ms。通电后传感器需要11ms进入休眠状态,在此之前不允许对传感器发送任何命令。(2)发送命令,用一组“启动传输”时序,来表示数据传输的初始化。它包括:当SCK时钟高电平时DATA翻转为低电平,紧接着SCK变为低电平,随后是在SCK时钟高电平时DATA转为高电平。后续命令包含三个地址位(目前只支“000”),和五个命令位。SHT1x会以下述方式表示已正确地接收到指令:在第8个SCK时钟的下降沿之后,将DATA下拉为低电平(ACK位)。在第9个SCK时的下降沿之后,释放DATA(恢复高电平)。SHT10命令集如表3.3所示:命令代码预留0000x温度测量00011湿度测量00101读状态寄存器00111写状态寄存器00110预留0101x-1110x软复位,复位接口、清空状态寄存器,即清空为默认值,下一次命令前等待至少11ms11110表3.3命令集(3)测量时序(RH,T)发布一组测量命令(‘00000101’表示相对湿度RH,‘00000011’表示温度T)后,控制器要等待测量结束。这个过程需要大约20/80/320ms,分别对应8/12/14bit测量。确切的时间随内部晶振速度,最多可能有-30%的变化。SHT1x通过下拉DATA至低电平并进入空闲模式,表示测量的结束。控制器在再次触发SCK时钟前,必须等待这个“数据备妥”信号来读出数据(4)通讯复位时序如果与SHT1x通讯中断,下列信号时序可复位串口:当DATA保持高电平时,触发SCK时钟9次或更多。在下一次指令前,发送一个“传输启动”时序。这些时序只复位串口,状态寄存器内容仍然保留。(5)状态寄存器SHT10的某些高级功能可以通过给状态寄存器发送指令来实现,如选择测量分辨率,电量不足提醒或启动加热功能等。状态寄存器如表3.4所示:Bit类型说明默认值706RX无默认值,此位仅在测量结束后更新5040302R/W0关1R/W0加载0R/W012bitRH14bitT表3.4状态寄存器3.3.3输出转换为了补偿湿度传感器的非线性以获取准确数据,使用如下:RHlinear=c1+c2·SORH+c3·SORH2(%RH)公式修正读数表如表3.5所示:SORHC1*C2*C3*12bit-4.00000.0405-2.8000E-68bit-4.00000.6480-7.2000E-4表3.5公式修正读数表相对湿度对于温度依赖性的补偿:由于实际温度与测试参考温度25℃(~77℉)的显著不同,湿度信号需要温度补偿。温度校正粗略对应于0.12%RH/℃@50%RH,温度补偿系数请参阅表3.6。RHtrue=(T°C-25)•(t1+t2•SORH)+RhlinearSORHt1t212bit0.010.000088bit0.010.00128表3.6公式修正读数表4.软件编程4.1读取一总线64位ROM:(基于51开发板24M晶振)64位ROM:1:82f24faa100000c264位ROM:1:82f24faa100000c22:829502aa100000743:822e672b10000059#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintuchari,ii,iii,j,k,h,m;ucharn[8];uintf;sbitDQ=P2^7;uchar codequdong[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};ucharcodescan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};ucharcount[]={16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16};voiddelay(uinta) //延时5us;{for(;a>0;a--);}voiddelay1ms(uintx){uintp,q;for(q=0;q<x;q++){for(p=0;p<240;p++);}}voidset(void)//复位总线;{ucharb=1;while(b){DQ=1;DQ=0;delay(90);DQ=1;delay(10);b=DQ;delay(80);}} ucharread18b20(void) //读18b20一个字节;{uchari;ucharD=0;for(i=8;i>0;i--){DQ=1;D>>=1;DQ=0;_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();if(DQ)D|=0x80;delay(19);}return(D);} voidwrite18b20(ucharD) //写一个字节;{uchari;for(i=8;i>0;i--){DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=D&0x01;delay(20);DQ=1;D=D>>1;}} main(){ set(); //读取64位ROM送显示数组; delay(100);write18b20(0x33);for(ii=0;ii<8;ii++){n[ii]=read18b20();}for(iii=0;iii<16;iii=iii+2)//读取64ROM放入count【】数组{count[iii+8]=n[iii/2]%16;count[iii+9]=n[iii/2]/16;}while(1){for(f=0;f<50;f++){for(k=0;k<8;k++){P3=scan[k];P0=qudong[count[k+h]];delay1ms(3);}}h++;if(h==24) h=0;}}4.2单片机程序:#include<reg51.h>#include<math.h>#include<stdio.h>#include"intrins.h"#defineuintunsignedint#defineucharunsignedcharsfrWDTRST=0XA6;sbitDQ=P2^7;sbitJ0=P2^5;sbitJ1=P2^4;sbitS=P2^3;sbitSCK=P2^2;sbitDATA=P2^1;ucharcodeB1[]={0x28,0x2f,0xf4,0xaa,0x01,0x00,0x00,0x2c};//18b20的64位ROM;ucharcodeB2[]={0x28,0x59,0x20,0xaa,0x01,0x00,0x00,0x47};ucharcodeB3[]={0x28,0xe2,0x76,0xb2,0x01,0x00,0x00,0x95};constfloatcodeC1=-4.0; //用于湿度调整;constfloatcodeC2=+0.0405;constfloatcodeC3=-0.0000028;constfloatcodet1=+0.01;constfloatcodet2=+0.0008; ucharsdata[]={0x68,1,2,3,4,5,6,7};//存温湿度测量值;ucharrdata[]={0x68,80,0,0}; //存温湿度上下限报警值;uchard=0x00,h;uintx,count;/*******************************************************/voiddelay1ms(uinta) //延时1ms;{uinti,j;for(i=0;i<a;i++)for(j=0;j<120;j++);}voiddelay500us(uinta) //延时500us;{uinti,j;for(i=0;i<a;i++)for(j=0;j<20;j++);}/****************************************************************/voiddelay(uintt) //延时子函数11us;{for(;t>0;t--);}/***************************************************************/voidset(void) //初始化18b20总线;{uchara=1;while(a){DQ=1;DQ=0;delay(50);DQ=1;delay(6);a=DQ;delay(44);}}/*********************************************************/4.2.1写18b20子程序voidw18b20(uchara) //写入18b20一个字节;{uinti;for(i=0;i<8;i++){DQ=1;_nop_();_nop_();DQ=0; _nop_();_nop_();_nop_();_nop_();DQ=a&0x01;delay(8);a>>=1;}DQ=1;delay(1);}/**********************************************************/4.2.2读18b20子程序ucharr18b20(void) //读取18b20一个字节;{uinti;ucharD=0;for(i=0;i<8;i++){DQ=1;D>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();if(DQ)D|=0x80;delay(8);}DQ=1;return(D);}/***********************************************************/voidtra(void) //全部转换一次{set();//总线复位delay(200);w18b20(0xcc);//发命令w18b20(0x44); //发转换命令while(!DQ); //等待转换完成}/*************************************************************/voidread_tem(void) //读温度寄存器{uchari; set(); //读B1delay(200);w18b20(0x55);for(i=0;i<8;i++){w18b20(B1[i]);}w18b20(0xbe);sdata[2]=r18b20();sdata[1]=r18b20();sdata[1]=(sdata[1]<<4)|(sdata[2]>>4);sdata[2]=sdata[2]&0x0f;set(); //读B2delay(200);w18b20(0x55);for(i=0;i<8;i++){w18b20(B2[i]);}w18b20(0xbe);sdata[4]=r18b20();sdata[3]=r18b20();sdata[3]=(sdata[3]<<4)|(sdata[4]>>4);sdata[4]=sdata[4]&0x0f;set(); //读B3delay(200);w18b20(0x55);for(i=0;i<8;i++){w18b20(B3[i]);}w18b20(0xbe);sdata[6]=r18b20();sdata[5]=r18b20();sdata[5]=(sdata[5]<<4)|(sdata[6]>>4);sdata[6]=sdata[6]&0x0f;}/****************************************************/4.2.3写SHT10子程序voidwrite_byte(unsignedcharvalue) //向SHT10写一个字节;{unsignedchari;for(i=0x80;i>0;i/=2){if(i&value)DATA=1;elseDATA=0;SCK=1;_nop_();_nop_();_nop_(); SCK=0;}DATA=1;SCK=1;while(DATA);SCK=0;}/***************************************************/4.2.4读SHT10子程序charread_byte(unsignedcharack) //从SHT10中读取一个字节并传送ACK;{unsignedchari,val=0;DATA=1;for(i=0x80;i>0;i/=2){SCK=1;if(DATA)val=(val|i);SCK=0; }DATA=ack;SCK=1;_nop_();_nop_();_nop_();SCK=0; DATA=1;returnval;}/*****************************************************/voidtransstart(void) //启动传输信号{DATA=1;SCK=0;_nop_(); _nop_();SCK=1;_nop_();_nop_();DATA=0;_nop_(); _nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_(); _nop_();DATA=1; _nop_();_nop_();SCK=0; }/******************************************************/voidsound(unsignedintcount1) //声音子函数;{unsignedinti;for(i=0;i<count1;i++){S=0;delay500us(1);S=1;delay500us(1);}}/**************************************************/voidconnectionreset(void) //复位总线;{unsignedchari;DATA=1;SCK=0;for(i=0;i<9;i++){SCK=1;_nop_();_nop_();SCK=0; _nop_(); _nop_();}transstart();}/*****************************************************/voidtext_sht10(void) //读取计算湿度并温度调整;{floatv,RH0,RH1;connectionreset();delay1ms(100);write_byte(0x05);while(DATA);RH0=read_byte(0);RH0=RH0*256+read_byte(1);v=(sdata[5]+sdata[1]+sdata[3])/3;RH1=C1+C2*RH0+C3*RH0*RH0;RH1=(v-25)*(t1+t2*RH0)+RH1;if(RH1>=100)RH1=100;if(RH1<=0)RH1=0;sdata[7]=(int)RH1;if(rdata[1]<=sdata[5]||rdata[1]<=sdata[1]||rdata[1]<=sdata[3]){sound(100);delay1ms(50);sound(100);delay1ms(50);sound(100);delay1ms(100);}}/****************************************************/voidsend(void) //向上位机发送子程序;{uinti;for(i=0;i<8;i++){SBUF=sdata[i];while(!TI);TI=0;}}/*********************************************************/main(){IE=0x92;SCON=0x50;TMOD=0x20;PCON=0;TH0=0x00;TH1=0x00;TH1=0xfd;TL1=0xfd;TR1=1;TR0=1;WDTRST=0X1E; //启动看门狗;WDTRST=0XE1;connectionreset();write_byte(0x06);write_byte(0x00);text_sht10();while(1){tra();read_tem();delay1ms(150);x++;if(x>=10){x=0;text_sht10();}send();delay1ms(100);if(rdata[2]==0x02)J0=0;elseJ0=1;if(rdata[3]==0x03)J1=0;elseJ1=1;if(sdata[1]>=100||sdata[3]>=100||sdata[5]>=100) //高于100度是火警报警;{J0=1;J1=1;S=0;delay1ms(1000);}elseS=1;if(rdata[1]<=sdata[5]||rdata[1]<=sdata[1]||rdata[1]<=sdata[3]){sound(100);delay1ms(50);sound(100);}elseS=1;}}/*****************************************************************/voidreceive(void)interrupt4 //接收子程序;{if(RI==1){RI=0;rdata[d]=SBUF;if(rdata[0]==0x68){d++;if(d>=4)d=0;}elsed=0;}}/********************************************************************/voidtimer0(void)interrupt1{TH0=0X00;TL0=0X00;WDTRST=0X1E;//复位看门狗;WDTRST=0XE1;}4.3上位机vb程序:Dimoutbyte(0To2)AsByte'声明部分Diminbyte()AsByteDimxAsIntegerDimyAsIntegerDimaAsIntegerDimbAsIntegerDimxlAppAsExcel.Application'声明excelDimxlBookAsExcel.WorkbookDimxlSheetAsExcel.WorksheetDimdAsDate,d1AsDateDimiAsIntegerDimjAsIntegerDimkPrivateSubCommand1_Click()'退出按钮IfMSComm1.PortOpen=TrueThen'释放串口MSComm1.PortOpen=FalseEndIfxlBook.Save'释放excelxlBook.ClosexlApp.QuitSetxlApp=NothingEndEndSubPrivateSubCommand2_Click()'控制按键的设置outbyte(0)=Text3.TextIfCheck3(0).Value=1Thenoutbyte(1)=2Elseoutbyte(1)=0EndIfIfCheck3(1).Value=1Thenoutbyte(2)=3Elseoutbyte(2)=0EndIfMSComm1.Output=Chr(&H68)+Chr(outbyte(0))+Chr(outbyte(1))+Chr(outbyte(2))EndSubPrivateSubCommand3_Click()'连接按键的设置OnErrorGoToerr0:IfCommand3.Caption="连接"ThenMSComm1.CommPort=Val(Combo1.ListIndex+1)MSComm1.PortOpen=True'打开串口Command3.Caption="已连接"Timer3.Enabled=True'打开定时器3ExitSubEndIferr0:SelectCaseErr.NumberCase8002MsgBox"初始化失败!"ExitSubCaseElseEndSelectIfCommand3.Caption="已连接"ThenCommand3.Caption="连接"MSComm1.PortOpen=False'关闭串口Timer3.Enabled=False'关闭定时器3EndIfEndSubPrivateSubForm_Load()'加载时间Label3.Caption=Timed=DateIfDir("d:\"&d&".xls")=""Then'判断xls文件是否存在SetxlApp=CreateObject("Excel.Application")SetxlBook=xlApp.Workbooks.AddSetxlSheet=xlBook.Worksheets("sheet1")xlSheet.ActivateColumns("A:A").ColumnWidth=18'调整excel文件的宽度和居中Columns("B:B").ColumnWidth=10Columns("C:C").ColumnWidth=10Columns("D:D").ColumnWidth=10Columns("E:E").ColumnWidth=10Range("A1,A:A,B:B,C:C,D:D,E:E").SelectRange("D1").ActivateWithSelection.HorizontalAlignment=xlCenter.VerticalAlignment=xlCenter.WrapText=False.Orientation=0.AddIndent=False.IndentLevel=0.ShrinkToFit=False.ReadingOrder=xlContext.MergeCells=FalseEndWithRange("a1").SelectxlSheet.Range("a1")="时间"xlSheet.Range("b1")="A点温度"xlSheet.Range("c1")="B点温度"xlSheet.Range("d1")="C点温度"xlSheet.Range("e1")="D点湿度"xlBook.SaveAs("d:\"&d&".xls")ElseSetxlApp=CreateObject("Excel.Application")SetxlBook=xlApp.Workbooks.Open("d:\"&d&".xls")SetxlSheet=xlBook.Worksheets("sheet1")EndIfi=int_i()'给i赋值EndSubPrivateSubForm_Resize()'防止窗口变化IfForm1.WindowState=0ThenForm1.Height=8745Form1.Width=11430EndIfEndSubPrivateSubForm_Unload(CancelAsInteger)IfMSComm1.PortOpen=TrueThen'释放串口MSComm1.PortOpen=FalseEndIfxlBook.Save'释放excelxlBook.ClosexlApp.QuitSetxlApp=NothingEndSubPrivateSubMSComm1_OnComm()'通信控件的设置SelectCaseMSComm1.CommEventCasecomEvReceiveinbyte()=MSComm1.InputCasecomEvSendEndSelectIfinbyte(0)=&H68ThenLabel2(0).Caption=Format((inbyte(1)+inbyte(2)*0.0625),"0.0")Label2(1).Caption=Format((inbyte(3)+inbyte(4)*0.0625),"0.0")Label2(2).Caption=Format((inbyte(5)+inbyte(6)*0.0625),"0.0")Label2(3).Caption=Format(inbyte(7),"0")CallalarmEndIfEndSubPrivate Sub Text1_Change(Index As Integer)'报警键入提示IfLen(Text1(0).Text)>=3Thenx=MsgBox("请输入0——99之间的数值",49,"警告")Ifx=1ThenText1(0).Text=""ExitSubEndIfIfLen(Text1(1).Text)>=3Thenx=MsgBox("请输入0——99之间的数值",49,"警告")Ifx=1ThenText1(1).Text=""ExitSubEndIfIfLen(Text1(2).Text)>=3Thenx=MsgBox("请输入0——99之间的数值",49,"警告")Ifx=1ThenText1(2).Text=""ExitSubEndIfIfLen(Text1(3).Text)>=3Thenx=MsgBox("请输入0——99之间的数值",49,"警告")Ifx=1ThenText1(3).Text=""ExitSubEndIfIfLen(Text1(4).Text)>=3Thenx=MsgBox("请输入0——99之间的数值",49,"警告")Ifx=1ThenText1(4).Text=""ExitSubEndIfIfLen(Text1(5).Text)>=3Thenx=MsgBox("请输入0——99之间的数值",49,"警告")Ifx=1ThenText1(5).Text=""ExitSubEndIfIfLen(Text1(6).Text)>=3Thenx=MsgBox("请输入0——99之间的数值",49,"警告")Ifx=1ThenText1(6).Text=""ExitSubEndIfIfLen(Text1(7).Text)>=3Thenx=MsgBox("请输入0——99之间的数值",49,"警告")Ifx=1ThenText1(7).Text=""ExitSubEndIfEndSubPrivateSubText3_Change()'报警键入提示IfLen(Text3.Text)>=3Theny=MsgBox("请输入0——99之间的数值",49,"警告")Ify=1ThenText3.Text=""EndIfEndSubPrivateSubTimer1_Timer()'显示时间Label3.Caption=TimeEndSubPrivateSubalarm()'报警子函数Ifinbyte(1)>=Val(Text1(0).Text)ThenShape1(0).FillColor=QBColor(12)ElseShape1(0).FillColor=QBColor(8)EndIfIfinbyte(1)<Val(Text1(1).Text)ThenShape1(1).FillColor=QBColor(12)ElseShape1(1).FillColor=QBColor(8)EndIfIfinbyte(3)>=Val(Text1(2).Text)ThenShape1(2).FillColor=QBColor(12)ElseShape1(2).FillColor=QBColor(8)EndIfIfinbyte(3)<Val(Text1(3).Text)ThenShape1(3).FillColor=QBColor(12)ElseShape1(3).FillColor=QBColor(8)EndIfIfinbyte(5)>=Val(Text1(4).Text)ThenShape1(4).FillColor=QBColor(12)ElseShape1(4).FillColor=QBColor(8)EndIfIfinbyte(5)<Val(Text1(5).Text)ThenShape1(5).FillColor=QBColor(12)ElseShape1(5).FillColor=QBColor(8)EndIfIfinbyte(7)>=Val(Text1(6).Text)ThenShape1(6).FillColor=QBColor(12)ElseShape1(6).FillColor=QBColor(8)EndIfIfinbyte(7)<Val(Text1(7).Text)ThenShape1(7).FillColor=QBColor(12)ElseShape1(7).FillColor=QBColor(8)EndIfEndSubPrivate Sub Timer2_Timer()'颜色变化Label4(a).ForeColor=QBColor(b)a=a+1Ifa=4Thenb=b+1a=0EndIfIfb=14Thenb=0EndIfEndSubPrivateSubTimer3_T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论