DHT11温湿度传感器Word格式.docx
《DHT11温湿度传感器Word格式.docx》由会员分享,可在线阅读,更多相关《DHT11温湿度传感器Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
1.2主要容
本文设计的是基于单片机STC89C52的温湿度检测和控制系统,主要以广泛应用的DHT11作为温度和湿度的检测,该仪器具有测量精度较高、硬件电路简单、并能很好的进行显示,可测试不同环境温湿度的特点。
另外和控制电路相连,可以进行加湿电路和除湿电路的控制,使温度和湿度参数在预先设定的围,不需要人的直接参与。
单片机是系统的控制核心,所以单片机的性能关系到整个系统的好坏。
因此单片机的选择,对所设计系统的实现以及功能的扩展有着很大的影响。
本设计中,最终选用的集成温度传感器DHT11,采集到的温湿度信号送至单片机,实现温湿度的显示与控制。
系统主要由以上元器件组成,通过硬件电路和软件程序的设计,实现系统的基本功能
1.3系统总体方案设计
用新型的智能集成温温度传感器DHT11主要实现检测温度、湿度的检测,将温度湿度信号通过传感器进行信号的采集并转换成数字信号,再运用单片机STC89C52进行数据的分析和处理,并在LCD1602上显示当前温湿度。
1、DHT11产品概述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个DHT11传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP存中,传感器部在检测信号的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
产品为4针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
DHT11传感器实物图
2、引脚说明
引脚号引脚名称类型引脚说明
1VCC电源正电源输入,3V-5.5VDC
2Dout输出单总线,数据输入/输出引脚
3NC空空脚,扩展未用
4GND地电源地
3、电源引脚
DHT11的供电电压为3-5.5V。
传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。
电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。
4、串行接口(单线双向)
DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
1.4单片机STC89C52
STC89C52是一种低功耗、高性能CMOS八位微控制器,具有8K在系统可编程Flash存储器,使用ATMEL公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许ROM在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使其为众多嵌入式控制应用系统提供灵活的解决方案。
1、主要特性如下:
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051
2.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
3.工作频率围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
4.用户应用程序空间为8K字节
5.片上集成512字节RAM
6.通用I/O口(32个),复位后为:
P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成
8.具有EEPROM功能
9.具有看门狗功能
10.共3个16位定时器/计数器。
即定时器T0、T1、T2
11.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒
12.通用异步串行口(UART),还可用定时器软件实现多个UART
13.工作温度围:
-40~+85℃(工业级)/0~75℃(商业级)
14.PDIP封装
2、STC89C52RC单片机的工作模式
掉电模式:
典型功耗<
0.1μA,可由外部中断唤醒,中断返回后,继续原程序
空闲模式:
典型功耗2mA
正常工作模式:
典型功耗4Ma~7mA
掉电模式可由外部中断唤醒,适用于水表、气表等电池供电系统及便携设备
如图芯片引脚图
VCC:
电源
Vss:
地
P0端口(P0.0~P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。
此时,P0口部上拉电阻有效。
在FlashROM编程时,P0端口接收指令字节;
而在校验程序时,则输出指令字节。
验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):
P1口是一个带部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端口写入1时,通过部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有部上拉电阻,那些被外部拉低的引脚会输出一个电流。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。
P2端口(P2.0~P2.7,21~28引脚):
P2口是一个带部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过部的上拉电阻把端口拉到高电平,这时可用作输入口。
P2作为输入口使用时,因为有部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVXDPTR”指令)时,P2送出高8位地址。
在访问8位地址的外部数据存储器(如执行“MOVXR1”指令)时,P2口引脚上的容(就是专用寄存器(SFR)区中的P2寄存器的容),在整个访问期间不会改变。
在对FlashROM编程和程序校验期间,P2也接收高位地址和一些控制信号。
P3端口(P3.0~P3.7,10~17引脚):
P3是一个带部上拉电阻的8位双向I/O端口。
P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过部的上拉电阻把端口拉到高电位,这时可用作输入口。
P3做输入口使用时,因为有部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流。
在对FlashROM编程或程序校验时,P3还接收一些控制信号。
RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,用来完成单片机的复位初始化操作。
看门狗计时完成后,RST引脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/PROG(30引脚):
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在Flash编程时,此引脚也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址位8EH的SFR的第0位置“1”,ALE操作将无效。
这一位置“1”,ALE仅在执行MOVX或MOV指令时有效。
否则,ALE将被微弱拉高。
这个ALE使能标志位(地址位8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN(29引脚):
外部程序存储器选通信号是外部程序存储器选通信号。
当AT89C51RC从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而访问外部数据存储器时,PSEN将不被激活。
EA/VPP(31引脚):
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
注意加密方式1时,EA将部锁定位RESET。
为了执行部程序指令,EA应该接VCC。
在Flash编程期间,EA也接收12伏VPP电压。
XTAL1(19引脚):
振荡器反相放大器和部时钟发生电路的输入端。
XTAL2(18引脚):
振荡器反相放大器的输入端。
第2章系统的硬件设计和连接
2.1、时钟电路
STC89C52部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。
时钟可以由部方式产生或外部方式产生。
如下:
2.2、复位电路
RST引脚是单片机复位端,高电频有效。
在引脚端输入至少连续两个单片机周期的高电频,单片机复位。
使用时,在引脚与VSS引脚之间接一个10KΩ的下拉电阻,与VCC引脚之间接一个约10μF的电解电容,即可保证上电自动复位。
2.2、显示模块
LCD1602引脚功能图:
2.3、传感器模块
第3章总结
回顾起此次单片机课程设计,我仍感慨颇多,从理论到实践,在接近二星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题。
首先,说说焊接的美观程度,这是我所骄傲的,我焊接的很美观、明了。
但在设计的过程中也发现了自己的不足之处,对以前所学过的知识理解得不够深,把硬件焊接出来后,由于编程不熟,导致推迟了对硬件功能的检测,最终在指导老师的耐心指导下完成所有功能检测,两位老师的耐心指导,使我意识到专业知识的重要性,以后会更加努力!
第4章
程序:
/***********************lcd1602.h***************************/
U8codetable2[]="
wendushidu"
;
U8codetable3[]="
.."
sbitRS=P2^6;
sbitRW=P2^5;
sbitE=P2^7;
voidwrite_(U8)
{
E=0;
RS=0;
RW=0;
Delay(5);
E=1;
P0=;
}
voidwrite_date(U8date)
RS=1;
P0=date;
P0=0;
voidinit()
{
U8num;
Delay(15);
write_(0x38);
write_(0x0c);
write_(0x06);
write_(0x01);
for(num=0;
num<
15;
num++)
{
write_date(table2[num]);
Delay
(1);
}
write_(0x80+0x40);
write_date(table3[num]);
voidwrite_dht11(U8add,U8date)
U8shi,ge;
shi=date/10;
ge=date%10;
write_(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
/***********************dht11.h***************************/
typedefunsignedcharU8;
typedefunsignedintU16;
sbitP1_0=P2^0;
U8U8FLAG,k;
U8U8temp;
U8U8T_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_temp;
U8U8comdata;
voidDelay(U16z)
U8x,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
voiddelay_10us()
{
U8i;
i--;
voidCOM(void)//数据01确认
for(i=0;
i<
8;
i++)
{
U8FLAG=2;
while((!
P1_0)&
&
U8FLAG++);
//1bit是否结束
delay_10us();
U8temp=0;
//26us~28us表示为0
if(P1_0)U8temp=1;
//超过28us依然为高电平表示为1
while((P1_0)&
if(U8FLAG==1)break;
//U8FLAG溢出超时则跳出for循环
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
U8comdata<
<
=1;
U8comdata|=U8temp;
}
voidRH(void)//-----湿温度读取子程序------------
P1_0=0;
Delay(34);
//主机拉低高于18ms
P1_0=1;
//总线由上拉电阻拉高主机延时20us
//主机设为输入判断从机响应信号
if(!
P1_0)//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
U8FLAG=2;
while((!
//判断从机是否发出80us的低电平响应信号是否结束
while((P1_0)&
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
COM();
//数据接收状态
U8RH_data_H_temp=U8comdata;
//湿度整数8位
COM();
U8RH_data_L_temp=U8comdata;
//湿度小数8位
U8T_data_H_temp=U8comdata;
//温度整数8位
U8T_data_L_temp=U8comdata;
//温度小数8位
U8checkdata_temp=U8comdata;
//校验位
P1_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;
}
/***********************main.c***************************/
#include<
reg52.h>
LCD1602.h>
U16a,b,t;
U8flag,i;
voidmain()
RW=1;
t=0;
flag=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
init();
P2=0xff;
Delay(40);
while
(1)
RH();
write_dht11(0,U8T_data_H);
write_dht11(3,U8T_data_L);
write_dht11(9,U8RH_data_H);
write_dht11(12,U8RH_data_L);
if(flag==2)//100后flag为2,进行比较
{
if(a==U8T_data_H&
b==U8RH_data_H)
Buzzer=0;
while(a==U8T_data_H&
b==U8RH_data_H);
flag=0;
test();
voidtimer0()interrupt1
t++;
if(t==2000)//100秒检测一次
t=0;
flag=2;
//100秒后flag为2
if(flag==0)//最开始flag为0赋值
a=U8T_data_H;
b=U8RH_data_H;
flag=1;
//flag变化
电路原理图:
电路PCB图:
元件参数表:
元件参数表
资料引用
《新概念C51单片机》郭天祥著2006电子工业