基于单片机温湿度多点采集系统的毕业论文_第1页
基于单片机温湿度多点采集系统的毕业论文_第2页
基于单片机温湿度多点采集系统的毕业论文_第3页
基于单片机温湿度多点采集系统的毕业论文_第4页
基于单片机温湿度多点采集系统的毕业论文_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

[请输入学校名称[请输入专业]基于单片机温湿度多点采集系统姓名:[请输入姓名]学号:[请输入学号]指导教师:[请输入指导教师] Time\@"yyyy年M月d日"2020年6月6日

TOC\o"1-3"\h\u10735摘要 31156Abstract 414312前言 52300系统总体方案设计 630194系统硬件设计 9268001.1单片机STC89C52的功能及最小系统的电路设计 953891.21602字符型LCD简介 12117441.2.11602LCD的基本参数及引脚功能 12180711.2.21602LCD主要技术参数: 13235681.2.3引脚功能说明 1385071.2.4基本操作时序表 1550351.3DHT11简介 16159901.3.1传感器性能说明 1781761.3.2接口说明 18239051.3.3 电源引脚 18105291.3.4串行接口(单线双向) 18318951.3.4测量分辨率 21218311.3.5电气特性 21113721.3.6封装信息 21133291.4AT24C02简介 2291762.系统软件设计 24303492.1程序流程图: 24137632.2按键电路流程: 25148002.3控制电路流程: 3129070谢辞 349166参考文献 3520755附录 3619431硬件电路图、PCB图 3610095源程序 37摘要温湿度控制已成为当今社会研究的热门项目。是工农业生产过程中必须考虑的因素。作为最常见的被控参数。温度和湿度已经不再是相互独立的物理量,而应在系统中综合考虑。广泛应用于实验室、大棚、花圃、粮仓乃至土壤等各个领域。而传统的温湿度控制则利用湿度表、毛发湿度表、双金属式测量计和湿度试纸等测试器材。通过人工进行检测。对不符合温度和湿度要求的库房进行通风、降温、去湿等操作。这种人工测试方法费时费力,效率低。切随机性较大。误差大。因此就需要一种造价低廉、使用方便且计算精确的温湿度控制仪器。利用单片机对温、湿度控制,具有控温、湿精度高、功能强、体积小、价格低,简单灵活等优点,很好的满足了工艺要求。本文通过使用STC89C52单片机、DHT11传感器模块、1602液晶显示屏模块。简单明了的实现的可提要求。DHT11数字温湿度传感器把采集到的温湿度数据传给单片机。经过单片机的处理。准确的显示到液晶屏上。并对温湿度设置上下限。关键词:单片机DHT11传感器1602液晶显示屏STC89C52Abstract

Temperatureandhumiditycontrolhasbecomeahotitemintoday'ssocialstudies.Isintheprocessofindustrialandagriculturalproductionfactorsmustbeconsidered.Asoneofthemostcommonwasaccusedofparameters.Temperatureandhumidityisnolongeraseparatephysicalquantities,butshouldbeconsideredinthesystem.Widelyusedinthelaboratory,greenhouses,flowerbeds,grainandsoilandotherfields.Whilethetraditionaltemperatureandhumiditycontrolofhumiditytable,hairhumiditytable,doublemetaltypegaugeandhumiditydipsticktestequipment,etc.Throughtheartificialdetection.Donotconformtotherequirementsofthetemperatureandhumidityofthewarehouseforventilation,coolinganddehumidificationoperation.Thiskindofmanualtestmethodistime-consumingandlaboriousefficiencyislow.Cuttherandomness.Errorislarge.Sotheyneedakindoflowcost,easytouseandaccuratetocalculatethetemperatureandhumiditycontrolinstrument.Usingthesinglechipmicrocomputertocontrolthetemperature,humidity,temperaturecontrol,wethighprecision,strongfunction,smallvolume,lowprice,theadvantagesofsimpleandflexible,goodtomeetthetechnologicalrequirements.Inthispaper,byusingaSTC89C52MCU,DHT11sensormodule,liquidcrystaldisplaymodule1602.Therealizationofthesimpleandclearcanaskfor.DHT11digitaltemperatureandhumiditysensortothetemperatureandhumidityofthecollecteddatatoMCU.Afterasingle-chipprocessing.AccuratedisplayontheLCDpanel.AndtheupperandlowertemperatureandhumiditySettings.

Keywords:singlechipmicrocomputer1602DHT11sensorSTC89C52LCDpanel前言目前随着生活质量的不断提高,人们的生活水平越来越高,所以对环境的要求也越来越高,环境控制的也成了人们安居乐业的基础,成了共建和谐环境的重要环节。尤其是目前生活节奏的加快,许多白领都出现了亚健康的状态,因此家庭温湿度的检测对于现代家庭来说也变得刻不容缓了。因此为了满足最适宜人们生活的最佳温度和湿度,我们需要研究一种家庭式的,便于提醒和控制温湿度的装置,人们可以根据不同季节以及个人的需要进行不同的调整,以便达到最佳的居住环境,这不仅仅是对于环境要求的进步,同时也体现了现代文明的发达与先进。为了更加有效的保证人们生活环境的安逸和舒适,同时也为了人们生活的更加健康,人们已不满于目前的居住环境,对家庭提出了更高的要求,智能化被引进了家庭,并且迅速在全国乃至世界范围内普遍发展开来,由于自然环境污染越来越严重,城市人口越来越多等,适宜人们生活的温度以及湿度越来越难以达到标准,常见的南北气候差异,北方冬天异常干燥,南方却阴冷潮湿,而对于我们来说,如何有效地在合适的时间内对环境作出相应的措施却始终难以把握,因此我们需要采取有效的措施,以满足人们的要求。系统总体方案设计功能要求1.对检测出的温湿度在软硬件上都有相应的处理。2.最少两个采集信息数据发射机。3.使用LCD液晶显示采集到的温湿度,并且可设置上下限。4.要有加热片。设计思路电路总体上分为温湿度采集部分、中央处理器、显示模块、控制部分以及报警模块部分。以STC89C52单片机最小系统作为核心控制电路,控制DHT11传感器采集的温湿度的转换,控制相应的操作,最后1602液晶屏显示,具体显示内容及方式由软件来完成。采集温湿度方面由DHT11传感器来完成,它是一个数字温湿度传感器、内置模数转换,可以直接与单片机相连接。而1602液晶屏是插针式,也可以直接与单片机相连接。因此不需要手动焊接等复杂的过程。具体步骤是:按照原理图将传感器、1602液晶显示屏分别接入单片机。通过DHT11传感器采集当前的温湿度值、再经单片机数据处理,判断控制,最后将处理后的数据传送到液晶屏上显示出来。可设置温湿度的上下限值。单片机主芯片选择方案方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大。其片内的4K程序存储器是FLASH工艺的,这种单片机对开发设备的要求很低,开发时间也大大缩短。写入单片机内的程序还可以进行加密,这又很好地保护我们的劳动成果。再者,AT89C51目前的售价比8031还低,市场供应也很充足。AT89C51可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。只要程序长度小于4K,四个I/O口全部提供给用户。可用5V电压编程,而且擦写时间仅需lOms。AT89C51芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手段,能完全保证程序或系统不被仿制。PO口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。方案二:STC89C52RC系列单片机的指令系统和AT89C51系列的完全兼容,但实际操作起来却存在很多问题:(1)AT89C51不带ISP下载,要用下载器才行,STC89C52RC可以用你的USB转串口下载,下载软件可以到STC厂家网上去下。(2)STC单片机执行指令的速度很快,大约是AT的3-30倍,尽管快是好事,但这样一来,你在AT上好使的程序在STC上不一定好用,最典型的例子就是那些对时序有严格要求的模块,用STC时注意得加长延时,大约是AT的10—30倍就差不多,这一点自己调试就知道了。(3)STC单片机对工作环境的要求比较低,电压低于5伏时仍然正常工作,甚至3伏到4伏之间都还可以工作,然而这样的环境下AT肯定不行了,所以当一个系统用STC单片机好用,但用AT的单片机不工作时,直接查最小系统,看单片机的供电是否正常。比较这两种方案,由于在学校期间学过数字电路、单片机原理、C语言程序设计,综合考虑单片机的各部分资源和作为学生能够获得的资源,经过对比此次设计要求,我选择用STC系列芯片完成。而且学校也提供了相应的硬件操作平台,实际操作起来比较方便,故STC为更合理的选择。显示器选择方案方案一:采用12864液晶显示屏。液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。可与CPU直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。方案二:采用HJ1602液晶显示屏。HJ1602A是一种工业字符型液晶,能够同时显示16x02即32个字符。(16列2行)。1602只能显示字母、数字和符号能显示16*2个字符,但寄存器不止32个,有一些显示效果,如字符一个个显示、字符从左到右或从右到左显示等等,显示效果简单。总结:在编程使用方面,两者难度差不多,原理差不多,都是写指令、写地址、写数据等等。当然12864液晶屏显示更全面、字符更多。相比于1602液晶屏、12864能更形象具体的实现显示功能。不过1602液晶屏也能实现设计的要求。网上买比较廉价,最低的六块钱左右。而12864液晶显示屏最便宜的也要四十块钱。从造价方面考虑,当然是价格低廉的优先。而HJ1602A就是最好的选择。传感器选择方案方案一:选用DS18B20温度传感器作为温度检测模块。DS18B20是一线式数字温度传感器。具有独特的单线式接口方式。测量范围在—55℃~125℃,—10℃~85℃,误差范围在-\+0.5℃。最高精度可达0.0625℃。HS1101是电容式湿度传感器。可测量相对湿度范围在0%~100%RH。误差为-\+2%RH。方案二:选用DHT11作为设计的温湿度检测模块。DHT11是一款集成型的数字温湿度一体传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。测量范围20%~90%RH,0℃~50℃。测温精度为-\+2℃,测湿精度为-\+5%RH。完全符合本次毕业设计的要求。经上述分析,方案一虽然精度更精确。却稍显复杂。方案二即便不能实现方案一的高精度测量。却也能满足设计要求。且简便易行。可靠稳定。具有超高的性价比。故选择方案二。存储芯片选择方案在大学里有使用AT24C02芯片,所以首选还是这一款。加热片选择方案采用淘宝上易于购买的220V恒温PTC铝壳陶瓷加热器加热板/发热片。其他硬件选择方案加湿器与小风扇选择5V电压驱动。总体硬件流程图系统硬件设计1.1单片机STC89C52的功能及最小系统的电路设计STC89C52是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用STC公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的STC89C52可为许多嵌入式控制应用系统提供高性价比的解决方案。STC89C52具有如下特点:40个引脚,8kBytesFlash片内程序存储器,256bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,片内时钟振荡器。另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。STC89C52共有四个8位的并行I/O口:P0、P1、P2、P3端口,对应的引脚分别是P0.0~P0.7,P1.0~P1.7,P2.0~P2.7,P3.0~P3.7,共32根I/O线。每根线可以单独用作输入或输出。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.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。在flash编程和校验时,P1口接收低8位地址字节。此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,p3输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。P3口亦作为STC89C52特殊功能使用,在flash编程和校验时,P3口也接收一些控制信号。单片机的引脚图如图3.3所示。图3.3STC89C52单片机引脚图单片机最小系统,是指用最少的元件与单片机组成的可以工作的系统。对52单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。单片机接口电路主要用来连接计算机和其他外部设备,各功能模块及原理如下:复位电路:单片机最小系统复位电路的极性电容C3的大小直接影响单片机的复位时间,一般采用10-30μF,51单片机最小系统容值越大需要的复位时间越短。单片机工作之后,只要在RST引线上加载10ms以上的高电平,单片机就能有效地复位。CS-51单片机通常采用自动复位和按键复位两种方式。这里采用按键复位和上电复位两种电路结合。晶振电路:典型的晶振取12MHZ,晶振越大,则单片机的处理速度越快。单片机的最小起振电容C1,C2一般采用15-33pF,并且电容离晶振越近越好。单片机最小系统的设计电路如图3.4所示。图3.4单片机最小系统的设计电路1.21602字符型LCD简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图10-53:图10-531602字符型液晶显示器实物图1.2.11602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:图10-541602LCD尺寸图1.2.21602LCD主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm1.2.3引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表10-13:引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。1.2.4基本操作时序表读写操作时序如图10-55和10-56所示:图10-55读操作时序图10-56写操作时序1.3DHT11简介DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。DHT11具有以下特点:►相对湿度和温度测量►全部校准,数字输出►卓越的长期稳定性►无需额外部件►超长的信号传输距离►超低能耗►4引脚安装 ►完全互换1.3.1传感器性能说明参数条件MinTypMax单位湿度分辨率111%RH16Bit重复性±1%RH精度25℃±4%RH0-50℃±5%RH互换性可完全互换量程范围0℃3090%RH25℃2090%RH50℃2080%RH响应时间1/e(63%)25℃,1m/s空气61015S迟滞±1%RH长期稳定性典型值±1%RH/yr温度分辨率111℃161616Bit重复性±1℃精度±1±2℃量程范围050℃响应时间1/e(63%)630S1.3.2接口说明建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻1.3.3 电源引脚DHT11的供电电压为 3-5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。1.3.4串行接口(单线双向)DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。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所示 图51.3.4测量分辨率测量分辨率分别为8bit(温度)、8bit(湿度)。1.3.5电气特性VDD=5V,T=25℃,除非特殊标注参数条件mintypmax单位供电DC355.5V供电电流测量0.52.5mA平均0.21mA待机100150uA采样周期秒1次注:采样周期间隔不得低于1秒钟。1.3.6封装信息

1.4AT24C02简介AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。功能简介:AT24C02支持IC,总线数据传送协议IC,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。管脚配置:管脚描述:管脚名称功能A0A1A2器件地址选择SDA串行数据/地址SCL串行时钟WP写保护Vcc+1.8V~6.0V工作电压Vss地SCL串行时钟

AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。

SDA串行数据/地址

AT24C02双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-OR)。

A0、A1、A2器件地址输入端

这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用AT24C02时最大可级联8个器件。如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2)可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0、A1、A2)必须连接到Vss。

WP写保护

如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss或悬空允许器件进行正常的读/写操作2.系统软件设计本设计的软件流程是,先使用DHT11进行温湿度信息采集,经单片机数据处理,决定控制电路和报警电路的相应操作,最后送给LCD1602液晶显示,同时可以通过按键电路来调整温湿度上下限。2.1程序流程图:2.2按键电路流程:一共用到了四个按键,一个用来切换选中项,两个用来加减选中数据,最后一个用来确定修改完毕,返回主界面。程序:voidKEY(){ if(Key_SET==0) { Delay1(200); if(Key_SET==0) //延时消抖 { Mode++; if(Mode==1)//在这个模式下,按下设置按键一直循环选中温湿度上下限四个参数 { L1602_string(1,1,"TH:CHH:%"); L1602_char(1,8,0xdf); L1602_string(2,1,"TL:CHL:%"); L1602_char(2,8,0xdf); L1602_int(1,4,TH); L1602_int(1,12,HH); L1602_int(2,4,TL); L1602_int(2,12,HL); enable(0x80+6); //选中温度上限 enable(0x0f); } elseif(Mode==2) //选中温度下限 { enable(0x80+0x40+6); enable(0x0f); } elseif(Mode==3) //选中湿度上限 { enable(0x80+14); enable(0x0f); } elseif(Mode==4) //选中湿度下限 { enable(0x80+0x40+14); enable(0x0f); } elseif(Mode>=5) { Mode=1; enable(0x80+6); enable(0x0f); } while(!Key_SET); //按键释放 } } elseif(Key_ADD==0) //数据加按键 { Delay1(200); if(Key_ADD==0) //延时消抖 { if(Mode==1) //加温度上限,最大值不超过100 { TH++; if(TH>=100) TH=99; L1602_int(1,4,TH); enable(0x80+6); } elseif(Mode==2) //温度下限加,原则上不大于上限 { TL++; if(TL>=TH) TL=TH-1; L1602_int(2,4,TL); enable(0x80+0x40+6); } elseif(Mode==3) //湿度上限加。最大不超过100 { HH++; if(HH>=100) HH=99; L1602_int(1,12,HH); enable(0x80+14); } elseif(Mode==4) //湿度下限加,原则不超过上限 { HL++; if(HL>=HH) HL=HH-1; L1602_int(2,12,HL); enable(0x80+0x40+14); } while(!Key_ADD); //按键释放 } } elseif(Key_SUB==0) //数据减 { Delay1(200); if(Key_SUB==0) //延时消抖 { if(Mode==1) //温度上限减,原则不低于下限 { TH--; if(TH<=TL) TH=TL+1; L1602_int(1,4,TH); enable(0x80+6); } elseif(Mode==2) //下限减,不小于0 { TL--; if(TL<=0) TL=0; L1602_int(2,4,TL); enable(0x80+0x40+6); } elseif(Mode==3) //湿度变化同上 { HH--; if(HH<=HL) HH=HL+1; L1602_int(1,12,HH); enable(0x80+14); } elseif(Mode==4) { HL--; if(HL<=0) HL=0; L1602_int(2,12,HL); enable(0x80+0x40+14); } while(!Key_SUB); //按键释放 } } if(Key_OK==0&&Mode!=0) //确定按键 { Delay1(200); if(Key_OK==0) { L1602_string(1,1,"Tem:CHum:%"); L1602_string(2,1,"Goodenvironment"); Mode=0; wrteeprom(0,TH); Delay1(20); wrteeprom(1,TL); Delay1(20); wrteeprom(2,HH); Delay1(20); wrteeprom(3,HL); enable(0x0c); while(Key_OK==0); } }}2.3控制电路流程:四个继电器分别控制两个风扇、一个加湿器、一个加热片;程序: if(Mode==0) //温湿度控制 mode=1.2.3.4是用来设置上下限数据的 { if(temperature>TH) { led_1=Led_jiangwen=0; hot=1; led_2=Led_shengwen=1; cold=0; // BJ=1; } elseif(temperature<TL) { led_2=Led_shengwen=0; cold=1; led_1=Led_jiangwen=1; hot=0; buzz=0; // BJ=1; } else { led_1=Led_jiangwen=1; led_2=Led_shengwen=1; hot=0; cold=0; buzz=1; } if(humidity>HH) { led_3=Led_qushi=0; humid=1; led_4=Led_jiashi=1; dry=0; // BJ=1; } elseif(humidity<HL) { led_4=Led_jiashi=0; dry=1; led_3=Led_qushi=1; humid=0; // BJ=1; } else { led_3=Led_qushi=1; led_4=Led_jiashi=1; humid=0; dry=0; } }

谢辞实训临近结束了,在短暂的实训过程中得到了老师和很多同学的帮助。首先衷心感谢王守华、归发弟和邓艳容三位老师的悉心指导和热情帮助,在我们小组完成过程中给以大力的帮助,让我们学到了许多实践的知识,开阔了眼界,增强了我们的实践动手能力,以及我们的团队合作精神。同时,还要感谢全班同学对我们小组的大力帮助,让我们在冬日的寒风中天天都充满了干劲,如果没有他们,我们不能够完成得这么顺利。除此之外,我们小组的组员各有分工,通力合作,彼此互相协作,不懂的地方大家一起讨论,碰到困难时大家一起解决,正是有了这种小组的氛围,我们才能够最终恪尽职守的完成这一个实训任务。不过由于我们时间和水平有限,本作品仍然有很多缺憾和不足的地方,恳请老师和同学批评指出。参考文献[1]陈明荧.8051单片机课程设计实训教材[M].北京:清华大学出版社,2003.[2]徐新艳.单片机原理、应用与实践[M].北京:高等教育出版社,2005.[3]吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用[M].北京:清华大学出版社,2002.[4]王千.实用电子电路大全[M].电子工业出版社,2001.[5]冯博琴.微型计算机原理与接口技术[M].北京:清华大学出版社,2004.[6]张毅刚.MCS-51单片机应用设计[M].哈尔滨工业大学出版社,2004.[7]张淑清,姜万录等.单片微型计算机接口技术及应用[M].国防工业出版社,2003.[8]吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用[M].北京:清华大学出版社,2001.[9]冯博琴.微型计算机原理与接口技术[M].清华大学出版社,2004.[10]张毅刚.MCS-51单片机应用设计[M].哈尔滨工业大学出版社,2004.[11]赵亮,侯国锐.单片机C语言编程与实例[M].北京:人民邮电出版社,2003.[12]王振红,李洋,郝承祥.ISD4004语音芯片的工作原理及其在智能控制系统中的应用[J].电子器件2002年3月第25卷第1期.[13]R.L.Geiger,P.E.Allen,N.R.Strader.VLSI.DesignTechniquesforAnalogAndDigitialCiruits,McGraw-HillInc.1990.[14]ANALOGDEVICES.ThetechnologyofAT89C51[EB/OL].WhitePaper,Spe.28.2000.

附录硬件电路图、PCB图源程序#include<reg52.h>#include<intrins.h>#include<absacc.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedint//定义四个输出端口sbitLed_jiashi=P3^5; //加湿sbitLed_qushi=P3^6; //去湿sbitLed_jiangwen=P3^4; //降温sbitLed_shengwen=P3^3; //升温//定义三个设置按键sbitKey_SET=P2^0; //切换设置sbitKey_ADD=P2^1; //数据加sbitKey_SUB=P2^2; //数据减sbitKey_OK=P2^3; //确定//指示灯sbitled_1=P1^0;sbitled_2=P1^1;sbitled_3=P1^2;sbitled_4=P1^3;//定义24C02数据口sbitSCL=P1^5;sbitSDA=P1^6;//定义DHT11数据口sbitDATA=P3^1;sbitbuzz=P3^7;//定义LCD1602端口sbitRS=P2^5; //1602数据/命令选择引脚sbitRW=P2^6; //1602读写引脚sbitE=P2^7; //1602使能引脚 //定义全局变量ucharU8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;ucharU8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;ucharMode,humidity,temperature;charTH,TL,HH,HL;bitbdataFlagStartRH,hot,cold,humid,dry,BJ;//定时器0初始化voidTimer0_Init(){ ET0=1;//允许定时器0中断 TMOD=0x11;//定时器工作方式选择 TL0=0xFF; TH0=0x4B;//定时器赋予初值 TR0=1;//启动定时器}//定时器0中断voidTimer0_ISR(void)interrupt1using0{ ucharRHCounter; TL0=0xFF; TH0=0x4B;//定时器赋予初值 RHCounter++; if(RHCounter%10==0&&BJ==1) buzz=!buzz; elseif(BJ==0) buzz=1; //每2秒钟启动一次温湿度转换if(RHCounter>=40){FlagStartRH=1; RHCounter=0;}}/*********************************BASEDRIVE**********************************/voidDELAY(unsignedintt){ while(t!=0) t--;}/******************************IICDRIVE******************************/voidIICStart(void) //启动{SCL=0; DELAY(1);SDA=1;SCL=1;DELAY(1);SDA=0;DELAY(1);SCL=0;}voidIICStop(void) //停止{ SDA=0;SCL=1;DELAY(1);SDA=1;DELAY(1);SCL=0; }voidSEND0(void) //数据{ SDA=0; SCL=1; DELAY(1); SCL=0;} //数据voidSEND1(void){ SDA=1; DELAY(1); SCL=1; DELAY(1); SCL=0;}bitCheck_Ack(void) //应答{ unsignedcharerrtime=250; DELAY(1); SCL=1; DELAY(1); CY=SDA; while(CY) { errtime--; CY=SDA; if(!errtime) { IICStop(); return1; } } DELAY(1); SCL=0; return0;}voidWrite_byte(unsignedchardat) //写数据{unsignedchari; for(i=0;i<8;i++) { if((dat<<i)&0x80) SEND1(); else SEND0(); }}unsignedcharRead_byte(void) //读数据{ unsignedchari,temp=0; for(i=0;i<8;i++) {SDA=1; SCL=1; DELAY(1); if(SDA==1) { temp=temp<<1; temp=temp|0x01; } else temp=temp<<1; SCL=0; } returntemp;}/************************************EEPROMDRIVE Addr:from0x00-->*************************************/unsignedcharrdeeprom(unsignedcharaddr){unsignedchartemp=0; bitflag=0; IICStart(); Write_byte(0xa0);Check_Ack(); Write_byte(addr); Check_Ack(); IICStart(); Write_byte(0xa1); Check_Ack(); temp=Read_byte(); SEND1(); IICStop(); returntemp;}voidwrteeprom(unsignedcharaddr,unsignedchardat){ IICStart(); Write_byte(0xa0); Check_Ack(); Write_byte(addr); Check_Ack(); Write_byte(dat); Check_Ack(); IICStop();}voidDelay1(uintj){uchari;for(;j>0;j--){ for(i=0;i<27;i++);}}voidDelay_10us(void){uchari;i--;i--;i--;i--;i--;i--;} voidCOM(void){uchari;for(i=0;i<8;i++) { U8FLAG=2; while((!DATA)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0;if(DATA)U8temp=1; U8FLAG=2; while((DATA)&&U8FLAG++); //超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1 //如果高电平高过预定0高电平值则数据位为1 U8comdata<<=1; U8comdata|=U8temp;//0}//rof}////温湿度读取子程序////以下变量均为全局变量//温度高8位==U8T_data_H//温度低8位==U8T_data_L//湿度高8位==U8RH_data_H//湿度低8位==U8RH_data_L//校验8位==U8checkdata//调用相关子程序如下//Delay();,Delay_10us();,COM();//ucharRH(void){//主机拉低18msDATA=0; Delay1(180);//原来为5 DATA=1; //总线由上拉电阻拉高主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主机设为输入判断从机响应信号 DATA=1; //判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行 if(!DATA) //T! { U8FLAG=2; //判断从机是否发出80us的低电平响应信号是否结束 while((!DATA)&&U8FLAG++); U8FLAG=2; //判断从机是否发出80us的高电平,如发出则进入数据接收状态 while((DATA)&&U8FLAG++); //数据接收状态 COM(); U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; DATA=1; //数据校验 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; } return1; } else//传感器不响应 { return0; }}/*********************************************************************文件名:液晶1602显示.c*描述:该程序实现了对液晶1602的控制。***********************************************************************//*********************************************************************名称:delay()*功能:延时,延时时间大概为140US。*输入:无*输出:无***********************************************************************/voiddelay(){ inti,j; for(i=0;i<=10;i++) for(j=0;j<=2;j++);} /*********************************************************************名称:enable(uchardel)*功能:1602命令函数*输入:输入的命令值*输出:无***********************************************************************/voidenable(uchardel){ P0=del; RS=0; E=1; delay(); E=0; delay();}/*********************************************************************名称:write(uchardel)*功能:1602写数据函数*输入:需要写入1602的数据*输出:无***********************************************************************/voidwrite(uchardel){ P0=del; RS=1; E=1; delay(); E=0; delay();}/*********************************************************************名称:L1602_init()*功能:1602初始化,请参考1602的资料*输入:无*输出:无***********************************************************************/voidL1602_init(void){ enable(0x38); enable(0x0c); enable(0x06); enable(0x01);//清屏要放在最后}/*********************************************************************名称:L1602_char(ucharhang,ucharlie,charsign)*功能:改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下 L1602_char(1,5,'b')*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_char(ucharhang,ucharlie,charsign){ uchara; if(hang==1)a=0x80; if(hang==2)a=0xc0; a=a+lie-1; enable(a); write(sign);}/*********************************************************************名称:L1602_string(ucharhang,ucharlie,uchar*p)*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下 L1602_string(1,5,"abcdef;")*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_string(ucharhang,ucharlie,uchar*p){ uchara; if(hang==1)a=0x80; if(hang==2)a=0xc0; a=a+lie-1; enable(a); while(1) { if(*p=='\0')break; write(*p); p++; }}//显示整型的温湿度数据用,共占用4位,其中一位符号位voidL1602_int(ucharhang,ucharlie,intnum){uinttemp;uintgewei,shiwei,baiwei,sign;if(num>=0)sign=0;elsesign=1;temp=abs(num);baiwei=temp/100;temp=temp-baiwei*100;shiwei=temp/10;gewei=temp-shiwei*10;num=abs(num);if(num>=100){//L1602_char(hang,lie+1,baiwei+48); L1602_char(hang,lie+2,shiwei+48); L1602_char(hang,lie+3,gewei+48);}elseif(num>=10){if(sign==1) L1602_char(hang,lie+1,'-'); L1602_char(hang,lie+2,shiwei+48);L1602_char(hang,lie+3,gewei+48);}else{if(sign==1) L1602_char(hang,lie+2,'-'); else L1602_char(hang,lie+2,'');L1602_char(hang,lie+3,gewei+48);}}voiddisplay(){ if(Mode==0) { L1602_int(1,3,temperature); L1602_char(1,7,0xdf); L1602_int(1,12,humidity); if(hot==1&&cold==0&&humid==0&&dry==0) {L1602_string(2,1,"It'sveryhot!");BJ=1;} //热 elseif(hot==1&&cold==0&&humid==1&&dry==0) {L1602_string(2,1,"Hotandhumid!");BJ=1;} //热和潮湿 elseif(hot==1&&cold==0&&humid==0&&dry==1) {L1602_string(2,1,"Hotanddry!");BJ=1;} //热和干 elseif(hot==0&&cold==1&&humid==0&&dry==0) {L1602_string(2,1,"It'sverycold!");BJ=1;} //冷 elseif(hot==0&&cold==1&&humid==1&&dry==0) {L1602_string(2,1,"Coldandhumid!");BJ=1;} //冷和潮湿 elseif(hot==0&&cold==1&&humid==0&&dry==1) {L1602_string(2,1,"Coldanddry!");BJ=1;} //冷和干 elseif(hot==0&&cold==0&&humid==1&&dry==0) {L1602_string(2,1,"It'sveryhumid!");BJ=1;} //非常潮湿 elseif(hot==0&&cold==0&&humid==0&&dry==1) {L1602_string(2,1,"It'sverydry!");BJ=1;} //非常干 elseif(hot==0&&cold==0&&humid==0&&dry==0) {L1602_string(2,1,"Goodenvironment");BJ=0;} //好的环境 } }/***按键函数***/voidKEY(){ if(Key_SET==0) { Delay1(200); if(Key_SET==0) //延时消抖 { Mode++; if(Mode==1)//在这个模式下,按下设置按键一直循环选中温湿度上下限四个参数 { L1602_string(1,1,"TH:CHH:%"); L1602_char(1,8,0xdf); L1602_string(2,1,"TL:CHL:%"); L1602_char(2,8,0xdf); L1602_int(1,4,TH); L1602_int(1,12,HH); L1602_int(2,4,TL); L1602_int(2,12,HL); enable(0x80+6); //选中温度上限 enable(0x0f); } elseif(Mode==2) //选中温度下限 { enable(0x80+0x40+6); enable(0x0f); } elseif(Mode==3) //选中湿度上限 { enable(0x80+14); enable(0x0f); } elseif(Mode==4) //选中湿度下限 { enable(0x80+0x40+14); enable(0x0f); } elseif(Mode>=5) { Mode=1; enable(0x80+6); enable(0x0f); } while(!Key_SET); //按键释放 } } elseif(Key_ADD==0) //数据加按键 { Delay1(200); if(Key_ADD==0) //延时消抖 { if(Mode==1) //加温度上限,最大值不超过100 { TH++; if(TH>=100) TH=99; L1602_int(1,4,TH); enable(0x80+6); } elseif(Mode==2) //温度下限加,原则上不大于上限 { TL++; if(TL>=TH) TL=TH-1; L1602_int(2,4,TL); enable(0x80+0x40+6); } elseif(Mode==3) //湿度上限加。最大不超过100 { HH++; if(HH>=100) HH=99; L1602_int(1,12,HH); enable(0x80+14); } elseif(Mode==4) //湿度下限加,原则不超过上限 { HL++; if(HL>=HH) HL=HH-1; L1602_int(2,12,HL); enable(0x80+0x40+14); } while(!Key_ADD); //按键释放 } } elseif(Key_SUB==0) //数据减 { Del

温馨提示

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

评论

0/150

提交评论