DHT11温湿度检测仪报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];