当前位置:文档之家› 温湿度检测系统的设计与实现

温湿度检测系统的设计与实现

无线传感网络技术课程实训温湿度检测系统的设计与实现院(系)名称电子与信息工程学院专业班级学号学生姓名指导教师起止时间:2017.6.26—2017.7.14课程设计(论文)任务及评语院(系):电子与信息工程学院教研室:软件工程目录第1章绪论 01.1系统的开发背景 01.2开发工具 0第2章需求分析 (1)2.1调研情况 (1)2.2 模块划分 (1)2.3 系统原理图 (1)2.4 系统性能需求 (1)第3章系统概要设计 (2)3.1系统总体结构设计 (2)3.2模块的创建 (2)第4章硬件设计 (3)4.1 DHT11温度湿度传感器电路设计 (3)4.2 晶振电路和复位电路设计 (3)4.3 LED数码显示模块设计 (3)4.4 报警模块设计 (4)4.5 主程序设计 (4)4.6 LED显示子程序设计 (4)第5章系统的测试 (6)5.1 系统安装接线图 (6)5.2 调试与结果 (6)第6章总结 (6)参考文献 (7)附录程序 (8)第1章绪论1.1系统的开发背景随着科学技术的快速发展,人类社会已取得了巨大进步!在居家生活、工农业生产、环保、气象、国防、科研、航天等部门,经常需要对环境中的湿度和温度进行测量及控制。

传统的方法是用温度表、毛发湿度表、双金属式测量计和湿度试纸等测试器材,通过人工进行检测,对不符合温度和湿度要求的场所进行换气、降温和去湿等工作。

这种人工测试方法费时费力、效率低,且测试的温度及湿度误差大,随机性相对较大。

随着生产的发展急需一个含有微型计算机或微处理器的测量仪器,由于它拥有对数据存储,运算逻辑判断及自动化的功能,有着智能作用等优点,一个低成本和具有较高精度的温度湿度检测器将在许多领域代替人工操作,自动不间断检测环境温度和湿度。

目前市场上普遍存在的温湿度检测仪器大都是单点测量,而且温湿度信息传递不及时,精度达不到要求,不利于控制者根据温度、湿度变化及时做出决定。

为此,本设计开发了一种能够同时测量多点,并实时性高、精度高,通过显示器显示温湿度信息,并能进行温湿度超限报警的测控产品。

本文设计的是基于单片机的室内温湿度检测与报警系统,运用温湿度传感器进行温度和湿度的检测,该仪器具有测量精度较高、硬件电路简单、并能很好的进行显示,可测试一定范围室内环境温湿度的特点。

省去了人工检测的繁琐、耗时的过程,随时通过检测器的显示器进行读数,既方便,又快捷。

1.2开发工具STC89C52是一种低功耗、高性能CMOS八位微控制器,具有8K在系统可编程Flash 存储器,使用ATMEL公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。

LED数码管是现在电子设计中使用相当普遍的一种显示设备,每个数码管由7个发光二极管按照一定的排列结构组成,根据七个发光二极管的正负极连接不同,又分为共阴极数码管和共阳极数码管两种,选择的数码管不同,程序设计上也有一定的差别。

编程采用Keil C 软件,使用C语音。

第2章需求分析2.1调研情况在需求分析阶段,本设计采用STC89C52RC 单片机做为嵌入式控制核心,处理温度和湿度信号,基于设计目的对于信号采集的数字滤波考虑,本设计采用模拟量输出的温湿度传感器,采用TLC254312位串行A/D转换器进行模数转换,非信号因素采用专用硬件看门狗芯片X25045等多项软硬件抗干扰措施,减少额外干扰对于实验设计的影响,并基于产品性功耗考虑,显示器件采用字符液晶。

设计充分利用端口资源,考虑整体性,显示精确性以及功耗要求,很好的完成了设计目的。

2.2 模块划分通过网上查询、翻阅图书了解空调系统原理,借鉴前人经验;传感器使用方法;用数码管显示可实现系统设计。

主要内容有⑴学习强化单片机知识⑵掌握智能温湿度检测系统,提出硬件电路设计方案⑶画出原理图⑷编写单片机控制软件⑸完成系统整体功能调2.3 系统原理图主控检验并传第3章系统概要设计3.1系统总体结构设计要求以单片机为核心,采用温湿度传感器 DHT11设计一个对环境温度湿度的检测系统,要求用按键控制系统选择分别对温度或湿度的测试、复位、用四位LED数码管显示实时温度和温度。

3.模块的创建本次设计主要设计了温湿度的测量与显示,硬件方面共分为7个模块,即单片机主控模块、按键模块、晶振电路、复位电路、LED显示模块、报警模块以及DHT11电路模块。

数字温湿度传感器DHT11送来数据,经单片机STC89C52RC 处理后,并送入LED显示模块,一个显示温度,一个显示湿度,另外一个负责启动DHT11。

系统总体框图如图3.1。

图3.1 系统总体框图第4章硬件设计4.1 DHT11温度湿度传感器电路设计此次单片机课程设计采用的是DHT11数字温湿度传感器,而且是单总线(双向)结构,所以温湿度检测电路的结构比较简单。

此次课程设计温度测量范围:0-50摄氏度;湿度测量范围:20%-90%RH。

DHT11只有一根数据线,一根电源线,一根地线,还有一根(NC)悬空。

直接将电源线与单片机的电源VCC相连,地线与单片机的GND相连。

数据线DATA与单片机的P30口相连,外加一个5K的上拉电阻。

所需要的温湿度数据便是由DATA引脚通过P30送入单片机的,在单片机内做出相应的处理之后得到相应的温湿度数据,原理图如图4.1所示。

DHT11图4.1 温度检测原理图4.2 晶振电路和复位电路设计STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。

时钟可以由内部方式产生或外部方式产生。

其晶振电路如图4.2所示。

图4.2晶振电路复位电路是保证单片机正常运行的关键因素,所以可靠地复位电路设计是必要的。

将RST引脚连续输入2个机器周期(即24个时钟振荡期间)以上高电平,即可以完成单片机的初始化操作。

本设计采用按钮复位方式,其复位电路如图4.3所示。

图4.3 复位电路4.3 LED数码显示模块设计此次课程设计采用的共阳极LED动态数码显示,所谓动态显示,是采用动态扫描的方法逐个地循环点亮各位显示器。

虽然在任一时刻只有一位显示器被点亮,但由于人眼具有视觉残留效应看起来与全部显示器持续点亮效果是完全一样的。

为了实现LED显示器的动态扫描,除了要给显示器提供段码(字形代码)的输入外,还要对显示器进行位控制,这就是通常所说的段控和位控。

本次课程设计中段码控制为单片机的P01-P0单片机的P02-P07分别与四个LED显示起相连,实现位控制。

4.4 报警模块设计此次课程设计的报警模块采用一个LED显示灯、一个10K的限流电阻和一个扬声器。

当实测温度湿度在设定的范围内,LED灯熄灭,扬声器不会发出警报,工作正常!如果实测温湿度不在设定的范围内,LED灯亮,扬声器发出警报,此时系统工作不正常!应根据要求调节温湿度设定的上下阀值!报警指示原理图如图4.4所示。

图4.4 报警指示原理4.5 主程序设计开机启动系统,进入主函数MAIN后延时0.1S等待启动,当按下启动键S4,然后调用温湿度子程序CWD读取温湿度,并用数组将实测的温湿度数据保存起来,分别将温湿度除十取整,将处理后的数据调用到温湿度范围检测函数temphumi_range判断实测的温湿度是否在设定的范围内并作出相应的处理。

其主程序流程图如图4.5所示。

4.6 LED显示子程序设计数码管显示主要用于同时显示温湿度和单独显示精确的温度和湿度,其显示流程图如图4.6所示第5章系统的测试5.1 系统安装接线图本设计是在Keil C环境下开发的,在编译完Keil C后,再运用STC_ISP_V48.8软件烧录到开发板上,实现实物与程序的连接。

如图5.1系统安装接线图。

图5.1 系统安装接线图5.2 调试与结果调试完成后,可进行温湿度的测量。

如图5.2 所示。

图5.2 调试结果第6章总结时间一点点的逼近了,耗时3周的课程设计即将结束,在老师的指导和自己的努力下我的毕业设计也完成了。

通过这段时间里的学习,我了解到了很多知识,也对软件开发的过程有了一个更深的了解,并且对程序的基本设计思路有了较深的认识。

本次课程设计还算比较的成功,设计初期,老师要我们确定系统的主体设计,比如一些主流程图、按键显示模块等,我们这个小组也能按时完成李老师布置的任务,跟着李老师一步步的走过来,其实感觉起来这个课程设计不是那么的难,比我刚开始着手的时候要简单。

在设计的过程中,为了找到自己需要的资料我们一起去读书馆找一些单片机课程设计实例来看看,不过在南校区读书馆资源也是非常的有限,而且还是比较旧的资料,像关于本次用的温湿度传感器DHT11在南院的图书馆几乎没有,图书馆只有什么单个测温度或者湿度的传感器,不过这个对我们的课程设计帮助也挺大的,另外此次课程设计的程序来源与百度百科,不过并不是按部就班,我们在它的基础上把它弄懂、理解之后加入自己的设计想法,我想做课程设计无非是想让我们学到,在别人已有的基础上加入自己的设计方案,慢慢的变为自己的知识。

在此分别对李晓秀老师和我这组的同学表示感谢。

本人签字:参考文献[1] 王迎旭编.单片机原理与应用[M].机械工业出版社.2012[2] 陈海晏编.51单片机原理与应用[M].北京航空航天大学出版社.2010[3] 黄仁欣编.单片机原理与应用技术[M].清华大学出版社.2010[4] 张中明编.单片计算机原理及接口技术[M].人民邮电出版社出版社.2009[5] 赛奎春.MySql数据库开发实例解析[M].北京:机械工业出版社,2010附录程序#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar num,z,dat,a,c,d,f;uint b;sbit JDQ=P3^7; //管脚定义类似于起名字//用JDQ来代替P1.4控制继电器工作unsigned int tempL; //设全局变量unsigned int tempH;unsigned int sdata;unsigned int s;code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //不带小数点的共阳数码管段码code unsigned char seg7codeB[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff}; //带小数点的共阳数码管段码bit fg=1; //正负标志//******************延时子程序 *******************************//这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时//************************************************************void delay(unsigned char i){for(i;i>0;i--);}//***********************************************************// 延时子程序//************************************************************void delay1ms(){unsigned char i;for(i=124;i>0;i--); //延时124*8+10=1002us}//读值(低位放tempL;高位放tempH;)ReadTemperature(void){tempH=c;tempL=d;s = (tempH*256+tempL); //整数部分sdata=s/100;}//控制继电器//********************显示函数**************** void Led(unsigned int date){if(fg==1){P2=0xfe; //P1.0=0,选通第一位P0=seg7code[date/10]; //十位数,查表,输出delay1ms();P0=0xff; //消隐P2=0xfd; //P1.1=0,选通第二位,个位数P0=seg7codeB[date%10];delay1ms();P0=0xff; //消隐P2=0xfb; //P1.3=0,选通第三位,小数点第一位 P0=seg7code[s%100/10];delay1ms();P0=0xff; //消隐P2=0xf7; //P1.3=0,选通第四位,小数点第二位 P0=seg7code[s%10];delay1ms();P0=0xff; //消隐}if(fg==0) //温度为负时显示的数据{P2=0xfe; //P1.0=0,选通第一位P0=seg7code[11]; //显示负号delay1ms();P0=0xff; //消隐P2=0xfd; //P1.1=0,选通第二位,十位数P0=seg7code[date/10];delay1ms();P0=0xff; //消隐P2=0xfb; //P1.3=0,选通第三位,个位数P0=seg7codeB[date%10];delay1ms();P0=0xff; //消隐P2=0xf7; //P1.3=0,选通第四位,小数点第一位P0=seg7code[date];delay1ms();P0=0xff; //消隐}}//主函数,C语言的入口函数:void Relay(){ if(sdata<10)JDQ=0; //P1.4引脚控制三极管再由三极管控制继电器,if(sdata>11)JDQ=1; //输出0三极管导通继电器得电吸合,输出1三极管截止继电器失电断开delay1ms();P0=0xff; //消隐while(1){Led(sdata);if(num==1){num=0;break; }}; //主程序循环,即程序要停止在这里,很多初学者忘记了这点,只输入了上面一行,结果程序跑飞,找不出问题}void main(){TMOD=0x20; //用定时器设置串口波特率9600TH1=0xfd;TL1=0xfd;TR1=1;REN=1; //串口初始化SM0=0;SM1=1;EA=1; //开启总中断ES=1;while(1){ if(z==1) //判断是否有串口数据的传送{ES=0;z=0;SBUF=1; //发送数据a到SBUF,即将单片机的数据发送到计算机while(!TI);TI=0;ES=1;}ReadTemperature();Relay();}}void ser() interrupt 4{RI=0;a=SBUF;if(a==238)b=0; //接收数据SBUF,即将计算机的数据接收。

相关主题