基于STC89C52单片机的温湿度检测系统设计_第1页
基于STC89C52单片机的温湿度检测系统设计_第2页
基于STC89C52单片机的温湿度检测系统设计_第3页
基于STC89C52单片机的温湿度检测系统设计_第4页
基于STC89C52单片机的温湿度检测系统设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

基于STC89C52单片机的温湿度检测系统设计摘要随着人们的生活及其生产水平的不断提高,对生活环境和生产环境的要求就显的尤为重要,温湿度的控制就是一个典型的例子,因此温湿度检测系统就是现代生产生活中应运而生的一种智能、快捷、方便可靠的检测系统,特别是在工业生产中如果检测得不准确就会发生许多的生产事故。要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向开展。本设计是以单片机为核心,配合温湿度传感器,以及相关的外围电路组成的检测系统,可以接收所测环境的温度和湿度信号,检测人员可以通过LCD显示的数据,实时监控环境的温度和湿度情况。所有的测量操作都可以通过主机控制软件来实现,温度和湿度传感器得到的测量信号,经电路转换为电信号,然后通过转换送到单片机进行数据处理,经软件分析处理后送显示装置。本系统包括系统硬件和软件设计,可靠性高,结构简单,实现了对温湿度的自动调节。系统还应用RS232与上位机相连接,可以设置自动记录温度、湿度的相关的参数,也可以设置每隔一定的时间自动记录,可用在气象的观察方面。关键词:STC89C52单片机,温湿度传感器,LCAspeoplelifelevelofproductionandimprovethelivingenvironmentandproductionenvironmenttothedemandsofthesignificantparticularlyimportant,controloftemperatureandhumidityisoneexample,sothetemperatureandhumiditydetectionsystemisthemodernproductionandlifeofakindofintelligencehaveemergedin,quick,convenientandreliabledetectionsystem,especiallyintheindustrialproduction,ifdetectionisnotaccuratewillhappenmanyproductionaccidents.Formodernpeopletowork,scientificresearch,andprovideabetterlifemoreconvenientfacilitieswillneedfromsinglechiptechnologyofdigitalcontroltoall,intelligentcontroldirection.Thisdesignisbasedonsinglechipmicrocomputerasthecore,withtemperatureandhumiditysensor,andrelatedperipheralcircuitcomposedofdetectionsystem,canreceivetheenvironmenttemperatureandhumiditysignal,testingpersonnelcanthroughtheLCDdisplaydata,real-timemonitoringofenvironmentaltemperatureandhumidityconditions.Thissystemincludingthesystemhardwareandsoftwaredesign,highreliability,simplestructure,realizetheautomaticadjustmentofthetemperatureandhumidity.SystemisusedRS232andsuperordinationmachineconnected,cansetupautomaticrecordingoftemperatureandhumidityinrelatedparameters,canalsoseteverycertaintimetobeautomaticrecords,canbeusedinmeteorologicalobservation.Keywords:STC89C52microcontroller,temperatureandhumiditysensor,LCDdisplay目录第1章概述21.1课题的研究背景21.2温湿度检测的开展状况以及存在的问题31.3本课程设计的主要内容4第2章系统总体方案设计42.1温湿度传感器51、DHT11产品概述52接口说明53、电源引脚64、串行接口(单线双向)65、DHT11引脚说明66、焊接信息67、考前须知72.2RS232接口72.3单片机STC89C5272.4LCD16029第3章系统的硬件设计和连接103.1主控模块103.2显示模块123.3温度和湿度采集模块123.4键盘设计143.5与上位机相连电路的设计153.6报警电路设计15第4章系统软件方案的设计164.1程序流程图16第5章总结与展望36参考文献37第1章概述1.1课题的研究背景工业生产中有些场合需要使用精密的机台设备,这些设备的精密度高、价格高,因此为了保证产品的质量及机台的使用寿命,对其环境的要求也很高,尤其的是对温度、湿度的控制。例如在我工作的生产发光二极管LED的工业现场,前面的两道工序固晶片和焊线要求的精度非常高,晶片必须固到碗杯的中心点,偏差不可超过1/5晶片的宽度,且对胶量的控制也有严格的要求,只有这道工序做好了,下一个工序焊线才会顺利,否那么焊线将会出现很多异常,不仅会降低产量也会造成质量问题,因此要求每三个小时记录一次室内的温湿度,且要保证其温度在18℃--23随着信息产业的开展及工业化的进步,温度和湿度不仅仅表现在以上几个方面直接或间接影响着人类根本生活条件,还表现在对工生物制品、医药卫生、科学研究、国防建设等方面的影响。针对以上情况,研制可靠且实用的温湿度控制器显得非常重要。常用温湿度传感器的非线性输出及一致性较差,使温湿度的测量方法和手段相对较复杂,且给电路的调试带来很大的困难。传统的温湿度测量多采用模拟小信号传感器,不仅信号调理电路复杂,且温湿度值的标定过程也极其复杂,并需要使用昂贵的标定仪器设备。因此对于温湿度控制器的设计有着很大的现实生产意义。本文设计的是基于单片机STC89C52的温湿度检测和控制系统,主要以广泛应用的DHT11作为温度和湿度的检测,该仪器具有测量精度较高、硬件电路简单、并能很好的进行显示,可测试不同环境温湿度的特点。另外和控制电路相连,可以进行加湿电路和除湿电路的控制,使温度和湿度参数在预先设定的范围内,不需要人的直接参与。本系统还通过RS232和上位机相连,可以设置每隔一定的时间进行温度和湿度的采集,上传到上位机,以供查询。1.2温湿度检测的开展状况以及存在的问题传统的温度和湿度检测系统主要有以下几种:〔1〕水汽压〔e〕:是水汽在大气总压力中的分压力。它表示了空气中水汽的绝对含量的大小,以毫巴为单位。〔2〕相对湿度〔rh〕:湿空气中实际水汽压e与同温度下饱和水汽压E的百分比,相对湿度的大小能直接表示空气距离饱和的相对程度。空气完全枯燥时,相对湿度为零。相对湿度越小,表示当时空气越枯燥。当相对湿度接近于100%时,表示空气很潮湿,越接近于饱和。〔3〕露点〔或霜点〕温度:指空气在水汽含量和气压都不改变的条件下,冷却到饱和时的温度。〔4〕干湿球温度表:用一对并列装置的、形状完全相同的温度表,一支测气温,称干球温度表,另一支包有保持浸透蒸馏水的脱脂纱布,称湿球温度表。〔5〕发湿度表〔计〕:利用脱脂人发〔或牛的肠衣〕具有空气潮湿时伸长,枯燥时缩短的特性,制成毛发湿度表或湿度自记仪器,它的测湿精度较差,毛发湿度表通常在气温低于-10℃〔6〕电阻式湿度片:利用吸湿膜片随湿度变化改变其电阻值的原理,常用的有碳膜湿敏电阻和氯化锂湿度片两种。前者用高分子聚合物和导电材料碳黑,加上粘合剂配成一定比例的胶状液体,涂覆到基片上组成的电阻片;后者是在基片上涂上一层氯化锂酒精溶液,当空气湿度变化时,氯化锂溶液浓度随之改变从而也改变了测湿膜片的电阻。〔7〕薄膜湿敏电容:是以高分子聚合物为介质的电容器,因吸收〔或释放〕水汽而改变电容值。它制作精巧,性能优良,常用在探空仪和遥测中。随着智能检测系统的飞速开展,基于单片机的温湿度检测系统将多传感器系统结合在一起。如何把多传感器集中于一个检测控制系统,综合利用来自多传感器的信息,获得对被测对象的可靠了解和解释,以利于系统做出正确的响应、决策和控制,是智能检测控制系统中需要解决的首要问题。在温湿度要求严格的场合,利用多传感技术可以提高系统的可靠性和精度,亦可以提高系统的时间空间的覆盖范围。1.3本课程设计的主要内容单片机是系统的控制核心,所以单片机的性能关系到整个系统的好坏。因此单片机的选择,对所设计系统的实现以及功能的扩展有着很大的影响。单片机种类很多,在众多51系列单片机中,较为常用的是ATMEL公司的AT89C51和AT89S52单片机,AT89C51片内4KROM是Flash工艺的,使用专用的编程器自己就可以随时对单片机进行电擦除和改写,片内有128字节的RAM。而AT89S52含有在系统可编程的Flash存储器,片内有8K闪存,RAM的容量也较AT89C51大,为256字节。显然这种单片机优点更多,开发时间也大为缩短。在本次设计中选用了STC89C52单片机。键盘接口电路较为简单,而显示局部有两种方案供选择:一种为LCD,一种为LED。LCD液晶显示的像素单元是整合在同一块液晶版当中分隔出来的小方格。通过数码控制这些极小的方格进行显像。显示非常细腻但是造价很高。而LED数码显示中每一个像素单元就是一个发光二极管,如果是单色,一般是红色发光二极管。如果是彩色,一般是三个三原色小二极管组成的一个大二极管。这些二极管组成的矩阵由数码控制实时显示文字或图象,造价相对低廉,显示效果也较好。本设计中,最终选用的集成温度传感器DHT11,采集到的温湿度信号送至单片机,实现温湿度的显示与控制。系统主要由以上元器件组成,通过硬件电路和软件程序的设计,实现系统的根本功能。第2章系统总体方案设计本设计是基于单片机对数字信号的高敏感和可控性、温湿度传感器可以产生模拟信号,和A/D模拟数字转换芯片的性能,此设计以STC89C52根本系统为核心的一套检测系统,其中包括单片机、复位电路、温湿度检测、键盘及显示、报警电路、系统软件等局部的设计。系统总体方框图如图2.1。键盘控制显示电路系统晶振电平变换PC机报警电路温湿度传感器单片机键盘控制显示电路系统晶振电平变换PC机报警电路温湿度传感器单片机系统重点及组成:温湿度的检测温湿度的显示单片机与PC机间的通信通过开关量控制实现温湿度上下限调节图2.1系统总体框图2.1温湿度传感器1、DHT11产品概述DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最正确选那么。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。2接口说明建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用适宜的上拉电阻3、电源引脚DHT11的供电电压为 3-5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚〔VDD,GND〕之间可增加一个100nF的电容,用以去耦滤波。4、串行接口(单线双向)DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取局部数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。5、DHT11引脚说明Pin名称注释1VDD供电3-5.5VDC2DATA串行数据,单总线3NC空脚,请悬空4GND接地,电源负极6、焊接信息手动焊接,在最高260℃的温度条件下接触时间须少于107、考前须知(1)防止结露情况下使用。(2)长期保存条件:温度10-40℃2.2RS232接口RS232接口是1970年由美国电子工业协会〔EIA〕联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备〔DTE〕和数据通讯设备〔DCE〕之间串行二进制数据交换接口技术标准〞。该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。随着设备的不断改良,出现了代替DB25的DB9接口,现在都把RS232接口叫做DB9。2.3单片机STC89C52STC89C52是一种低功耗、高性能CMOS八位微控制器,具有8K在系统可编程Flash存储器,使用ATMEL公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许ROM在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使其为众多嵌入式控制应用系统提供灵活的解决方案。2.3(1)与MCS-51单片机产品兼容;(2)8K字节在系统可编程Flash存储器;(3)1000次擦写周期;(4)全静态操作:0Hz~33Hz;(5)三级加密程序存储器;(6)32个可编程I/O口线;(7)三个16位定时器/计数器;(8)八个中断源;(9)全双工UART串行通道;(10)低功耗空闲和掉电模式;(11)掉电后中断可唤醒;图2.3STC89C52芯片的引脚图(12)看门狗定时器;(13)双数据指针;(14)掉电标识符。如图2.3所示STC89C52芯片的引脚图VCC:电源Vss:地P0口:8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”P1口:具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流〔IILP2口:具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动四个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流〔IIL〕。在方位外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动四个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流〔IILP3口亦作为STC89C52特殊功能〔第二功能〕使用RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。DISRTO默认状态下,复位高电平有效。ALE/:控制信号〔ALE〕是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚〔〕也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1〞,ALE操作将无效。这一位置“1〞,ALE仅在执行MOVX或MOVC指令时有效。否那么,ALE将被微弱拉高。这个ALE使能标志位〔地址为8EH的SFR的第0位〕的设置对微控制器处于外部执行模式下无效。:外部程序存储器选通信号〔〕是外部程序存储器选通信号。当89S52从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而在访问外部数据存储器时,将不被激活。/VPP:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,必须接地。为执行内部程序指令,应该接VCC。在Flash编程期间,也接收12伏VPP电压。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。2.4LCD1602工业字符型液晶,能够同时显示16x02即32个字符。〔16列2行〕1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:引脚符号功能说明1VSS一般接地2VDD接电源〔+5V〕3V0液晶显示器比照度调整端,接正电源时比照度最弱,接地电源时比照度最高〔比照度过高时会产生“鬼影〞,使用时可以通过一个10K的电位器调整比照度〕。4RSRS为存放器选择,高电平1时选择数据存放器、低电平0时选择指令存放器。5R/WR/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。6EE(或EN)端为使能(enable)端,下降沿使能。7DB0低4位三态、双向数据总线0位〔最低位〕8DB1低4位三态、双向数据总线1位9DB2低4位三态、双向数据总线2位10DB3低4位三态、双向数据总线3位11DB4高4位三态、双向数据总线4位12DB5高4位三态、双向数据总线5位13DB6高4位三态、双向数据总线6位14DB7高4位三态、双向数据总线7位〔最高位〕〔也是busyflag〕15BLA背光电源正极16BLK背光电源负极存放器选择控制表RSR/W操作说明00写入指令存放器〔去除屏等〕01读busyflag〔DB7〕,以及读取位址计数器〔DB0~DB6〕值10写入数据存放器〔显示各字型等〕11从数据存放器读取数据第3章系统的硬件设计和连接3.1主控模块采用STC89C52单片机作为系统的控制器。Pl口控制数码管显示温度和湿度值。P2口与DHT11连接.实现湿度模拟电压量转换为数字量便于单片机处理。键盘控制采用PO口.其中PO.O是温度的设置,PO.1是湿度的设置,PO.2/PO.3是分别对温度与湿度的上/下限值进行设置。原理如下列图:图3.1STC89C52单片机各引脚功能3.2显示模块3.3温度和湿度采集模块1.通讯过程如图1所示图1总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。图2总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,那么DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。数字0信号表示方法如图4所示图4数字1信号表示方法.如图5所示 图53.4键盘设计用了几个简单的按键将它们拼成了一个简易的键盘。为提高CPU的效率,键盘采用中断方式。按键对单片机的接口电路图如下图。行信号〔KEY〕接到高电平,当没有键按时,行线与列线〔KEYSCAN〕是断开的,且行线都是高电平〔1111〕,行信号作为的输入端、列信号作为的输出端。可以设置列线初始状态为低电平〔0000〕。信号为从上到下的顺序

当有键按下时,假设是K1按下,行信号与列信号接通,这时相应的行线〔KEY0〕变为低电平〔01111〕,可以肯定第一行〔K1,5,9,13〕有键按下。

下面就要运用扫描的原理了:

1、因为只知道第一行有键按下,不知道是那个,可以设置列信号为0111,这时行信号变为〔1111〕〔注:假设时钟周期很短,手还没松开,即键还在按下的状态〕

2、设置列信号为1011,行信号也变成〔1111〕

3、设置列信号为1101,行信号也变成〔1111〕

4、设置列信号为1110,行信号也变成〔0111〕,这时就可以肯定是第一个键按下。

3.5与上位机相连电路的设计通过和MAX232和上位机相连接,如图3-9所示。在大气气候的检测中需要做记录时,可以通过设置单片机的参数,每隔一定的时间进行自动的做记录,省去人工的记录麻烦。Max232的T1IN和单片机的P3.2相连,R1OUT和单片机的P3.1相连。图3.5单片机系统与上位机的连接3.6报警电路设计NPN5.6K3.3K+5VP3.2AT89S52PB2130UPNPN5.6K3.3K+5VP3.2AT89S52PB2130UP002A图3.6三极管驱动的峰鸣音报警电路第4章系统软件方案的设计温度控制主程序的设计应考虑以下问题:〔1〕温湿度采样,数字滤波;〔2〕越限报警和处理;〔3〕温度标度转换;〔4〕温湿度显示。通常,符合上述功能的温度控制程序由主程序和T0中断效劳程序两局部组成。在该软件系统中,定时器T0为工作方式1,定时周期为125ms,8次定时器中断为1S,由于实际环境温度和湿度变化是连续和平缓的,故这里采用分段定值平缓滤波算法处理每次测得的温度和湿度值,有效防止了突发干扰使测得值波动很大,导致反应系统关启工作,影响系统的稳定,提高了系统的抗干扰性。4.1程序流程图LCD1602头文件#ifndef__LCD_1602_CLIMBERWIN__#define__LCD_1602_CLIMBERWIN__#defineucharunsignedchar#defineuintunsignedint#include<intrins.h>#include"lcd1602define.h"/******PortDefinitions*****/#defineLCD_DataP0//LCD的数据口sbitLCD_BF=LCD_Data^7;//LCD忙信号位sbitLCD_RS=P2^7;sbitLCD_RW=P2^6;sbitLCD_EN=P2^5;unsignedchardis_buf[3];//数值显示缓冲区unsignedchartable[11]="0123456789";//字码/*定义子程序*/voidLCD_ClrAll(void);//清屏voidJudge_LCD_busy(void);//检测是否忙碌voidLCD_Write(ucharWriteData);//写控制字voidLCD_write_data(ucharLCD_data);//写数据显示voidLCD_cursor(ucharx);//光标起始地址voidLCD_printc(unsignedcharlcd_data);//输出一个字符voidLCD_prints(unsignedchar*lcd_string);//输出字符串voiddelay_ms(unsignedchari);//1ms延时//************************************************************************/*LCD1602忙碌判断子程序*/voidJudge_LCD_busy(void)//判断LCD1602是否忙状态{while(1){LCD_EN=0;LCD_RS=0;LCD_RW=1;LCD_Data=0xff;LCD_EN=1;//EN是1—0使能if(!LCD_BF)break;//LCD_BF=1表示忙碌,需要等待。}LCD_EN=0;}/******LCD清屏***************/voidLCD_ClrAll(void){Judge_LCD_busy();//判断是否忙碌LCD_RS=0;LCD_RW=0;LCD_Data=0x01;LCD_EN=1;LCD_EN=0;}/*******LCD写数据定义各种模式*********/voidLCD_Write(ucharWriteData)//写指令到LCD{Judge_LCD_busy();LCD_RS=0;LCD_RW=0;LCD_Data=WriteData;//把WriteData的数据送到数据口LCD_EN=1;LCD_EN=0;}/********LCD显示数据***********/voidLCD_write_data(ucharLCD_data)//输出一个字节数据到LCD{Judge_LCD_busy();LCD_RS=1;LCD_RW=0;LCD_Data=LCD_data;LCD_EN=1;LCD_EN=0;}/****光标位置确实定***/voidLCD_cursor(ucharx)//LCD光标定位到x处{LCD_Write(0x80+x);//第一行地址是0x80}/*输出一个字符*/voidLCD_printc(unsignedcharlcd_data){LCD_write_data(lcd_data);}/*输出字符串*/voidLCD_prints(unsignedchar*lcd_string){unsignedchari=0;while(lcd_string[i]!=0x00){LCD_write_data(lcd_string[i]);i++;}}/*显示整数*/voidLCD_ints(unsignedcharnum){signedchari=0;for(i=0;i<3;i++)//拆分bcd{dis_buf[i]=num%10;;num=num/10;}for(i=2;i>0;i--)//灭零{if(dis_buf[i]==0)dis_buf[i]=10;elsebreak;}for(i=2;i>=0;i--)//逐个显示{LCD_write_data(table[dis_buf[i]]);}}/*初始化程序*/voidLCD_initial(void)//初始化LCD{LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF);LCD_Write(LCD_DISPLAY_DOUBLE_LINE);LCD_ClrAll();}#endifUART头文件bitflag_uart=0; //字符串接受完成后标志位置位,须软件复位unsignedcharS_LEN=4;unsignedcharRes_buf[20]={0};voidUart_init(){ ES=1; //setES SCON=0x52; //setSM1、RENandTI; TMOD=0x20; //setM1,方式2; TH1=0xf3; TL1=0xf3; //baudrate2400b/s TR1=1; //计数使能}voidUart_sc(unsignedcharbyte)//发送单字符{ while(!TI); SBUF=byte; TI=0;}voidUart_ss(unsignedchar*p,bitflag) //发送字符串{ while(*p) { Uart_sc(*p++); } if(flag==1) { Uart_sc(0x0D); Uart_sc(0x0A);//结尾发送回车换行 }}KEY头文件unsignedcharcoderow_scan[4]={0xef,0xdf,0xbf,0x7f};voiddelay_1ms(unsignedinti)//1ms延时{ unsignedcharx,j; for(j=0;j<i;j++) for(x=0;x<=40;x++); }unsignedcharkey_scan(){ unsignedchari,j; unsignedchartemp,key_vaul; for(i=0;i<4;i++) { P1=row_scan[i]; temp=0x01; for(j=0;j<4;j++) { if(!(P1&temp)) { key_vaul=i*4+j+1; while(!(P1&temp)); returnkey_vaul; } temp<<=1; } }}bitkey_check() //检测有无键按下{ bitkey_flag=0; //键标志。有键按下时为1 P1=0x0f; if(P1!=0x0f) { delay_1ms(1); if(P1!=0x0f) { key_flag=1; //有键按下 } elsekey_flag=0;//为抖动 } returnkey_flag;}DHT11头文件#ifndef__DHT11_H__#define__DHT11_H__sbit DT0 = P2^0;sbit DT1 = P2^1;sbitBEEP=P2^3;#defineOK1#defineERROR0#defineNUMBER20#defineSIZE5staticunsignedcharstatus;//存放五字节数据的数组staticunsignedcharvalue_array_0[SIZE];staticunsignedcharvalue_array_1[SIZE];inthumi_value0,temp_value0,humi_value1,temp_value1;voiddelay_ms(unsignedchari)//ms延时{ unsignedcharx,j; for(j=0;j<i;j++) for(x=0;x<=140;x++); }voiddelay(unsignedcharx)//x*0.14MS{ unsignedchari; while(x--) { for(i=0;i<13;i++){} }}voiddelay_1(unsignedcharx)//x*1.4MS{ unsignedchari; while(x--) { for(i=0;i<130;i++){} }}voidbeep(){ unsignedchari; BEEP=0; for(i=0;i<6;i++) { BEEP=!BEEP; delay_1(5000); delay_1(5000); } }voiddelay_10us(){unsignedchari;i--;i--;i--;i--;i--;i--;}voidNode_sensor_0(unsignedintTEP,unsignedintDAM,intflag_send){ unsignedchari,j,N=0; unsignedcharbuf[5]={0}; unsignedchartem,teml=10,temh=40; DT0=0; delay_ms(30); DT0=1; delay_10us(); delay_10us(); delay_10us(); delay_10us(); DT0=1; if(DT0==0) //是否响应信号 { while(DT0==0); //跳过80usDHT响应信号 while(DT0==1); //跳过80usDHT拉高信号 //准备接受温湿度数据 for(i=0;i<5;i++) { for(j=0;j<8;j++) { N=0; while(DT0==0);//bit数据头 while(DT0==1) { delay_10us();//适当延时 N++; } buf[i]<<=1; if(N>3)buf[i]++; } } DT0=1; //接受完成,准备校验数据 tem=buf[0]+buf[1]+buf[2]+buf[3]; if(tem==buf[4]) { //buf[2]=buf[2]-5; LCD_cursor(0); LCD_prints(""); LCD_cursor(0); LCD_prints("N1"); LCD_prints("T:"); LCD_cursor(0x04); LCD_ints(buf[2]); LCD_cursor(0x07); LCD_write_data(0xDF); LCD_write_data(0x43); LCD_cursor(0x0A); LCD_prints("HU:%"); LCD_cursor(0x0C); LCD_ints(buf[0]); if(flag_send==1) { LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON); Uart_ss("N1:",0); Uart_ss("Tem:",0); Uart_sc(buf[2]/10+48); Uart_sc(buf[2]%10+48); Uart_ss("度",0); Uart_ss("Hum:",0); Uart_sc(buf[0]/10+48); Uart_sc(buf[0]%10+48); Uart_sc(0xA3); Uart_sc(0xA5); Uart_sc(0x0D); Uart_sc(0x0A);//结尾发送回车换行 LCD_cursor(0x40); } else { LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF|LCD_CURSOR_BLINK_OFF); } teml=TEP; temh=TEP>>8; if((buf[2]<teml)||(buf[2]>temh))//温度低于于10度或高于40度时候报警 { beep();LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON); } else { BEEP=1;LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); } teml=DAM; temh=DAM>>8; if((buf[0]<teml)||(buf[0]>temh))//湿度低于15%或高于60%度时候报警 { beep();LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON); } else { BEEP=1;LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); } } } } voidNode_sensor_1(unsignedintTEP,unsignedintDAM,intflag_send){ unsignedchari,j,N=0; unsignedcharbuf[5]={0}; unsignedcharteml,temh; DT1=0; delay_ms(30); DT1=1; delay_10us(); delay_10us(); delay_10us(); delay_10us(); DT1=1; if(DT1==0) //是否响应信号 { while(DT1==0); //跳过80usDHT响应信号 while(DT1==1); //跳过80usDHT拉高信号 //准备接受温湿度数据 for(i=0;i<5;i++) { for(j=0;j<8;j++) { N=0; while(DT1==0);//bit数据头 while(DT1==1) { delay_10us();//适当延时 N++; } buf[i]<<=1; if(N>3)buf[i]++; } } DT1=1; //接受完成,准备校验数据 teml=buf[0]+buf[1]+buf[2]+buf[3]; if(teml==buf[4]) { //buf[2]=buf[2]-5; LCD_cursor(0x40); LCD_prints(""); LCD_cursor(0x40); LCD_prints("N2"); LCD_prints("T:"); LCD_cursor(0x44); LCD_ints(buf[2]); LCD_cursor(0x47); LCD_write_data(0xDF); LCD_cursor(0x48); LCD_write_data(0x43); LCD_cursor(0x4A); LCD_prints("HU:%"); LCD_cursor(0x4C); LCD_ints(buf[0]); if(flag_send==1) { LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON|LCD_CURSOR_BLINK_ON); Uart_ss("N2:",0); Uart_ss("Tem:",0); Uart_sc(buf[2]/10+48); Uart_sc(buf[2]%10+48); Uart_ss("度",0); Uart_ss("Hum:",0); Uart_sc(buf[0]/10+48); Uart_sc(buf[0]%10+48); Uart_sc(0xA3); Uart_sc(0xA5); Uart_sc(0x0D); Uart_sc(0x0A);//结尾发送回车换行 Uart_sc(0x0D); Uart_sc(0x0A);//结尾发送回车换行 } else { LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF|LCD_CURSOR_BLINK_OFF); } teml=TEP; temh=TEP>>8; if((buf[2]<teml)||(buf[2]>temh))//温度低于于10度或高于40度时候报警 { beep();LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON); } else { BEEP=1;LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); } teml=DAM; temh=DAM>>8; if((buf[0]<teml)||(buf[0]>temh))//湿度低于15%或高于60%度时候报警 { beep();LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON); } else { BEEP=1;LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); } } } } #endif主程序#include<reg51.h>#include"LCD1602.h"#include"LCD1602define.h"#include"uart.h"#include"KEY.h"#include"dht11.h"#defineucharunsignedchar#defineuintunsignedintuintTEP1=10250,TEP2=10250;uintDAM1=15375,DAM2=15375;//15375=60*256+10(60可以在高八位10在低八位)uchartemx[2],humx[2];uinttem_down=10,tem_up=40,hum_down=10,hum_up=60,number,t;intflag_true=0;voidDelay1ms(unsignedintcount);//延时程序voidshow_tem_hum();voidset_tem_up();voidset_tem_down();voidcomper_tem();voidset_hum_up();voidset_hum_down();voidcomper_hum();voidup_com();voidset_chose(uintflag,uintnum);voidshow_tem_hum(uintflag);intset_tem_key();intset_tem_key()//输入键值{uintflag1=0;uchari;while(1) { while(key_check()!=0) { i=key_scan(); switch(i) { case2:set_chose(flag1,1);flag1++;break; case3:set_chose(flag1,2);flag1++;break; case4:set_chose(flag1,3);flag1++;break; case6:set_chose(flag1,4);flag1++;break; case7:set_chose(flag1,5);flag1++;break; case8:set_chose(flag1,6);flag1++;break; case10:set_chose(flag1,7);flag1++;break; case11:set_chose(flag1,8);flag1++;break; case12:set_chose(flag1,9);flag1++;break; case15:set_chose(flag1,0);flag1++;break; default:break; } if(flag1==2)return1; } }}voidset_tem_down(){uintflag_down=0;LCD_ClrAll();while(1) { LCD_cursor(0); LCD_prints("settemdown:"); tem_down=0; while(1) { if(flag_down==0) { set_tem_key(); flag_down++; tem_down=number; LCD_cursor(0x40); LCD_prints("numberis:"); LCD_ints(tem_down); LCD_cursor(0x4d); LCD_write_data(0xDF); LCD_write_data(0x43); } if(key_scan()==16)break; } break; } comper_tem();}voidset_tem_up(){uintflag_up=0; LCD_ClrAll();while(1) { LCD_cursor(0); LCD_prints("settemup:"); tem_up=0; while(1) { if(flag_up==0) { set_tem_key(); flag_up++; tem_up=number; LCD_cursor(0x40); LCD_prints("numberis:"); LCD_ints(tem_up); LCD_cursor(0x4d); LCD_write_data(0xDF); LCD_write_data(0x43); } if(key_scan()==16)break; } break; }comper_tem();}voidcomper_tem(){ if(tem_up<tem_down) { LCD_ClrAll(); LCD_cursor(0); LCD_prints("YOUSETTHE"); LCD_cursor(0X40); LCD_prints("WRONGNUMBER"); LCD_cursor(0); for(t=0;t<50;t++)//延时1.5S左右 { delay_1ms(255); } LCD_prints("SYSTEMTHEN"); LCD_cursor(0x40); LCD_prints("RESTART"); for(t=0;t<50;t++)//延时1.5S左右 { delay_1ms(255); } TEP1=10250;TEP2=10250; tem_up=10;tem_down=40;} else { TEP1=tem_up*256+tem_down;TEP2=TEP1; LCD_cursor(0); LCD_prints(""); LCD_cursor(0X40); LCD_prints("");}}voidset_hum_down(){uintflag_down=0;LCD_ClrAll();while(1) { LCD_cursor(0); LCD_prints("sethumdown:"); hum_down=0; while(1) { if(flag_down==0) { set_tem_key(); flag_down++; hum_down=number; LCD_cursor(0x40); LCD_prints("numberis:"); LCD_ints(hum_down); LCD_cursor(0x4d); LCD_prints("%"); } if(key_scan()==16)break; } break; } comper_hum();}voidset_hum_up(){uintflag_up=0;LCD_ClrAll();while(1) { LCD_cursor(0); LCD_prints("sethumup:"); hum_up=0; while(1) { if(flag_up==0) { set_tem_key(); flag_up++; hum_up=number; LCD_cursor(0x40); LCD_prints("numberis:"); LCD_ints(hum_up); LCD_cursor(0x4d); LCD_prints("%"); } if(key_scan()==16)break; } break; } comper_hum();}voidcomper_hum(){ if(hum_up<hum_down) { LCD_ClrAll(); LCD_cursor(0); LCD_prints("YOUSETTHE"); LCD_cursor(0X40); LCD_prints("WRONGNUMBER"); LCD_cursor(0); for(t=0;t<50;t++)//延时1.5S左右 { delay_1ms(255); } LCD_prints("SYSTEMTHEN"); LCD_cursor(0x40); LCD_prints("RESTART"); for(t=0;t<50;t++)//延时1.5S左右 { delay_1ms(255); } DAM1=15375;DAM2=15375; hum_up=60;hum_down=10; } else { DAM1=hum_up*256+hum_down;DAM2=DAM1; LCD_cursor(0); LCD_prints(""); LCD_cursor(0X40); LCD_prints("");}}voidset_chose(uintflag,uintnum){ if(flag==0) number=10*num; if(flag==1) number+=num; }voidshow_tem_hum(uintflag){ if(flag==1) { LCD_ClrAll(); LCD_cursor(0); LCD_prints("temup:"); LCD_ints(tem_up); LCD_cursor(0x0c); LCD_write_data(0xDF); LCD_write_data(0x43); LCD_cursor(0x40); LCD_prints("temdown:"); LCD_ints(tem_down); LCD_cursor(0x4c); LCD_write_data(0xDF); LCD_write_data(0x43); for(t=0;t<100;t++) { delay_1ms(255); } } if(flag==2){ LCD_ClrAll(); LCD_cursor(0); LCD_prints("humup:"); LCD_ints(hum_up); LCD_cursor(0x0c); LCD_prints("%"); LCD_cursor(0x40); LCD_prints("humdown:"); LCD_ints(hum_down); LCD_cursor(0x4c); LCD_prints("%"); for(t=0;t<100;t++) { delay_1ms(255); } } }main(){uintflag_key=0;uchari=0;Uart_init();LCD_initial();//LCD初始化LCD_ClrAll();//LCD清屏LCD_cursor(0);//光标起始地址,第一行地址是0x00~0x0F,第二行地址是0x40~0x4fLCD_prints("MYSYSTEMBEGIN");LCD_cursor(0x40);LCD_prints("HAPPYNEWYEAR");for(t=0;t<50;t++)// { delay_1ms(255); }while(1) { Node_sensor_0(TEP1,DAM1,flag_true); Node_sensor_1(TEP2,DAM2,flag_true); for(t=0;t<25;t++) { delay_1ms(255); } if(key_check()!=0) { i=key_scan(); switch(i)

温馨提示

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

评论

0/150

提交评论