找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27080|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机的温湿度检测控制系统课设报告

[复制链接]
跳转到指定楼层
楼主
ID:328014 发表于 2018-6-30 04:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                        
1章 总体设计概述
1.2 系统实现的主要功能
1.3 系统的工作原理简介
1.4 总体设计简介
1.4.1总体设计框图
1.4.2 总体设计及工作进程
                        
2 系统硬件设计
2.1 主控模块设计
2.2 DHT11传感器模块设计
2.2.1 DHT11传感器简介
2.2.2 DHT11传感器模块电路设计
2.3 1602液晶显示模块设计
2.3.1 1602液晶显示屏简介
2.3.2 1602液晶显示模块
2.4  阈值设置模块
2.5 报警模块
                        
3章 系统软件设计
3.1 1602液晶显示模块程序设计
3.2 传感器模块程序设计

4章 系统分析与调试
4.1 程序下载软件说明
4.2 所遇问题及解决办法
4.2.1硬件问题及解决方法
4.2.2软件所遇问题及解决方法
                        
5章 结论与展望
附录
附录A 硬件原理图
附录B 最终实物图及简介
附录C 程序清单
                                                               
第1章 总体设计概述
                        
1.1 课题的背景和意义
                        
温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见最基本的工艺参数,例如机械、电子、石油、化工等各类工业中广泛需要对温度湿度的检测与控制。并且随着人们生活水平的提高,人们对自己的生存环境越来越关注。而空气中温湿度的变化与人体的舒适度和情绪都有直接的影响,所以对温度湿度的检测及控制就非常有必要了。
                        
8051单片机是常用于控制的芯片,在智能仪器仪表、工业检测控制、机电一体化等方面取得了令人瞩目的成果,用其作为温湿度控制系统的实力也很多。使用8051单片机能够实现温湿度全程的自动控制,而且8051单片机易于学习掌握,性价比高。
                        
使用8051型单片机设计温湿度控制系统,可以即时精确的反应温室内的温度以及适度的变化。完成诸如升温到特定的温度、降温到特定的温度。在温度上下限范围内保持恒温等多种控制方式,在湿度控制方面也是如此。将此系统应用到温室当中无疑为植被生长提供了更加适宜的环境。对于大棚种植和花圃、花卉栽培,必须在某些特定环境安装温湿度装置对其进行监控。本系统可以及时、精确的反映室内的温度以及湿度的变化,能够满足温湿度的控制要求。
                        
1.2 系统实现的主要功能
                        
本系统所要实现的功能是:
                        
1.温湿度实时检测及显示。通过LCD1602实时地显示传感器DHT11检测到的温湿度值,并且固定时间(5s)检测更新显示一次。
                        
2.报警阈值的手动设置。通过三个按键实现温湿度阈值的设置,使得系统更加人性化、智能化,具有更高的实用价值。
                        
3.当温湿度超出阈值时能自动报警。通过蜂鸣器发出声音实现报警,以提醒用户做出相应的改进措施。
                        
1.3 系统的工作原理简介
                        
总体来说,本次设计主要涉及了温湿度的测量、显示以及实现简单控制。硬件方面有五个模块,即AT89S52单片机主控模块、传感器模块、LCD1602液晶显示模块、报警模块以及阈值设置模块。其中主控模块已经给出,我们只需适当增加驱动电路即可。
                        
传感器模块使用的是DHT11数字温湿度传感器。通过DHT11检测出当前环境下的温湿度,将所测数据交给AT单片机进行分析和处理,并分别存入不同数组以便显示时候用。其中,为了显示稳定,本系统每间隔5s采集一次数据送入单片机。
                        
1602液晶显示模块就是实现温湿度检测值和阈值的显示。其分两行显示,上边一行显示湿度,下边显示温度值,两行的末尾两位是阈值显示位,正常工作的时候可以通过按键将其隐藏,需要调节阈值时,再显示出来方便调整,相对构建了比较友好的人机交互。
                        
蜂鸣器报警模块实现了检测值超过阈值的时候鸣响报警。本系统采用的是有源蜂鸣器,因此无论温度还是湿度超出范围蜂鸣器都是以相同频率的声音进行报警提示。提醒工作人员此时温度湿度数据出现异常、需及时调整,及时启用升温器、加湿器、降温风扇以及喷雾器来有效的调整实验室内温湿度。
                        
阈值设置模块通过三个按键来实现阈值设置功能的。使得在不同环境下设置阈值提供了极大的方便,不需要每次都在程序里改动然后再烧录,省去了复杂的过程。
                        
1.4 总体设计简介
                        
1.4.1总体设计框图
                        
                                                                按照系统功能的具体要求,在保证实现其功能的然础上,尽可能降低系统成本。总体设计方案围绕上述思想,初步确定系统的方案如图1-1所示
                        
                                                        
                        
11系统总体设计
                        
                        
从图中可以看出,系统有微处理器模块、DHT11传感器模块、阈值设置模块、1602字符液晶显示模块、报警模块组成。在方案设计中,外围模块采用并行控制,以简化系统,提高控制精度。该设计以AT89S52单片机为控制核心,实现温湿度采集及显示的基本功能。
                        
1.4.2 总体设计工作进程
                                                    本次设计相对而言有两个部分弄明白了就能够设计好了。一个是液晶显示部分,一个是DHT11传感器部分。传感器比较陌生,以前没有接触太多,液晶相对而言比较容易点。因此这次先攻克了液晶显示部分,然后再拿下传感器部分。整个流程如下图所示:
                        
                        
                                                        
                        
图1-2 整体设计流程图
                        
                        

第2章 系统硬件设计
                        
2.1 主控模设计
                                        本次课程设计使用的主控模块是由老师给出的一个AT89S52为核心的最小系统。使用的时候将P1口作为与液晶的数据传输口,P2.0作为与传感器DHT11通信的数据口,P2.1~P2.3作为阈值模块中三个按键的接口,P2.4~P2.6作为分别于液晶的RS、R/W和E端相连接,以控制液晶显示,P2.7接蜂鸣器控制端,以控制报警模块工作。
                        
2.2 DHT11传感器模块设计
                        
2.2.1 DHT11传感器简介
                        
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
                        
DHT11传感器实物图如下2-1所示:
                        
                                                        
                        
2-1 DHT11传感器实物图
                        
(1)引脚介绍:
                        
Pin1:(VDD),电源引脚,供电电压为3~5.5V。
                        
Pin2:(DATA),串行数据,单总线。
                        
Pin3:(NC),空脚,请悬浮。
                        
Pin4(VDD),接地端,电源负极。
                        
(2)接口说明 :
                        
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。
                        
                                                        
                        
图2-2 DHT11典型应用电路
                        
(3)数据帧的描述:
                        
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
                        
一次完整的数据传输为40bit,高位先出。
                        
数据格式:8bit湿度整数数据+8bit湿度小数数据
                        
+8bit温度整数数据+8bit温度小数数据
                        
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
                        
(4)电气特性:VDD=5V,T = 25℃,除非特殊标注
                        
表2-1 DHT11的电气特性
                        
参数
条件
Min
typ
max
单位
供电
DC
3
5
5.5
V
供电电流
测量
0.5

2.5
mA
平均
0.2

1
mA
待机
100

150
uA
采样周期
1


                        :采样周期间隔不得低于1秒钟。
                        
(5)时序描述:
                        
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
                        
通讯过程如下图2-3所示:
                        
                                                        
                        
图2-3通讯过程图
                        
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。
                        
                                                        
                        
图2-4通讯初始化要求图
                           
                        
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
                        
数字0信号表示方法如下图2-5所示:
                        
                                                        
                        
图2-5数字0信号电平变化图
                        
数字1信号表示方法如下图2-6所示
                        
                                                        
                        
2-6数字1数据线电平变化图
                        
2.2.2 DHT11传感器模块电路设计
                        
DHT11传感器连接单片机相对比较简单。单片机的P2.0口用来发收串行数据,即数据口。连接传感器的Pin2(单总线,串行数据)。由于测量范围电路小于20米,加一个5K的上拉电阻,因此在传感器的Pin2口与电源之间连接一个5K电阻。而传感器的电源端口Pin1和Pin4分别接单片机的VDD和GND端。传感器的第三脚悬浮放置。DHT11传感器原件的电路原理图如下2-7所示:
                                    
                        
                        
图2-7 DHT11电路原理图
                        
2.3 1602液晶显示模块设计
                        
2.3.1 1602液晶显示屏简介
                        
1602液晶 是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单。
                        
                                                        
                        
图2-8 液晶屏正面
                        
                        2.3.2 1602液晶显示模块
                        
液晶显示的原理是利用液晶的物理特性, 通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
                        
其中Vo脚,即第三引脚加了一个10K的滑动变阻器,该变阻器的目的是调节液晶的显示对比度,通过调节滑阻改变Vo的电压值,从而使液晶显示在最清晰的状态。
                        
                                                        
                        
                        
2-9 1602显示模块原理图
                        
2.4  阈值设置模块
                                                                                    从左图可以看到。从上到下依次设为K1、K2和K3三个按键,其连接单片机引脚分别是P2.1~P2.3三个引脚。
                                                    根据该模块使得阈值设置分为三个模块,分别是湿度设置模式、温度设置模式和关阈值显示模式。K1为模式选择键,按一次为湿度设置模式,按两次是温度设置模式,按三次是关阈值显示模式。K2和K3只有在湿度和温度设置模式下才有效,分别为阈值增加和阈值减小。
                                                    阈值设置模块是后来加进来的部分,设置非常人性化,一般人都可以操作,而不用每次设置阈值都到程序里边去设置
                        
                        
                        
                        
                        
图2—10 阈值设置模块原理图
                        
2.5 报警模块
                        
                                                        
                        
图2-11 蜂鸣器原理图
                        
                                                    系统在设计时候采用的是有源蜂鸣器,只要给蜂鸣器一定的电流值,蜂鸣器就可以按照一定的频率发声,但是单片机引脚的驱动电流比较小,不足以驱动蜂鸣器工作,因此采用了一个NPN的三极管C9013来驱动。
                        

第3章 系统软件设计
                        
在对我们所要设计的课题有了整体的了解之后,需要先建立程序框架的流程图,对整个设计划分模块,逐个模块实现其功能,最终把各个子模块合理的连接起来,构成总的程序。
                        
                                                        
                        
3-1 主程序流程图
                        
                        
                        
3.1 1602液晶显示模块程序设计
                        
液晶显示模块是一个慢显示器件,在执行每条指令之前要确认模块的忙标志为低电平,表示不忙,则此指令失效,要显示字符时要先输入显示字符地址,告诉模块在哪里现实了字符。1602液晶显示模块可与单片机接口直接连接,无需再加驱动。
                        
软件流程图及调试结果如图3-2所示。
                        
                                                                      
                        
3-2 1602液晶显示模块程序流程图及液晶调试结果显示
                        
                        
3.2 传感器模块程序设计
                        
温湿度模块DH11数字温湿传感器加湿器温湿度传感器随着科技的不断发展,汽车、空调、除湿器、烘干机等种类繁多的电器都已进入人们的日常生活,而这些电器设备很多都离不开对温度、湿度等环境因素的要求。因此,温度、湿度传感器用途越来越广泛。新一代的数字传感器不再需要外置的A D转换模块,并具有标准接口,使用方便,得到了越来越多的应用。DHT11作为一种新型的单总线温湿度数字传感器,具有更多的优点,它使系统设计更加简单,控制方便,易于实现。
                        
DHT11传感器模块的软件流程图及实物调试结果如图3-3.1和图3-3.2所示。
                        
                        
图 3-3.1 DHT11传感器模块程序流程图
                                                                                
                        
图 3-3.1 DHT11传感器模块实物调试结果
                        
第4章 系统分析与调试
                        
4.1 程序下载软件说明
                        
本设计是在Keil C环境下开发的,Keil C软件支持C语言的编程及调试,运用方便,当需要编程时这就是是做课程设计的首选。Keil C是我们比较熟悉的软件了,直接就可以使用,进行程序的编写,生成十六进制文件以备烧写用。
                        
                                程序烧写使用的是Easy 51Pro中的并行数据烧写模式进行烧写。软件运行界面如图4—1所示。
                        
                        
图4-1 程序烧写软件运行界面图
                        
在完成对程序的调试及烧录之后,还需要对其进行演示,把开发板与电脑连上,设置好对应的接口,完成供电及下载。下载完毕,连接好各引脚连线,并开始供电后、稍带几秒等1602液晶屏能正常显示当前温湿度了之后。观察当前温湿度的变化。并且针对与自己设定的限值相比较。若当前温度没有超标,即没有超过限值。可以用手捂住DHT11传感器,令其温度的显示超标。测试能否达到报警,经过测试,完全可行。因而简单的实现了对温度的控制。湿度控制原理跟温度一样。
                        
4.2 所遇问题及解决办法
                        
4.2.1硬件问题及解决方法
                                                    硬件和软件方面的问题相对来说硬件解决得是比较快的一类问题,因为这比较容易检查不来错误。
                                                    1. 单片机EA端没接高电平。
                        
液晶仿真完成以后,这是刚在实物板上开始调试的时候犯的第一个很低级的错误。当然这个问题首先要归结为不是我们做的最小系统,因此没有顾及到这个问题,这导致了我们在仿真时候好用的程序在实物板上偶尔会好用一次。
                                                    最后在老师的点拨下,我们找到了这个原因,以后上电的时候单片机就可以实现自动启动工作,而且读程序的时候每次都是从片内的最低位开始执行。
                                                    2. 蜂鸣器不响。
                        
后来在加了报警装置的时候,没有问老师我们拿的蜂鸣器是有源还是无源,这样子这个问题友困扰了我们一小段时间。当时以为是无源的,就用了高低电平来驱动,而且还测试了控制引脚输出电压的变化,最终没有响。后来无意间将蜂鸣器直接连接正负极,竟然发声了,此时才意识到我们忽略了它是有源蜂鸣器。
                                                    但是并没有就此解决了该问题,因为单单是蜂鸣器的引脚输出电流还不足以驱动蜂鸣器,后来又加了一个NPN的三极管来驱动蜂鸣器。但是在P2.7接口那里加的电阻比较小的时候还是不能驱动,这可能是因为电阻太小使得钳位电压太低了。最开始用的2K的电阻,但是蜂鸣器不能响,换成10K电阻以后蜂鸣器能吱吱的响,但不连续,最后换成24K以后再接上单片机控制端以后就能够自如的驱动蜂鸣器发声了。
                        
4.2.2软件所遇问题及解决方法
                        
                            本次课程设计可以说大部分时间都花在了软件调试上了,软件调试的时候毕竟不像硬件那么直观,对我们来说是个瓶颈,需要我们去突破它。
                        
1.下载程序的时候,对此次的烧写软件Easy 51Pro不熟悉。
                        
以前没使用过该软件,下载的时候很容易就出问题了。当然解决该问题也就显得是最简单的了,直接找了老师,然后老师来给我们演示了一次,这样问题就解决了。
                        
2. 显示结果不稳定,一直在很快地变化。
                        
由于刚开始的时候程序里边一直是在采集数据然后显示,单片机一直做这个事,这样就会导致显示不稳定,尤其是湿度变化特别快,基本上稳定不了。
                        
当然解决问题的方法就是隔固定时间以后采集一次,而不是一直采集。刚开始的时候想的是用延时程序来做,因为这样思想比较简单,但是这样的弊端同时也显现出来了,那就是他占用单片机资源,使得单片机始终在执行无用的语句来耗时,所以最后跟阈值设置模块结合考虑以后用了定时器来实现5s的定时。
                        
3.阈值设置模块加了按键以后按键始终不能按预期效果工作。
                        
刚开始还以为是硬件部分没有连接好,于是用万用表查了很久,但是电平变化都是正确的。在挣扎了一整下午以后晚上回到宿舍依然在想这个问题,主要是这个在仿真上边可以用,但是实物的时候就不好用,所以我们都以为是硬件出问题了。但是在第二天上午的时候我发现当按键时间比较长的时候,比如6s左右,单片机还是可以读出按键的,瞬间就想到了,原来我们的程序里边单片机不是一直在扫描键盘,而是只有一句话在执行扫描,这样按键好用比中五百万都难。
                        
找到问题了解决起来也就容易多了,后来当单片机在那五秒定时里边让单片机始终扫描键盘,这样绝大部分时间按键就都是有效的了。
                        

第5章 结论与展望
                        
在这短短几天时间里自己最大的感受就是:仿真和实物真的有很大的差别。同样的程序仿真时候能用但是实物板上却不能用,后来分析其实本来也是不能用的,但是仿真却给了我们一个错误的结果显示,只能说明仿真只是仿真而已,只能作为我们的一个参考罢了。
                        
经过近两周的奋斗,从拿到题目,到后来查找资料,理论学习,实验编程调试,这一切都使我的理论知识和动手能力有了很大的提高。了解了单片机的硬件结构和软件编程方法,对单片机的工作方式有了很大的认知。同时,对一些外围设备比如传感器、液晶屏、键盘、蜂鸣器等有了一定的了解!
                        
但因为我们的水平有限,此设计中也存在一定的不足。比如温湿度的精度是比较低的,这个跟传感器也有一定的关系,还有就是硬件的布局设计业不够美观,以后有机会应该自己做印刷板然后再美化电路板就比较完美了。
                        
温湿度控制已经成为了21世纪热门研究话题之一。无论是从生产还是生活,与我们人类都是息息相关的。而智能化的控制温湿度已经发展成为一种必然。随着世界经济的发展,人们生活水平的提高以及社会的进步。我们不可能一直墨守陈规,不能在恪守以前利用人力资源来控制温湿度的方法。不仅浪费大量的人力资源、财力资源,并且控制系统也更加单一化。而采用自动控制的办法、既节省了人力资源,更体现了与时俱进的思想、世界在进步、而这种进步就该体现在各个方面。
                        

附录
                        
附录A 硬件原理图
                        
附录B 最终实物图及简介
                        
                                
液晶前边显示的内容为温湿度的实时监测显示,上下两行的各后2位为阈值显示。
                        
中间三个按键分别为:最上边那个是模式切换键,按1次是湿度调节模式,按2次是温度调节模式,按三次试不显示阈值,每次调节完毕立即生效。下边两个键分别为增加和减少阈值键。
                        
左下角的蜂鸣器是报警装置。当温湿度只要有一个超出其阈值蜂鸣器就会报警,提醒人们做相应措施。
                        
液晶前的滑动变阻器为液晶对比度调节用的。
                        
附录C 程序清单
  1. //****************************************************************//
  2. //单片机 : AT89S52
  3. // 功能  :串口发送温湿度数据 晶振 12M
  4. //硬件连接: P2.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地。            
  5. //****************************************************************//
  6. 大连海事大学自动化专业课程设计
  7. #include <reg52.h>
  8. #define LCD_DB P1
  9. unsigned char s1[5];
  10. unsigned char s2[5];
  11. sbit LCD_RS=P2^4;
  12. sbit LCD_RW=P2^5;
  13. sbit LCD_E=P2^6;
  14. sbit P2_0 = P2^0;
  15. sbit moshi=P2^1;
  16. sbit INC=P2^2;
  17. sbit DEC=P2^3;
  18. sbit SPK=P2^7;
  19. /******定义函数****************/
  20. #define uchar unsigned char
  21. #define uint unsigned int
  22. typedef unsigned char  U8;      
  23. /*   无符号8位整型变量    */
  24. typedef unsigned int   U16;   
  25. /*                 无符号16位整型变量 */
  26. uchar count1=70,count2=35;
  27. uchar moshicount=0;
  28. uchar TD=0;//定时次数

  29. U8  U8FLAG;
  30. U8  U8count,U8temp;
  31. U8  U8T_data_H,U8T_data_L,U8RH_data_H,
  32. U8RH_data_L,U8checkdata;
  33. U8  U8T_data_H_temp,U8T_data_L_temp,
  34. U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  35. U8  U8comdata;
  36. void LCD_init(void);//初始化函数
  37. void LCD_write_command(uchar command); //写指令函数
  38. void LCD_write_data(uchar dat);
  39. //写数据函数
  40. void LCD_disp_char(uchar x,
  41. uchar y,uchar dat);
  42. //在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
  43. void delay_n40us(uint n);//延时函数
  44. //********************************
  45. //*******液晶初始化函数***************
  46. void LCD_init(void)
  47. {
  48.               LCD_write_command(0x38);
  49. //设置 8 位格式,2 行,5x7
  50.               LCD_write_command(0x0c);
  51. //整体显示,关光标,不闪烁
  52.               LCD_write_command(0x06);
  53. //设定输入方式,增量不移位
  54.               LCD_write_command(0x03);
  55. //清除屏幕显示
  56.               delay_n40us(100);
  57. }
  58. //********************************

  59. //*******定时器初始化函数**********
  60. void timerinit()
  61. {
  62.               TMOD=0x01;
  63.               TH0=-50000/256;
  64.               TL0=-50000%256;
  65.               EA=1;
  66.               ET0=1;
  67. }
  68. //********************************

  69. //********写指令函数************
  70. void LCD_write_command(uchar dat)
  71. {
  72.               LCD_DB=dat;
  73.               LCD_RS=0;//指令
  74.               LCD_RW=0;//写入
  75.               LCD_E=1;//允许
  76.               delay_n40us(1);
  77.               LCD_E=0;
  78.               delay_n40us(1);
  79. }
  80. //*******************************
  81. //********写数据函数*************
  82. void LCD_write_data(uchar dat)
  83. {
  84.               LCD_DB=dat;
  85.               LCD_RS=1;//数据
  86.               LCD_RW=0;//写入
  87.               LCD_E=1;//允许
  88.               delay_n40us(1);
  89.               LCD_E=0;
  90.               delay_n40us(1);            
  91. }
  92. //********************************
  93. //*******显示一个字符函数*********
  94. void LCD_disp_char(uchar x,
  95. uchar y,uchar dat)
  96. {
  97.               uchar address;
  98.               if(y==1)
  99.                               address=0x80+x;
  100.               else
  101.                               address=0xc0+x;
  102.               LCD_write_command(address);
  103.               LCD_write_data(dat);
  104. }
  105. //********************************
  106. //********延时函数***************
  107. void delay_n40us(uint n)
  108. {              
  109.               uint i;
  110.               uchar j;                        
  111.               for(i=n;i>0;i--)
  112.                               for(j=0;j<2;j++);
  113. }
  114. void  Delay_10us(void)
  115. {
  116.    U8 i;
  117.    i--;
  118.     i--;
  119.     i--;
  120.     i--;
  121.     i--;
  122.     i--;
  123. }
  124. void Delay(U16 j)
  125. {     
  126.                             U8 i;
  127.                 for(;j>0;j--)            
  128.                                for(i=0;i<27;i++);
  129. }

  130. //*******一字节数据传送函数*********
  131. void  COM(void)
  132. {
  133.     U8 i;
  134.      for(i=0;i<8;i++)               
  135.                  {
  136.                                  U8FLAG=2;            
  137.                                   while((!P2_0)&&U8FLAG++);
  138.                                              Delay_10us();
  139.                                 Delay_10us();
  140.                                              Delay_10us();
  141.                                             U8temp=0;
  142.                      if(P2_0)U8temp=1;
  143.                                  U8FLAG=2;
  144.                                  while((P2_0)&&U8FLAG++);
  145.                                    //超时则跳出for循环                             
  146.                                   if(U8FLAG==1)break;
  147.                                    //判断数据位是0还是1            
  148. // 如果高电平高过预定0高电平值则数据位为 1
  149.                                   U8comdata<<=1;
  150.                                  U8comdata|=U8temp;      
  151.                   }
  152. }

  153. *******单片机与传感器通信函数*********
  154. void RH(void)
  155. {
  156.               //主机拉低18ms
  157.      P2_0=0;
  158.                  Delay(180);
  159.                  P2_0=1;
  160. //总线由上拉电阻拉高 主机延时20us
  161.                  Delay_10us();
  162.                  Delay_10us();
  163.                  Delay_10us();
  164.                  Delay_10us();
  165.               //主机设为输入 判断从机响应信号      
  166.                  P2_0=1;
  167.               //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行               
  168.                  if(!P2_0)                            //T !               
  169.                  {
  170.                     U8FLAG=2;
  171.               //判断从机是否发出 80us 的低电平响应信号是否结束                  
  172.                     while((!P2_0)&&U8FLAG++);
  173.                     U8FLAG=2;
  174.               //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态              
  175.                      while((P2_0)&&U8FLAG++);
  176.                     //数据接收状态                           
  177.                     COM();
  178.                     U8RH_data_H_temp=U8comdata;
  179.                     COM();
  180.                      U8RH_data_L_temp=U8comdata;
  181.                      COM();
  182.                      U8T_data_H_temp=U8comdata;
  183.                      COM();
  184.                      U8T_data_L_temp=U8comdata;
  185.                      COM();
  186.                      U8checkdata_temp=U8comdata;
  187.                     P2_0=1;
  188.               //数据校验                U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  189.                  if(U8temp==U8checkdata_temp)
  190.                  {                                 
  191. U8RH_data_H=U8RH_data_H_temp;                      U8RH_data_L=U8RH_data_L_temp;
  192.                               U8T_data_H=U8T_data_H_temp;
  193.                                  U8T_data_L=U8T_data_L_temp;
  194.                                  U8checkdata=U8checkdata_temp;
  195.                  }
  196.     //湿度整数部分   
  197. s1[0] = (char)(0X30+U8RH_data_H/10);
  198.    s1[1] = (char)(0X30+U8RH_data_H%10);   
  199.    //湿度小数部分
  200.   s1[2] = (char)(0X30+U8RH_data_L/10);
  201.     //温度整数部分        
  202.   s2[0] = (char)(0X30+U8T_data_H/10);
  203.   s2[1] = (char)(0X30+U8T_data_H%10);      
  204.    //温度小数部分            
  205.   s2[2] = (char)(0X30+U8T_data_L/10);
  206. }
  207. }
  208. //*******************************

  209. //液晶显示函数
  210. void disp()
  211. {
  212.                             LCD_disp_char(0,1,'s');
  213.                             LCD_disp_char(1,1,'h');
  214.                             LCD_disp_char(2,1,'i');
  215.                             LCD_disp_char(3,1,'d');
  216.                             LCD_disp_char(4,1,'u');
  217.                             LCD_disp_char(5,1,':');
  218.                             LCD_disp_char(6,1,s1[0]);
  219.                             LCD_disp_char(7,1,s1[1]);
  220.                             LCD_disp_char(8,1,'.');
  221.                             LCD_disp_char(9,1,s1[2]);
  222.     LCD_disp_char(10,1,'%');
  223.      LCD_disp_char(11,1,'R');
  224.     LCD_disp_char(12,1,'H');

  225.                             LCD_disp_char(0,2,'w');
  226.                             LCD_disp_char(1,2,'e');
  227.                             LCD_disp_char(2,2,'n');
  228.                             LCD_disp_char(3,2,'d');
  229.                             LCD_disp_char(4,2,'u');
  230.                             LCD_disp_char(5,2,':');
  231.                             LCD_disp_char(6,2,s2[0]);
  232.                             LCD_disp_char(7,2,s2[1]);
  233.                             LCD_disp_char(8,2,'.');
  234.                             LCD_disp_char(9,2,s2[2]);
  235.                             LCD_disp_char(10,2,0xDF);
  236.                  LCD_disp_char(11,2,'C');
  237. }
  238. //阈值设置函数
  239. void shezhi()
  240. {
  241. //初值
  242. s1[3] = (char)(0X30+count1/10);
  243.                 s1[4] = (char)(0X30+count1%10);
  244.                 //初值
  245.                 s2[3] = (char)(0X30+count2/10);
  246.                 s2[4] = (char)(0X30+count2%10);
  247.   moshi=1;
  248.                 if(moshi==0)
  249.                 {
  250.                                Delay_10us();
  251.                                while(moshi==0);
  252.                                moshicount++;
  253.                  }
  254.                  switch(moshicount)
  255.                  {
  256.                                case 1:
  257.                                {
  258.                                               INC=1;DEC=1;
  259.                                               if(INC==0)
  260.                                               {
  261.                                                              Delay_10us();
  262.                                                              while(INC==0);
  263.                                                              count1++;
  264.                                                }
  265.                                                else if(DEC==0)
  266.                                                {
  267.                                                               Delay_10us();
  268.                                                               while(DEC==0);
  269.                                                               count1--;
  270.                                                 }
  271.                        LCD_disp_char(14,1,s1[3]);
  272.                        LCD_disp_char(15,1,s1[4]);
  273.                                               LCD_disp_char(14,2,s2[3]);
  274.                                               LCD_disp_char(15,2,s2[4]);
  275.                                 }break;
  276.                                 case 2:
  277.                                 {
  278.                                                 //moshicount=0;
  279.                                                 INC=1;DEC=1;
  280.                                                 if(INC==0)
  281.                                                 {
  282.                                                                Delay_10us();
  283.                                                                while(INC==0);
  284.                                                                count2++;
  285.                                                   }
  286.                                                   else if(DEC==0)
  287.                                                   {
  288.                                                                   Delay_10us();
  289.                                                                   while(DEC==0);
  290.                                                                   count2--;
  291.                                                    }
  292.                        LCD_disp_char(14,1,s1[3]);
  293.                       LCD_disp_char(15,1,s1[4]);
  294.                                                LCD_disp_char(14,2,s2[3]);
  295.                                                LCD_disp_char(15,2,s2[4]);
  296.                                 }break;
  297.                                 case 3:
  298.                                 {
  299.                                                moshicount=0;            
  300.                        LCD_disp_char(14,1,' ');
  301.                        LCD_disp_char(15,1,' ');
  302.                                               LCD_disp_char(14,2,' ');
  303.                                               LCD_disp_char(15,2,' ');
  304.                                  }break;
  305.                             default :break;
  306.               }
  307. }
  308. //蜂鸣器报警程序
  309. void laba()
  310. ……………………

  311. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整的Word格式文档51黑下载地址:
http://www.51hei.com/bbs/dpj-125422-1.html


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表