版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1引言现代的生产生活中,环境因素是主要影响因素之一,尤其是农业生产离不开环境控制,其中的温度、湿度是环境的两项主要指标。目前我国农业正处于从传统农业向以优质、高产、高效益为目标的现代农业转化的新阶段[1]。因此,温湿度测量控制技术作为农业生产速生、优质、高产的手段,也是农业现代化的重要标志[2]。温湿度测量系统对于农产品的生产和贮存环节都是十分重要的。在生产环节中,温室大棚现已得到广泛应用,但我国温室环境控制目前仍靠人工经验来管理,严重影响了农业生产的效率,阻碍了农业生产的开展,因此,采用先进的人工智能技术,科学、合理、有效地控制影响作物的环境因子,通过微型计算机控制设备进行环境控制,以便给农作物生长提供一个最正确的环境,做到既提高产品的质量、产量、经济价值和社会效益,同时尽量降低生产本钱,这对温室环境施行自动检测和控制是非常必要的。温室检测控制设施的关键技术是温湿度控制[3]。在贮存环节中,粮库粮食平安储藏的主要参数是粮库的温度和湿度,但大局部粮库目前还是采取人工测温的方法,这不仅使粮库工作人员工作量增大,且工作效率低,尤其是大型粮库的温度检测任务如不能及时彻底完成,那么有可能会造成粮食大面积变质。因此,一套完善的温湿度测量系统是十分必要的[4][5]。此次设计的是基于单片机的温湿度测量系统,此系统是以MCS-51系列单片机为核心构成的温湿度精确检测,并能实现超限报警及实时显示功能。本系统还设有串口数据发送模块,能够将采集的数据传送给计算机,供技术人员记录处理。2系统总体设计与分析2.1总体方案根据设计功能要求,系统可分如下局部:温度监控:对环境温度进行测量,并通过单片机处理实时显示环境温度。湿度监控:对环境湿度进行测量,并通过单片机处理实时显示环境湿度。报警处理:当温度、湿度越限时,发出报警提示信号。显示:LCD实时显示温湿度及时钟日期。键盘控制:调整温湿度上下限、时钟。串口通信:将采集的数据定时发送给PC机。2.2系统方案论证当将单片机用作测控系统时,系统总要有被测信号通过输入通道,由单片机拾取必要的输入信息。对于测量系统而言[6],如何准确获得被测信号是其核心任务;而对测控系统来讲,除对被控对象状态的信号测试外,还要将测试数据与控制条件比照并实时控制相应执行设备。传感器是实现测量与控制的首要环节,是测控系统的关键部件,如果没有传感器对原始被测信号进行准确可靠的捕捉和转换,一切准确的测量和控制都将无法实现。工业生产过程的自动化测量和控制,几乎主要依靠各种传感器来检测和控制生产过程中的各种参量,使设备和系统正常运行在最正确状态,从而保证生产的高效率和高质量[7]。本系统中,我们选择SHT11来作为本设计的温湿度传感器。SHT11单芯片传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专利的工业COMS过程微加工技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式聚合体测湿元件和一个能隙式测温元件,并与一个14位的A/D转换器以及串行接曰电路在同一芯片上实现无缝连接。因此,该产品具有品质草越、超快响应、抗干扰能力强、性价比极高等优点[8]。每个SHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数[9]。两线制串行接口和内部基准电压,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为各类应用甚至最为苛刻的应用场合的最正确选那么[10]。3系统硬件设计本系统硬件包括:温湿度采集转换模块、单片机及附属电路、键盘控制、LCD显示、时钟模块、报警电路、RS232串口通信模块等局部的设计。系统整体电路框图如图3.1所示。ATMELATMEL89C51单片机温湿度采集转换模块键盘控制RS232串口通信模块LCD显示报警电路时钟模块图3.1系统整体电路框图3.1温湿度采集转换模块硬件设计3.1.1SHT11介绍SHT11是瑞士Sensirion公司推出的基于COMSensTM技术的新型温湿度传感器。该传感器将COMS芯片技术与传感器技术结合起来,从而发挥出它们强大的优势互补作用。SHT11温湿度传感器的主要特性如下:将温湿度传感器、信号放大调理、A/D转换、I2C总线接口全部集成于一芯片〔COMSensTM技术〕;可给出全校准相对湿度及温度值输出;带有工业标准的I2C总线数字输出接口;具有露点值计算输出功能;具有卓越的长期稳定性;湿度值输出分辨率为14位,温度值输出分辨率为12位,并可编程为12位和8位;小体积〔7.65×5.08×23.5mm〕,可外表贴装;具有可靠的CRC数据传输校验功能;片内装载的校准系数可保证100%互换性;电源电压范围为2.4~5.5V;电流消耗,测量时为550uA,平均为28uA,休眠时为3uA。SHT11温湿度传感器采用SMD(LCC)外表贴片封装形式,管脚排列如图3.2所示,其引脚说明如下[11]:(1)GND:接地端;(2)DATA:双向串行数据线;DATA三态门用于数据的读取。DATA在SCK时钟下降沿之后改变状态,并仅在SCK时钟上升沿有效。数据传输期间,在SCK时钟高电平时,DATA必须保持稳定。为防止信号冲突,微处理器应驱动DATA在低电平。需要一个外部的上拉电阻将信号提拉至高电平。上拉电阻通常已包含在微处理器的I/O电路中。(3)SCK:串行时钟输入;SCK用于微处理器与SHT11之间的通讯同步。由于接口包含了完全静态逻辑,因而不存在最小SCK频率。(4)VDD电源端:0.4~5.5V电源端;SHT11的供电电压为2.4~5.5V。传感器上电后,要等待11ms以越过“体眠〞状态。在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去藕滤波[12]。(5)NC:空管脚。3.1.2工作原理SHT11的湿度检测运用电容式结构,并采用具有不同保护的“微型结构〞检测电极系统与聚合物覆盖层来组成传感器芯片的电容,除保持电容式湿敏器件的原有特性外,还可抵御来自外界的影响。由于它将温度传感器与湿度传感器结合在一起而构成了一个单一的个体,因而测量精度较高且可精确得出露点,同时不会产生由于温度与湿度传感器之间随温度梯度变化引起的误差。CMOSensTM技术不仅将温湿度传感器结合在一起,而且还将信号放大器、模/数转换器、校准数据存储器、标准I2C总线等电路全部集成在一个芯片内。SHT11传感器的内部结构框图如图3.3所示[13]。SHT11的每一个传感器都是在极为精确的湿度室中校准的。SHT11传感器的校准系数预先存在OTP内存中。经校准的相对湿度和温度传感器与一个14位的A/D转换器相连,可将转换后的数字温湿度值送给二线I2C总线器件,从而将数字信号转换为符合I2C总线协议的串行数字信号[14]。由于将传感器与电路局部结合在一起,因此,该传感器具有比其它类型的湿度传感器优越得多的性能。首先是传感器信号强度的增加增强了传感器的抗干扰性能,保证了传感器的长期稳定性,而A/D转换的同时完成,那么降低了传感器对干扰噪声的敏感程度。其次在传感器芯片内装载的校准数据保证了每一只湿度传感器都具有相同的功能,即具有100%的互换性。最后,传感器可直接通过I2C总线与任何类型的微处理器、微控制器系统连接,从而减少了接口电路的硬件本钱,简化了接口方式[15]。输出特性(1)湿度值输出SHT11可通过I2C总线直接输出数字量湿度值,其相对湿度数字输出特性曲线如图3.4所示。由图3.4可看出,SHT11的输出特性呈一定的非线性,为了补偿湿度传感器的非线性,可按如下公式修正湿度值:Rhlinear=C1+C2SORH+C3SORH2式中,SORH为传感器相对湿度测量值,系数取值如下:12位:SORH:C1=-4,C2=0.0405,C3=-2.8×10-68位:SORH:C1=-4,C2=0.648,C3=-7.2×10-4(2)温度值输出由于SHT11温度传感器的线性非常好,故可用以下公式将温度数字输出转换成实际温度值:T=d1+d2SOT当电源电压为5V,且温度传感器的分辨率为14位时,d1=-40,d2=0.01,当温度传感器的分辨率为12位时,d1=-40,d2=0.04。(3)露点计算[17]空气的露点值可根据相对湿度和温度值来得出,具体的计算公式如下:LogEW=(0.6607+5T/(237.3+T)+[log10(RH)-2]Dp=[(0.66077-logEW)×237.3]/(logEW-8.16077)存放器配置SHT11传感器中的一些高级功能是通过状态存放器来实现的,存放器各位的类型及说明见表1所列[18]。下面对存放器相关位的功能说明:(1)加热使芯片中的加热开关接通后,传感器温度大约增加5℃,从而使功耗增加至8mA*5v。加热用途如下:●通过对启动加热器前后的温、湿度进行比拟,可以正确地区别传感器的功能;●在相对湿度较高的环境下,传感器可通过加热来防止冷凝。(2)低电压检测SHT11工作时可以自行检测VDD电压是否低于2.45V,准确度为±0.1V。(3)下载校准系数为了节省能量并提高速度,OTP在每次测量前都要重新下载校准系数,从而使每一次测量节省8.2ms的时间。(4)测量分辨率设定将测量分辨率从14位〔温度〕和12位〔湿度〕分别减到12位和8位可应用于高速或低功耗场合。表1SHT11状态存放器类型及说明位类型说明默认值7保存06读工检限〔低电压检查〕X5保存04保存03只用于试验,不可以使用02读/写加热0关1读/写不从OTP重下载0重下载0读/写'1'=8位相对湿度,12位温度分辨率。'0'=12位相对湿度,14位湿度分辨率012位相对湿度,14位湿度接口电路AT89C51与SHT11的接口电路如图3.5所示。图中,SHT11的DATA端口通过一个10K的外部上拉电阻与单片机连接。由于P2口内部已有上拉电阻,所以本次设计DATA端口连接单片机的P2.7口时不需要上拉电阻。图3.5AT89C51与SHT11的接口电路3.2单片机系统硬件设计本系统中,我们采用美国ATMEL〔爱特梅尔〕公司生产的AT89C51单片机作为主控芯片[19]。AT89C51单片机是一种低功耗、高性能CMOS8位微控制器,具有4K在系统可编程Flash存储器。使用ATMEL公司高密度非易失性存储器技术制造,与工业8051产品指令和引脚完全兼容[20]。AT89C51具有以下标准功能:4k字节Flash,128字节RAM,32位I/O口线,两个16位定时器/计数器,可编程串行通道,5个中断源,低功耗的闲置和掉电模式,片内晶振及时钟电路。图3.6所示为AT89C51单片机最小系统原理图[21]。图3.6AT89C51最小系统图3.7串口通信模块电路图3.6AT89C51最小系统图3.7串口通信模块电路3.3RS232串口通信模块硬件设计AT89C51有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比方电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换[22]。采用三线制连接串口,也就是说单片机和电脑的9针串口只连接其中的4根线:第5脚的GND、第2脚的RXD、第3脚的TXD与第4脚。具体电路图如图3.7所示。3.4LCD显示硬件设计图3.81602引脚图由于本次设计要求实时显示时钟、温湿度和键盘调整提示信息,所以传统的LED数码管远远不能满足要求,在这里我们采用1602工业字符型液晶,能够同时显示16X02即32个字符。〔16列2行〕如图3.8所示图3.81602引脚图1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,如表2〔引脚说明〕表3〔存放器选择控制〕所示:表21602引脚说明引脚符号功能说明1VSS一般接地2VDD接电源〔+5V〕3V0液晶显示器比照度调整端,接正电源时比照度最弱,接地电源时比照度最高〔比照度过高时会产生“鬼影〞,使用时可以通过一个10K的电位器调整比照度〕。4RSRS为存放器选择,高电平1时选择数据存放器、低电平0时选择指令存放器。5R/WR/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。6EE(或EN)端为使能(enable)端,下降沿使能。7DB0低4位三态、双向数据总线0位〔最低位〕8-10DB1-3低4位三态、双向数据总线1-3位11-13DB4-6高4位三态、双向数据总线4-6位14DB7高4位三态、双向数据总线7位〔最高位〕〔也是busyflag〕15BLA背光电源正极16BLK背光电源负极表3存放器选择控制RSR/W操作说明00写入指令存放器〔去除屏等〕01读busyflag〔DB7〕,以及读取位址计数器〔DB0~DB6〕值10写入数据存放器〔显示各字型等〕11从数据存放器读取数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.busyflag〔DB7〕:在此位为被去除为0时,LCD将无法再处理其他的指令要求[23]。3.5键盘控制模块硬件设计在单片机应用系统中,按接口形式上分键盘分两大类:编码键盘和非编码键盘。编码键盘是由硬件逻辑电路完成必要的键识别工作与可靠性措施。每按一次键,键盘自动提供被按键的读数,同时产生一选通脉冲通知微处理器,一般还具有反弹跳和同时按键保护功能。这种键盘易于使用,但硬件比拟复杂,对于主机任务也很繁重。非编码键盘主要有独立式按键结构和矩阵式按键结构[24]。矩阵式键盘适用于按键数量较多的场合,由行线和列线组成,按键位于行列的交叉点上,节省I/O口。独立式按键就是各按键相互独立,每个按键单独占用一根I/O口线,每根I/O口线的按键工作状态不会影响其他I/O口线上的工作状态。因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。具有电路配置灵活,软件结构简单的优点。此键盘是用于按键较少或操作速度较高的场合。图3.9键盘控制模块由于本次设计只用到5个键,所以采用独立式键盘,在程序设计中采用查询的方式来识别按键。本次设计共5个键,分别为时钟调整键〔S5〕、加一键〔S4〕、减一键〔S3〕、上下温度设置〔S2〕、上下湿度设置〔S1〕。如图3.9所示。图3.9键盘控制模块注:由于键盘使用的是单片机的P0口,所以必须上拉电阻。3.6报警接口模块硬件设计在微型计算机控制系统中,为了平安生产有紧急状态报警系统采集的数据或通过计以便提醒操作人员注意对于一些重要的参数或系统部位,都设或采取紧急措施。其方法就是把计算机算机进行数据处理、数字滤波,标度变换之后,与该参数上下限给定值进行比拟,如果高于上限值(或低于下限值)那么进行报警,否那么就作为采样的正常进行显示和控制[24]。本设计采用蜂鸣器和发光二极管报警电路。蜂鸣器报警接口电路的设计只需购置市售的压电式蜂,然后通过AT89C51的1根口线经驱动器驱动蜂鸣音发声。压电式蜂鸣器约需l0mA的驱动电流,可以用一个晶体三极管驱动,利用单片机软件延时使单片机产生间断的报警时,同时相应的发光二极管点亮。如图3.10所示。图3.10报警电路3.7时钟模块硬件设计本次设计的时钟模块选用美国DALLAS公司推出DS1302,它具有涓细电流充电能力的低功耗实时时钟电路结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM存放器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。DS1302的引脚排列,其中VCC1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或VCC2两者中的较大者供电。当VCC2大于VCC1+0.2V时,VCC2给DS1302供电。当VCC2小于VCC1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位存放器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,那么会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在VCC>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向)。SCLK为时钟输入端[25]。DS1302有12个存放器,其中有7个存放器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份存放器、控制存放器、充电存放器、时钟突发存放器及与RAM相关的存放器等。时钟突发存放器可一次性顺序读写除充电存放器外的所有存放器内容。DS1302与RAM相关的存放器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM存放器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。如图3.11所示:图3.11时钟模块电路4系统软件设计本次设计软件系统主要包括:温湿度采集转换模块、键盘控制模块、LCD显示模块、串口通信模块等。4.1系统整体框架介绍系统初始化系统初始化温湿度数据采集处理LCD显示按键处理时钟显示报警处理利用T1定时,每隔1分钟向PC机发送一次数据图4.1系统整体的工作方式流程图当单片机上电复位后,蜂鸣器会发出“滴〞一声说明系统开始运行程序,时间日期和温湿度会实时显示的液晶显示器上,按下相应的功能键可以随时更改设置温湿度上下限和调整显示时间。当按下温度或湿度调整功能键时,LCD显示器上会有相应提示,继续按下直至正常显示温湿度表示退出设置,方便工作人员操作。当按下时钟调整功能键时,相应的被调整项伴有闪烁,继续按下会跳到下一项直至退出。按下系统运行后,每隔一分钟向PC机发送一次当前时间和温湿度数据,以便工作人员记录处理。当温湿度越限时,蜂鸣器会以500HZ的频率响起间断的报警声,相应的指示灯亮起。系统整体的工作方式如图4.1所示4.2温湿度采集转换模块软件设计SHT11传感器共有5条用户命令,具体命令格式见表4所列。下面介绍一下具体的命令顺序及命令时序。表4SHT11传感器命令列表命
令编
码说
明测量温度00011温度测量测量湿度00101湿度测量读存放器状态00111“读〞状态存放器写存放器状态00110“写〞状态存放器软启动11110重启芯片,去除状态记录器的错误记录11毫秒后进入下一个命令(1)传输开始初始化传输时,应首先发出“传输开始〞命令,该命令可在SCK为高时使DATA由高电平变为低电平,并在下一个SCK为高时将DATA升高。接下来的命令顺序包含三个地址位〔目前只支持“000〞〕和5个命令位,当DATA脚的ACK位处于低电位时,表示SHT11正确收到命令。(2)连接复位顺序如果与SHT11传感器的通讯中断,以下信号顺序会使串口复位:即当DATA线处于高电平时,触发SCK9次以上〔含9次〕,此后应接着发一个“传输开始〞命令。(3)温湿度测量时序当发出了温〔湿〕度测量命令后,控制器就要等到测量完成。使用8/12/14位的分辨率测量分别需要大约11/55/210ms的时间。为说明测量完成,SHT11会使数据线为低,此时控制器必须重新启动SCK,然后传送两字节的测量数据与1字节CRC校验和。控制器必须通过使DATA为低来确认每一个字节,所有的量均从右算,MSB列于第一位。通讯在确认CRC数据位后停止。如果没有用CRC-8校验和,那么控制器就会在测量数据LSB后保持ACK为高来停止通讯,SHT11在测量和通讯完成后会自动返回睡眠模式。需要注意的是:为使SHT11的温升低于0.1℃此时的工作频率不能大于标定值的15%〔如:12位精确度时,每秒最多进行3次测量〕。SHT11程序流程如图4.2所示复位复位启动计算湿度值并显示NNY写入测湿命令读出湿度数据计算温度值并显示N写入测温命令读出温度数据图4.2SH11程序流程图4.3键盘控制模块软件设计本系统采用独立式键盘,采用查询的方式来识别按键。五个键分别为:时钟调整键〔S5〕功能:依次按下可调节月、日、时和分,被选中的工程会伴有闪烁。上下温度设置〔S2〕功能:当第一次按下时,LCD第二行会有“SETHighT=〞的提示,表示设置温度上限,再按下时会有“SETLowT=〞提示,表示设置温度下限。第三次按下是确定并退出设置。上下湿度设置〔S1〕功能:与上下温度设置〔S2〕功能类似。加一功能键〔S3〕:显示的数字加一并显示。减一功能键〔S4〕:显示的数字减一并显示。4.4LCD显示模块软件设计本次设计显示模块采用1602液晶屏,对它的操作主要是将一些固定的字符写入1602的存放器中,当需要显示时调用即可,以到达在液晶上显示的效果。程序流程图如图4.3所示LCD初始化LCD初始化允许写数据写数据显示结束判断LCD忙NY图4.3LCD显示流程图4.5串口通信模块软件设计本次设计中,串口设置利用定时器0产生波特率为2400bps,波特率不倍增,设定工作方式2。程序流程图如图4.4所示串口初始化串口初始化启动定时器1发送数据等待发送数据去除数据传送标志关闭定时器1图4.4串口通信模块流程图5电路仿真图5.1整体仿真图图5.2温度上限报警仿真图图5.3温度上限设置仿真图图5.4实物仿真图本次设计采用Preteus7.5绘制原理图[26][27],KeilC51编辑编译程序。仿真如图5.1所示,VirtualTerminal窗口显示单片机发送给PC机的数据,每隔一分钟发送一次。温度上限报警如图5.2所示,蜂鸣器报警,D3发光二极管点亮。温度上限设置,如图5.3所示所做的实物是在51开发板的根底之上,加上SHT11传感器。仿真如图5.4所示6总结单片机技术在各个领域正得到越来越广泛的应用,尤其MCS-51系列单片机,迅速占领了工业测控和自动化工程应用的主要市场,并取得了令人瞩目的成果,展现出了广阔的应用前景。基于单片机的温湿度测量系统,采用AT89C51单片机和SHT11温湿度传感器,实现了对环境温湿度的自动测量和报警,8051单片机因其指令系统丰富、小巧、低价、灵活易扩展等独特的优点,在所设计的温湿度测量系统中使整个系统的性价比得以大幅度的提高。将8051单片机成功应用于温湿度测控系统,所研发产品可靠性和扩充性较强,能广泛应用于粮库、物流仓储、档案馆、农业大棚等对温湿度要求较高的场所,具有较大的市场推广前景。当然此设计也存在缺乏之处,软件仿真时钟正常〔已排除DS1302直接调用PC机时间的问题〕,实物仿真就不能正常显示。通过设计使我对单片机有了更深刻的了解,尤其是让我学会了如何使用一个完全陌生的元件,通过查阅各种资料,对新元件从陌生到熟悉直至灵活应用,这种自学的方法会使我终生受益。附录A电路原理图附录B局部程序//********************************************// 启动SHT11//********************************************voidstart_sht11(void){DATA=1;SCK=0;//数据为1,SCK=0_nop_();SCK=1;//第一个脉冲_nop_();DATA=0;//数据跌落_nop_();SCK=0;//完成一个脉冲_nop_();_nop_();_nop_();SCK=1;//再一个脉冲_nop_();DATA=1;//数据变为1 _nop_();SCK=0;//完成该脉冲 }//********************************************// 复位 SHT11//********************************************voidsht_rest(void){uchari;DATA=1;SCK=0;//数据为1时钟为0for(i=0;i<9;i++)//9个脉冲为复位{SCK=1;SCK=0;}start_sht11();//启动}//********************************************//测量温度或者是温度,返回校验值//*******************************************text_a(ucharml) { uinti; start_sht11(); //启动 write(ml); //写入测温度 if(ack==1) { sht_rest(); //复位write(ml); //写入测温度}for(i=0;i<65535;i++)if(DATA==0)break; //判断是否处于忙 read(); //读温度}//********************************************//读一个字节返回应答信号//********************************************charread(){uchari,val=0;temp_l=0;temp_h=0;////高8位/////////////////////////////DATA=1;//释放数据总线for(i=0x80;i>0;i/=2)//位移8位{SCK=1;//上升沿读入if(DATA)val=(val|i);//确定值SCK=0; }DATA=0;//读应答信号,有应答为1,为应答为0通过CPU下拉为应答SCK=1;//第9个脉冲_nop_();_nop_();_nop_();//pulswithapprox.5usSCK=0; DATA=1;//释放数据总线temp_h=val;val=0;////低8位/////////////////////////////DATA=1;//释放数据总线for(i=0x80;i>0;i/=2)//位移8位{SCK=1;//上升沿读入if(DATA)val=(val|i);//确定值SCK=0; }DATA=1;//0;//不需要应答通过CPU下拉为应答SCK=1;//第9个脉冲_nop_();_nop_();_nop_();//pulswithapprox.5usSCK=0; DATA=1;//释放数据总线temp_l=val;}//********************************************//写一个字节返回应答信号//********************************************charwrite(ucharvalue){uchari;ack=0;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;//第9个脉冲if(DATA==1)ack=1;//读应答信号SCK=0;returnack;//error=1表示没有应答}//********************************************//计算温度//********************************************text_jishuan_temp(){floataa=0,bb=0,temp_zi; aa=(float)temp_h*256+(float)temp_l; temp_zi=0.01*aa-40; if(temp_zi<0){ temp_zi=0;}temp_zi=temp_zi*10;xianzhi_t=(int)temp_zi+1;//给显示值}//********************************************//计算湿度//********************************************text_jishuan_humi(){floataa=0,bb=0,humi_zi; aa=(float)temp_h*256+(float)temp_l; bb=aa*aa*2.8/1000000; aa=0.0405*aa; aa=aa-6-bb; humi_zi=aa; humi_zi=humi_zi*10;xianzhi_h=(int)humi_zi; //给显示值}//********************************************//温湿度处理//********************************************text_jishuan_temp11(){ error=0; ack=0;sht_rest();//复位 text_a(TEMP_ML); text_jishuan_temp();//计算温度值 text_a(HUMI_ML); text_jishuan_humi();//计算湿度值}//********************************************// 延时程序//********************************************delay(inti){while(--i);}//********************************************//判断LCD忙 //********************************************voidcheck_busy(void){ while(1) { P1=0xff; E=0; _nop_(); RS=0; _nop_(); _nop_(); RW=1; _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); if((P1&0x80)==0)break; E=0; }}//******************************************//将数据码写入LCD数据存放器//******************************************voidwrite_command(uchartempdata){E=0; _nop_(); _nop_(); RS=0; _nop_(); _nop_(); RW=0; P1=tempdata; _nop_(); _nop_(); E=1; _nop_(); _nop_(); E=0; _nop_(); check_busy();}//*******************************************//写LCD1602使能程序//*******************************************voidwrite_data(uchartempdata){E=0; _nop_(); _nop_(); RS=1; _nop_(); _nop_(); RW=0; P1=tempdata; _nop_(); _nop_(); E=1; _nop_(); _nop_(); E=0; _nop_(); check_busy();}//********************************************//初始化LCD1602//********************************************voidinit(){write_command(0x01); //去除屏幕write_command(0x38); //功能设定〔8位,2行,5*7点矩阵)write_command(0x0C); //显示器ON,光标OFF,闪烁OFFwrite_command(0x06); //加1}//********************************************//显示子程序//********************************************voiddisplay_T(void){uchari;display[2]=LCDData[xianzhi_t/100];display[3]=LCDData[(xianzhi_t%100)/10];display[10]=LCDData[xianzhi_h/100];display[11]=LCDData[(xianzhi_h%100)/10];write_command(0xc0);for(i=0;i<13;i++){write_data(display[i]);}}//************************************//1302时钟主程序//************************************voidshizhong(){uchartemp;write1302(0x8e,0x00); //允许写1302write1302(0x90,0xa6); //1302充电,充电电流1.1mA month=read1302(0x89); //读出月存放器 temp=month;display1[1]=LCDData[temp&0x0f]; //月别离,并找相应的ASCALL码值, //存入缓存数组中 temp=temp>>4; display1[0]=LCDData[temp&0x0f];day=read1302(0x87); //读出日存放器 temp=day;display1[4]=LCDData[temp&0x0f]; //日别离,并找相应的ASCALL码值, //存入缓存数组中 temp=temp>>4; display1[3]=LCDData[temp&0x0f];hour=read1302(0x85); //读出小时存放器 temp=hour;display1[7]=LCDData[temp&0x0f];//小时别离,并找相应的ASCALL码值, //存入缓存数组中temp=temp>>4;display1[6]=LCDData[temp&0x0f];mintue=read1302(0x83); //读出分存放器 temp=mintue;display1[10]=LCDData[temp&0x0f];//分钟别离,并找相应的ASCALL码值, //存入缓存数组中temp=temp>>4;display1[9]=LCDData[temp&0x0f];second=read1302(0x81); //读出秒存放器 temp=second;display1[13]=LCDData[temp&0x0f]; //秒别离,并找相应的ASCALL码值, //存入缓存数组中temp=temp>>4;display1[12]=LCDData[temp&0x0f];display1302();}//********************************************//报警及处理//********************************************doing(){charxianzhi_mi;xianzhi_mi=xianzhi_t/10; //温度if((xianzhi_mi<setzhi_T_h)&(xianzhi_t>setzhi_T_l)){motor=0;hot=0;speek=1;}if(xianzhi_mi>setzhi_T_h){motor=1;hot=0;speek=1;delay(3000);speek=0;delay(15000);}if(xianzhi_mi<setzhi_T_l){motor=0;hot=1;speek=0;delay(15000);speek=1;delay(3000);}xianzhi_mi=xianzhi_h/10; //湿度if((xianzhi_mi<setzhi_H_h)&(xianzhi_t>setzhi_H_l)){speek=1;HSX=0;HXX=0;}if(xianzhi_mi>setzhi_H_h){HSX=1;speek=0;delay(15000);speek=1;delay(3000);}if(xianzhi_mi<setzhi_H_l){HXX=1;speek=0;delay(15000);speek=1;delay(3000);}}//********************************************//温湿度按键识别//********************************************key(){ while(setH==0) //是否按下湿度设置{delay(50);if(setH==1) //是否放开湿度设置消除抖动 { if(setkey==0){setkey=1;display_H_h(setzhi_H_h);} else{if(setkey==1){setkey=2;display_H_l(setzhi_H_l);} else{if(setkey==2){setkey=0;display_T();}} } }}while(setT==0) //是否按下温度设置{delay(50);if(setT==1) //是否放开温度设置消除抖动 { if(setkey==0){setkey=3;display_T_h(setzhi_T_h);} else{if(setkey==3){setkey=4;display_T_l(setzhi_T_l);} else{if(setkey==4){setkey=0;display_T();}} } }}if(setup==0) //是否按下+{if(setkey==1) {if(setzhi_H_h<=99)setzhi_H_h++;display_H_h(setzhi_H_h);} if(setkey==2) {if((setzhi_H_l<setzhi_H_h)&(setzhi_H_l<=99))setzhi_H_l++;display_H_l(setzhi_H_l);}if(setkey==3) {if(setzhi_T_h<=99)setzhi_T_h++;display_T_h(setzhi_T_h);} if(setkey==4) {if((setzhi_T_l<setzhi_T_h)&(setzhi_T_l<=99))setzhi_T_l++;display_T_l(setzhi_T_l);}} if(setdown==0) //是否按下-{ if(setkey==1) {if((setzhi_H_h>setzhi_H_l)&setzhi_H_h>=1)setzhi_H_h--;display_H_h(setzhi_H_h);} if(setkey==2) {if(setzhi_H_l>=1)setzhi_H_l--;display_H_l(setzhi_H_l);}if(setkey==3) {if((setzhi_T_h>setzhi_T_l)&setzhi_T_h>=1)setzhi_T_h--;display_T_h(setzhi_T_h);} if(setkey==4) {if(setzhi_T_l>=1)setzhi_T_l--;display_T_l(setzhi_T_l);}} }//********************************************//串口发送数据//********************************************voidsend_chuankou(void){uchari=0;SCON=0x50; //设定串
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度围栏制作安装工程环保监测合同2篇
- 2024版二手房产卖买合同3篇
- 2024年木柜加工与装配合同书
- 2025年度智能家电售后服务第三方担保购销合同
- 2024年版劳动合同解除诉讼状3篇
- 2025年青海省安全员《C证》考试题库及答案
- 2025版房地产融资居间服务合同模板36篇
- 二零二五年度UPS不间断电源采购与智能化升级合同
- 2024年版权许可协议及技术支持服务合同
- 2025年度5G通信网络建设项目服务合同3篇
- 锚杆锚索钻机操作规程
- 《录音技术与艺术》课程教学大纲
- 部编版七年级语文上下册教材解读分析精编ppt
- InternationalSettlementsLecture3InternationalClearingSystems
- (完整版)景观园林工程施工规范和技术要求
- (完整版)六年级转述句练习题
- 苏武传作文素材整理-
- 小学一年级班会课教案汇编 全册
- 公司董事会、总经理办公会议事清单.docx
- 煤矿矿井供电设计(DOC26页)
- 中国鹤翔庄气功之五站桩功
评论
0/150
提交评论