DHT11温湿度检测仪报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子设计竞赛报告题目:温湿度测量仪

专业:电子信息工程

姓名学号:伍迹龙 ********

余颖 10041201

石萌 10041202

完成日期:2013年4月

一.电路设计方案论证

1. 电路原理说明

(1) 系统设计框图

本电路由3部分组成:单片机部分,温湿度传感器部分,显示部分.系统设计框图如下:

(2) 单片机电路

单片机电路方面,我们用了单片机的定时器跟计数器,通过编程实现单片机

对温湿度模块进行数据读取及处理,然后通过数码管动态显示温湿度

(3) 温湿度模块DHT11

通过温湿度传感器测量温湿度

(4) 数码管显示

通过段选和位选进行动态扫描显示 。

2. 各主要元件功能分析 (1)单片机电路

电路比较简单,首先是单片机需要+5V 电源,所以需要接好电源跟地,连接好单片机最小系统,然后选择了P2^5口作为数据传输口, 从DHT11的总线上读取温湿度数据,P2^0和P2^1作为数码管的段选和位选口,连接两片74HC573(锁存器),产生扫描和显示信号。

(2)DHT11传感器

串行接口 (单线双向)

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所示

图5 (3)数码管显示

三.程序设计语言部分

1.主程序模块

#include "dht11.h"

#include

//数码管位定义

sbit DULA = P2^0;

sbit WELA = P2^1;

#define SET_DULA() (DULA = 1)

#define RESET_DULA() (DULA = 0)

#define SET_WELA() (WELA = 1)

#define RESET_WELA() (WELA = 0)

//中断计数标志

static unsigned char flag;

//数码管编码

static unsigned char code array[]= {

0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f

};

extern int temp_value, humi_value;

static void InitTime(void);

void Delay_1ms(unsigned int ms);

static void SMG_Display(unsigned int value);

int main(void)

{

unsigned char mark = 0;

//先等上电稳定

Delay_1ms(1000);

//因为读一次数据dht11 才会触发一次采集数据.

//即在先使用数据时采集一次数据

ReadTempAndHumi();

//因为在两次采集数据需一定的时间间隔,这里还可减少

Delay_1ms(3000);

//设定定时器

InitTime();

while(1)

{

//三秒读一次温湿度

if(flag == 60)

{

flag = 0;

mark++;

/*

//读温湿度,可检测函数调用是否失败,

//函数返回OK(1)表示成功,返回ERROR(0)表示失败

//OK和ERROR是在DHT11.H中定义的宏

*/

ReadTempAndHumi();

}

if(mark % 2 == 0)

{

//显示温度

SMG_Display(temp_value);

}

else

{

//显示湿度

SMG_Display(humi_value);

}

}

return 0;

}

//设定定时器

static void InitTime(void)

{

TH0 = (unsigned char)((65535U - 50000) >> 8);

TL0 = (unsigned char)(65535U - 50000) ;

TMOD = 0X01;

TR0 = 1;

ET0 = 1;

EA = 1;

}

//数码管显示函数

static void SMG_Display(unsigned int value)

{

unsigned char ge, bai, shi;

ge = value % 10;

shi = value % 100 / 10;

bai = value % 1000 / 100;

SET_WELA();

P0 = 0XFD;

RESET_WELA();

P0 = 0XFF;

SET_DULA();

P0 = array[bai];

相关文档
最新文档