基于DHT11的温度湿度监测系统课程设计报告.docx
- 文档编号:143057
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:17
- 大小:1.05MB
基于DHT11的温度湿度监测系统课程设计报告.docx
《基于DHT11的温度湿度监测系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于DHT11的温度湿度监测系统课程设计报告.docx(17页珍藏版)》请在冰点文库上搜索。
基于DHT11的温度湿度监测系统
班级:
计科XX班姓名:
XX
指导老师:
XX
完成时间:
2010年12月10日
一:
选题背景
随着电子科技的迅速发展,对仓库、工厂、博物馆等等地方温湿度监测系统的要求不断增高,从而也促进自动检测系统的迅速发展,本文详细叙述一个计算机温湿度自动检测系统的总体结构,设计原则及具体性能指标。
由于系统具有较高的精度,反应速度快,在环境测量方面具有很好的应用前景。
防潮、防霉、防腐、防爆是仓库、工厂等地方日常工作的重要内容,是衡量仓库、工厂等地方管理质量的重要指标。
它直接影响到储备物资的使用寿命和工作可靠性。
为保证日常工作的顺利进行,首要问题是加强仓库和工厂内温度与湿度的监测工作。
但传统的方法是用与湿度表、毛发湿度表、双金属式测量计和湿度试纸等测试器材,通过人工进行检测,对不符合温度和湿度要求的库房进行通风、去湿和降温等工作。
这种人工测试方法费时费力、效率低,且测试的温度及湿度误差大,随机性大。
因此我们需要一种造价低廉、使用方便且测量准确的温湿度测量仪。
随着人们生活水平的提高,人们逐渐对温湿度变得敏感起来,对于温度湿度的了解,有助于人们的生活起居。
有时候需要知道空气中的温度湿度,以便于出行和穿戴的选择,有时候需要知道太阳能热水器的水温,以便于洗浴。
为了能实时了解空气中的温度和湿度,有必要制作一种测量温度和湿度的仪器。
有些地方,如博物馆,一些文物必须保存在适合的温度湿度范围内,以免文物长时间接触空气中的水分而造成文物损坏,而文物保存在适合的温度湿度范围内,其代价又太大,有时难以承受。
所以,无论如何,都有必要实时监控空气中的温度湿度,必然需要一种价格低廉,使用方便的测量仪器来监控温度和湿度。
二:
需求分析
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个
DHT11传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
产品为4针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
应用领域
►暖通空调
►测试及检测设备
►汽车
►数据记录器
►消费品
►自动控制
►气象站
►家电
►湿度调节器
►医疗
►除湿器
三:
总体设计方案
(1)设计思路
本系统采用已有的ELITE-III单片机开发板,以ELITE-III单片机开发板为核心,只需要加
入少量的外围器件DHT11即可实现温湿度的监控,不必另外购买器件,方面简单,可靠性高。
根据DHT11的说明,温度和湿度的显示至少为六位,温度和湿度的显示各三位,两位整数,一位小数,需要六个数码管。
由于本实验加入了时间监控,所以增加了矩阵键盘,以控制时间的显示和温湿度的显示。
(2)应用技术分析
本系统采用了以下关键技术:
1、单片机最小系统
2、数码管显示
3、矩阵键盘
4、时钟
5,DHT11温湿度监控
(3)设计难点
本系统的设计有如下几个难点
第一,本系统涉及的关键技术都比较简单,但实现起来有难度,尤其是各个程序模块连接的时候容易出现问题;
第二,本系统关于DHT11的程序编写有难度,DHT11使用的是单总线传输,因此必须对总线有一定的了解;
第三,本系统由于借用ELITE-III单片机开发板,开发板上的矩阵键盘和数码管使用了相同的引脚P2.0和P2.1,硬件上设置有点问题,程序编写的难度加大。
四:
硬件设计
(1)本系统的关键在于数字温湿度传感器DHT11,下面是关于
DHT11说明:
型号
测量范围
测湿精度
测温精度
分辨力
封装
DHT11
20-90%RH0-50℃
±5%RH
±2℃
1
4针单排直插
参数
条件
Min
Typ
Max
单位
湿度
分辨率
1
1
1
%RH
16
Bit
重复性
±1
%RH
精度
25℃
±4
%RH
0-50℃
±5
%RH
互换性
可完全互换
量程范围
0℃
30
90
%RH
25℃
20
90
%RH
50℃
20
80
%RH
响应时间
1/e(63%)25℃
1m/s空气
,6
10
15
S
迟滞
±1
%RH
长期稳定性
典型值
±1
%RH/yr
温度
分辨率
1
1
1
℃
16
16
16
Bit
重复性
±1
℃
精度
±1
±2
℃
量程范围
0
50
℃
响应时间
1/e(63%)
6
30
S
1、传感器性能说明
2、 接口说明
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻
3、 电源引脚
DHT11的供电电压为3-5.5V。
传感器上电后,要等待1s以越过不稳定状态在此期
间无需发送任何指令。
电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。
4、串行接口 (单线双向)
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
5、测量分辨率
测量分辨率分别为8bit(温度)、8bit(湿度)。
6、电气特性
VDD=5V,T=25℃,除非特殊标注
参数
条件
min
typ
max
单位
供电
DC
3
5
5.5
V
供电电流
测量
0.5
2.5
mA
平均
0.2
1
mA
待机
100
150
uA
采样周期
秒
1
次
注:
采样周期间隔不得低于1秒钟。
(2)硬件设计电路图如下所示:
(3)ELITE-III单片机开发板
五:
软件设计
(1)本系统的主要程序如下所示:
//2010年12月2日
//作者:
XX
//基于DHT11的温湿度监控系统(可以显示监测时间)
#include
#defineucharunsignedchar#defineuintunsignedint
sbitdht=P1^2;//DHT1引脚定义
//74LS138译码电路引脚定义,键盘,数码管,点阵使用时都需要它
sbitpa=P1^4;sbitpb=P1^5;
sbitpc=P1^6;//74hc138a.b.c输入端,控制数码管段选
sbitpoe=P1^7;//74HC138使能端
//全局变量uchari,j;
uints;
//DHT11变量定义
ucharbdatadht_data;//存储DHT11发来的一个字节的数据uchart1,t2,t3,t4,t5;//存放DHT11发来的一个字节的数据uchardht_tab[5];//存放DHT11发来的数据
//矩阵键盘
ucharkey,key_value;//读取键码
//时钟电路(计时)
uchart_count,t_hour;//计数毫秒和月uintt_time;//计数分
ucharmod;//时间修正(DHT11测温度占用)
//数码管显示值(共阳极)ucharcode
tab[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};//0至F
共16个数,全亮
//延时函数大约9.9us==delay
(1)voiddelay(uinttime)
{
while(time--);
}
//***********************************************************************************
//数码管显示模块
voiddisplay(uchartemp1,uchartemp2)//temp2个数码管显示temp1
{//
P2=0xff;//关闭数码管位选
poe=0;pa=0;pb=1;pc=0;//选中锁存器,未打开P0=temp1;
poe=1;poe=0;//打开74LS138
P2=temp2;//0xfe,0xfd,0xfb,0xf7,0xef,0xdf第1,2,3,4,5,6个数码管亮;
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0:
1,2,3,4,5,6个数码管亮
}
voiddisplayxx(uchartem1,uchartem2,uchartem3,uchartem4,uchartem5,uchartem6)
{//数码管显示函数(六个数码管都显示)display(tem1,0xfe);delay(100);display(tem2,0xfd);delay(100);display(tem3,0xfb);delay(100);display(tem4,0xf7);delay(100);display(tem5,0xef);delay(100);display(tem6,0xdf);delay(100);P2=0xff;
}
voiddisp()
{//数码管显示测试函数t1=12;t2=34;t3=56;
for(s=0;s<150;s++)
{
displayxx(tab[t1/10],tab[t1%10],tab[t2/10],tab[t2%10],tab[t3/10],tab[t3%10]);
}
P2=0xff;//关闭数码管位选for(s=0;s<150;s++)
{
displayxx(tab[7],tab[8],tab[9],tab[10],tab[11],tab[12]);
}
P2=0xff;//关闭数码管位选for(s=0;s<150;s++)
{
displayxx(tab[13],tab[14],tab[15],tab[16],tab[0],0xff);
}
P2=0xff;//关闭数码管位选
}
//结束
//***********************************************************************************
//***********************************************************************************
//DHT11测温度湿度模块
voidDHT11()
{
EA=0;//关闭总中断
dht=0;//单总线引脚,设为P1.2,主机发出开始信号
dht_data=0;//存放一个字节的数据for(i=0;i<20;i++)
delay(102);//大约1ms
dht=1;//拉高并延时
while(dht);//开始信号(等待主机发出的开始信号结束)
while(!
dht);//DHT11输出响应信号
while(dht);//DHT11输出响应信号延时
for(j=0;j<5;j++)
{//五个字节(共四十位)for(i=0;i<8;i++)
{//每次八位(一个字节的数据)
dht_data=dht_data<<1;//左移一位,最低位存储DHT11发来的数据
while(!
dht);//等待50us的低电平结束
delay(4);//延时大约40usif(dht==1)
{//判断总线信号(发来的是否是逻辑高)
dht_data=dht_data|0x01;//存储DHT11发来的一位数据
while(dht);//等待低电平,等待下一位数据发送
}
else
{//总线信号为低电平(发来的是逻辑低)
dht_data=dht_data|0x00;//存储DHT11发来的一位数据
}
}
dht_tab[j]=dht_data;//存储到数组中
}
delay(6);//EA=1;//
t1=dht_tab[0];//湿度整数部分
t2=dht_tab[1];//湿度小数部分
t3=dht_tab[2];//温度整数部分
t4=dht_tab[3];//温度小数部分
t5=dht_tab[4];//检验位
}
//结束
//***********************************************************************************
//***********************************************************************************
//时钟电路模块模块(使用定时器1,十六位定时器,50ms)voidTIME_init()
{
EA=0;
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
TMOD=0x15;//选择定时计数器模式1工作方式T0T1工作于方式1
TH1=0x3c;//初值50ms
TL1=0xb0;//初值
TR1=1;//开T0定时器
ET1=1;//允许T0定时器中断
EA=0;//关闭总中断
}
voidtimer0(void)interrupt3
{
EA=0;
TH1=0x3c;//初值50ms
TL1=0xb0;//初值t_count++;if(t_count==20)
{//是否到一秒t_count=0;
t_time++;//加一秒
if(t_time==43200)//是否到十二小时
{
t_hour++;//
if(t_hour==60)t_hour=0;//是否到一个月t_time=0;
}
}
EA=1;
}
voidTIME()//数码管显示时间
{
t1=t_time/3600;//时t2=(t_time-t1*3600)/60;//分
t3=t_time%60;//秒
if(t_hour%2)t1=t1+12;displayxx(tab[t1/10],tab[t1%10]&0x7f,tab[t2/10],tab[t2%10]&0x7f,tab[t3/10],tab[t3%10]);
}
//结束
//***********************************************************************************
//***********************************************************************************
//矩阵键盘模块
voidkeyscan()//扫描键盘
{
poe=0;
pa=0;pb=0;pc=1;//选中缓冲器RDKey(74LS138)
P0=0xff;P2=0xfe;//扫描0至8号键
poe=1;//打开缓冲器
if(P0!
=0xff)//判断1至8号键是否按下
{
delay(10);if(P0!
=0xff)
{
key=P0;
switch(key)
{
case0xfe:
key_value=0;break;case0xfd:
key_value=1;break;
case0xfb:
key_value=2;break;case0xf7:
key_value=3;break;case0xef:
key_value=4;break;case0xdf:
key_value=5;break;case0xbf:
key_value=6;break;case0x7f:
key_value=7;break;
default:
key_value=16;
break;//出错
}
}//大if
}
poe=0;//关闭缓冲器RDKey(74LS138)
P2=0xff;
poe=0;
pa=0;pb=0;pc=1;//选中缓冲器RDKey(74LS138)
P0=0xff;P2=0xfd;//扫描0至8号键
poe=1;//打开缓冲器
if(P0!
=0xff)//判断9至16号键是否按下
{
delay(10);if(P0!
=0xff)
{
key=P0;
switch(key)
{
case0xfe:
key_value=8;break;case0xfd:
key_value=9;break;
case0xfb:
key_value=10;break;case0xf7:
key_value=11;break;
case0xef:
key_value=12;break;case0xdf:
key_value=13;break;case0xbf:
key_value=14;break;case0x7f:
key_value=15;break;
default:
key_value=16;
break;//出错
}
}
poe=0;//关闭缓冲器RDKey(74LS138)
//delay(3000);//延时50us
}//大ifP2=0xff;
}
//结束
//******************************************************************************
//******************************************************************************
//主函数
//******************************************************************************voidmain()
{
P0=0xff;P1=0xff;P2=0xff;P3=0xff;key_value=16;i=0;j=0;s=0;mod=0;TIME_init();
disp();EA=1;s=0;
while
(1)
{
keyscan();if(key_value<12)
{//按1至12个键中的任意一个,显示时间TIME();
}
else
{//按13至16个键中的任意一个,显示温度if(s>200)
{//大约1.2s测一次温度s=0;
DHT11();
mod++;//粗略修正DHT11测温度占用的时间
if(mod==50)
{//大约20ms
t_time++;mod=0;
}
}s++;
displayxx(tab[t1/10],tab[t1%10]&0x7f,tab[t2/10],tab[t3/10],tab[t3%10]&0x7f,tab[t4%10]);
}
}
}
//主程序结束
//*******************************************************************
(2)程序流程图
六:
总结和展望
(1)总结
通过这次系统的设计和测试,我收获颇多。
首先,通过对该系统了解,收集资料,研究其可行性,前期做了很多准备工作,查看了很多资料,但这都是值得的,为后面程序的编写和调试打下了基础,不仅学到了编程,还加深了对电路的了解。
其次,由于时间紧迫,次系统还有许多改进的地方,由于是使用已有的ELITE-III单片机开发板,硬件电路上改动不大,只能从软件设计上修改。
此系统最大的亮点有两个,一是把以前所学的知识全部综合在一起,比如说数码管,矩阵键盘,定时器,中断等等,虽然都是一些已经学习过的知识,但结合起来还是有一定的难度;二是本系统既可以测温度和湿度,也可以显示监测时间,稍微改进一下,就可以变成一个时钟。
最后,对于该系统,改进地方可以从以下几点出发,一是重新设计硬件电路,去掉矩阵键盘,使用外部中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DHT11 温度 湿度 监测 系统 课程设计 报告