当前位置:文档之家› 室内温湿度检测系统

室内温湿度检测系统

无线室内温湿度测量系统学院:数理与信息工程学院专业:电子信息工程班级: 111班组员:潘正军方明超教师:蒋敏兰2013 年12 月30 日一、设计任务要求随着高校人数的扩招,安全越来越来受到重视。

火灾是高校安全隐患的重中之重,倘若能尽早了解室内信息,可以避免不必要的损失。

因此我们设计出能够检测室内温度与湿度信息的系统,该系统用DHT11集成温湿度传感器,通过在C8051F330单片机配置时序,将DHT11传感器的数字信号读入到单片机并进行处理,通过液晶可以直观的查看温湿度信息。

通过2.4G无线收发模块将温湿度信息传给C8051F340单片机,实现了远程监测环境的温湿度信息,并将采集到的温度与远程环境的温度作对比,可以对被测环境做出评估。

DHT11的温湿度测量范围:0-50℃,20-90%;24L01在空旷场地的传输距离为80m,通过在房间测试,可以在房间的任何位置接收。

系统概述:该系统包含DHT11信息采集模块、24L01无线收发模块、液晶显示模块等。

单片机初始化后,通过DHT11将室内温湿度的信息以数字量形式输入到单片机,单片机通过内部计算将数字量中包含的信息翻译出来,信息通过单片机管脚传送到nokia5110液晶并将信息显示出来。

单片机将采集到的信息,通过24L01无线模块将数据传送到另外一块单片机,实现了室内环境的远程监测。

系统框图如图1所示:图1系统框图二、系统硬件1.单片机本系统采用F330和F340两款单片机,这两款单片机相对于51单片机,拥有单片机执行速度比较快,支持在线仿真,兼容51指令等优点。

我们在大二时主要学习的就是这两款单片机,所以这两款单片机用的比较熟练,并且大家都有现成的系统板,可以直接拿过来应用,较为方便。

F330的系统板原理图如图2所示:图 2 F330的系统板原理图2. 液晶显示在本系统中液晶模块主要显示室内温湿度信息。

显示模块使用nokia5110,nokia5110相对于lcd1602,它具有更优化的显示方式,更好的显示界面,速度也比lcd1602快很多倍,用此液晶显示利用DHT11采集的温湿度信息。

液晶如图3所示:图 3液晶实物图3.DHT11信号采集模块本系统是利用集成的温湿度传感器DHT11,DHT11传感器有:全部校准,数字输出、低能耗、稳定性好、信号传输距离长等优点。

4.无线收发模块无线模块目前在电子行业有两种比较多用:一种是315M的PT2262/PT2272,315M是一个简单的无线发射与接收模块,操作简单但距离有限;另一种是2.4G的24L01,2.4G是SPI接口无线模块,具有传输距离远等优点。

实物图如图4所示:图 4 无线模块实物图三、系统软件设计1. F330单片机采集发送软件设计流程图2. F340单片机接收采集软件设计流程图四、系统调试及实验数据1.系统软件调试DHT11对时序要求的高,输出口拉低和置高的时间都是规定的,倘若时序配置不正确,那么输出口将不会有数据输出。

调通时序,我们需要了解F330单片机内部的时钟和指令占的机器周期。

若用51单片机调试DHT11的,其时序相对简单,但是我们为了学知识,将单片机改换成F330单片机。

通过此次系统的设计,我们更加了解F330单片机的内部资源配置。

24L01无线收发模块也是我们第一次采用,我们小组为了扩充自己的知识,以及结合目前的应用,决定尝试使用24L01无线模块。

调试无线是一个复杂而又漫长的过程,首先需要配置24L01模块,至于发送是否成功只有通过接收处是否有指示才能判别。

若用示波器观察发送是否成功,由于发送脚是将信息加载在一个高频率上的,用示波器将信息解调出来相对而言比较繁琐。

2.实验数据次数 测量器件 1 2 3 4 5 6 DHT11 28 25 21 20 23 24 15 º C 19º C30º C28º C20º C17º C DS18B20 15.62 ºC 19.25º C 29.68º C 28.12º C 20.25º C 17.87ºC温度计 14.9º C18.8º C29.7º C28.2º C20.3º C 17.8º C误差:DS18B20测量温度精确到0.0625度,温度计的读数精确到0.1度,DHT11的温度精确到1度。

DHT11内部自带温度校准,温度与温度计读数相接近。

此次系统以温度计为标准,DHT11测量误差σ为:σ =0.32(i:测量次数;S 1:标准值;S 2:测量值)。

五、系统实物图发射和接收系统实物图如图5、图6所示图5 发射模块实物图图6 接收模块实物图()∑=-=52161i S S六、小结1.由于初次使用24L01模块,在软件设计方面还存在很大不足,一次只能发送一个数据位,不能发送多个数据位,所以我们采用分时复用的显示方式来弥补。

2.由于软件设计的缺陷,我们的DHT11模块在测温的时候,显示有几秒钟的延时,当外界温湿度发生变化的时候,液晶上显示的温湿度显示有一定的滞后时间。

3. DHT11我们目前测量的数据,仅仅为整数部分,小数部分还没有测量出来。

小数部分相对于整数部分时序要求更高,下一步的工作则是将小数信息读取出来。

七、程序1. 发送程序#include <C8051F330.h>#include "n5110.h"#include <intrins.h>#include <24L01.h>typedef unsigned char U8; /* 无符号8位整型变量 */typedef signed char S8; /* 有符号8位整型变量 */typedef unsigned int U16; /* 无符号16位整型变量 */typedef signed int S16; /* 有符号16位整型变量 */typedef unsigned long U32; /* 无符号32位整型变量 */typedef signed long S32; /* 有符号32位整型变量 */typedef float F32; /* (32bits) 单精度浮点数(32位长度) */ typedef double F64; /* (64bits) 双精度浮点数(64位长度) *///#define uchar unsigned char#define uint unsigned int//----------------IO口定义区--------------------//sbit P2_0 = P0^3 ;sbit led = P0^7;//----------------定义区--------------------//U8 U8FLAG,k;U8 U8count,U8temp;U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_t emp;U8 U8comdata;void Sysclk_Init(void){OSCICN = 0x82;}void IOInit(void){P0MDOUT = 0xff;P1MDOUT = 0xff;XBR1 = 0x40;}void Interrupts_Init() //P0^6设为中断{IT01CF = 0x06;IT0=1;EX0=1;EA=1;}void delay() //延时{int i,j;for(i=0;i<4000;i++)for(j=0;j<500;j++);}void Delay(U16 j){U16 i;for(;j>0;j--){for(i=0;i<95;i++); //27*4=108 }}void Delay_10us(void){U8 i;i--;i--;i--;i--;i--;i--;}void COM(void){U8 i;for(i=0;i<8;i++){U8FLAG=2;while((!P2_0)&&U8FLAG++){;}Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();U8temp=0;if(P2_0){U8temp=1;}U8FLAG=2;while((P2_0)&&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();//--------------------------------void RH(void){P0MDOUT = 0xff; //P0.0输出//主机拉低18msP2_0=0;Delay(200);P2_0=1;//总线由上拉电阻拉高主机延时20usDelay_10us();Delay_10us();Delay_10us();Delay_10us();Delay_10us();//主机设为输入判断从机响应信号P2_0=1;P0MDOUT = 0xF7; //P0.0输入//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P2_0) //T !{U8FLAG=2;//判断从机是否发出 80us 的低电平响应信号是否结束while((!P2_0)&&U8FLAG++);U8FLAG=2;//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态while((P2_0)&&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;P2_0=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;}//fi}//fi}void int0() interrupt 0{EX0_flag=1;EX0=0;}void main(void){PCA0MD &=~0x40; // WDTE = 0 (clear watchdog timer) Sysclk_Init();IOInit();Interrupts_Init();init_nRF24L01();led=0;set_mode(TX_M);LCD_init();LCD_clear(); // Initialize ADC0LCD_write_english_string(0,0,"humidity:");LCD_write_english_string(0,1,"temper:");while(1){INT0_deal();RH();Tx_data[0]=U8RH_data_H;send_date();delay();Tx_data[0]=U8T_data_H+100;send_date();delay();led = ~led;Tx_data[0]=0;LCD_Write_variable0_5110(55,0,U8RH_data_H);LCD_Write_variable0_5110(55,1,U8T_data_H);}}2. 接收程序#include"c8051f340.h"#include "24L01.h"#include"system.h"#include "5110.h"#include "ds18b20.h"sbit led = P1^0;sbit led2 = P1^1;sbit led3 = P1^2;unsigned int x,temp;unsigned int y;void tongdao (void);void delay() //延时{int i,j;for(i=0;i<6000;i++)for(j=0;j<500;j++);}void int0() interrupt 0{EX0_flag=1;EX0=0;}void main(){Init_Device();init_nRF24L01();set_mode(RX_M);LCD_init();LCD_clear();led=led2=led3=0;LCD_write_english_string(30,0,"DHT11");LCD_write_english_string(0,1,"Humidity:");LCD_write_english_string(0,2,"Temper:");LCD_write_english_string(0,3,"Now tep:");LCD_write_english_string(61,3,".");while(1){INT0_deal();temp = ReadTemperature();tongdao();LCD_Write_variable0_5110(49,3,temp);}}void tongdao (void){switch(Rx_data[0]/100){case 0: led = ~led;delay();x = Rx_data[0];LCD_Write_variable2_5110(55,1,x);break; case 1: y = Rx_data[0]-100;LCD_Write_variable2_5110(55,2,y);break; }}。

相关主题