基于51单片机的温湿度DHT11采集word文档良心出品.docx
《基于51单片机的温湿度DHT11采集word文档良心出品.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温湿度DHT11采集word文档良心出品.docx(16页珍藏版)》请在冰豆网上搜索。
![基于51单片机的温湿度DHT11采集word文档良心出品.docx](https://file1.bdocx.com/fileroot1/2022-12/19/5ef52ab2-cd3e-46d0-b234-97d9b685b424/5ef52ab2-cd3e-46d0-b234-97d9b685b4241.gif)
基于51单片机的温湿度DHT11采集word文档良心出品
一.设计目的
温湿度控制系统早己经成为当今社会研究的热门领域之一,同时温湿度也是现今工农业生产生活中必须要首先考虑的崑要因素之一。
因此现今社会生产生活中就迫切需要一种价格便宜、容易操作而且精确度高的温湿度控制系统。
本系统设计就是利用AT89C52单片机对温湿度参最进行•检测进而实现对温湿度参量的控制。
本系统设计通过使用AT89C52单片机、DHT11传感器模块、LCD1602液晶显示屏模块以及LED闪烁和蜂鸣器报警模块。
简单的系统设计就可以基本上满足本系统设计的系统设计耍求。
DHTU数字温湿度传感器负责把采集到的温湿度信号传送给AT89C52单片机。
温湿度经过AT89C52单•片机处理,然后AT89C52准确地把温湿度信号发送到LCD1602液晶显示屏模块,温湿度数据就可以准确地显示到LCD1602液晶屏上面,同时我们可以分别对温度和湿度设置上下限,越限LED闪烁和蜂鸣器报警模块。
二.设计要求和方案选择
・LCD1602能够实时、准确的显示AT89C52采样温度值和湿度值,显示设定报警的温度和风扇的状态。
・DHT11采集温度及湿度值,AT89C52能够将DHT11输送过來的采集信息,准确的判断标准值与设定值之间的差异,及吋的启动报警装置(LED闪烁和蜂鸣器)进行报警。
•根据采集温湿度的数据进行判断,控制继电器进行风扇的开闭
传感器选择方案
•方案一:
利用两个传感器分别检测温度和湿度值,温度检测模块选用
DS18B20温度传恋器(+-0.5°C)o湿度检测模块选用HS1101电容式湿度传感器(+-5%RH)o这两款传感器都是我们大学实践电子设计中非常常见和常用的传感器。
•方案二:
检测温湿度数值选用DHT11传感器作为系统设计的温湿度检测模块。
DHT11传感器能够同时对温度和湿度数值进行检测,而且其精确度能过完全满足本课程设计的精度要求。
湿度、温度测量误差:
+-5%>+-2度
•经过上述分析,方案一虽然精度更精确。
却稍显复杂。
方案二虽然DHT11
传感器没怎么使用过,即便不能达到方案一那么高的精度要求,仍也能满足系统设计要求,而且更加简单,更加容易实现,也更加稳定可靠。
所以我选择方案二。
DHT11数字温湿度传感器是一款4针单排引脚封装的传感器模块。
DHT11传感器主要应用于场所温湿度的检测,性能稳定可靠。
DHT11传感器主要由一个电阻式感湿元件和一个NTC测温元件组成,DHT11传感器引脚可以宜接与AT89C52宜接相连接。
该传感器连接十分方便,所以利用该传感器制作本系统设计可以使系统制作变得十分简单。
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据十8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”8bit湿度整数数据+8bit湿度小以数据+8bi温度楼数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHTU从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集•采集数据后转换到低速模式。
总线空闲状态为高电半,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延吋等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉髙。
他号线说酬:
主机信号
DHTtt号
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电半的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如
信号线说明:
数字1信号表示方法
信号线说明:
主机信号DHT信号
DHTU软件流程
显示器选择方案
・方案一:
采用12864液晶显示屏。
12864液晶显示模块口身内置8192个中文汉字、128个字符及64X256点阵显示RAM。
可以显示汉字以及图案。
・方案二:
选择使用LCD1602液晶显示屏。
LCD1602能够显示16列2行,但是只能显示字母、数字和符号能显示16*2个字符,不能显示汉字。
由于LCD1602寄存器不止32个,所以软件编写可以使字符一个个显示、字符从左到右或从右到左显示等等,显示效果比较简单。
・经过上述分析,在编程使用方面,12864液晶显示屏和LCD1602难度差不多,虽然12864液晶屏可以显示更多的字符,汉字,乃至图案,有更多LCD1602不具备的功能。
但是LCD1602液晶屏也能实现系统设计的要求,而且LCD1602价格比较便宜,而12864液晶显示屏最至少四十块钱。
综上所述,LCD1602就是最好的选择。
・LCD1602能够同时显示32个字符(16列2行)LCD1602液晶模块里面的
字符发生存储器已经存储了160个不同的字符图,但是没有汉字,12864液晶模块可以显示汉字。
我们是通过指令编程來实现LCD1602的读写操作、屏幕和光标的操作等操作的(1为高电平,0为低电平)
•写操作时序
读操作时序
1C
程序流程图
卄始
三、硬件部分
总电路图:
£;一三—耳pqII-th
・•
e7"
~r
■J-.1
^/OOO&OCT:
181/OC2BJO2K3J«O7«rTF4QC・gfS
:
黑
.frr
AMIMA
•WTZELIW*esr
WC
MF2»UT2:
xuuXTM:
»>
323
cc
4Tt®OM»r»jTirrrcuwrriff
•«n
U>*2!
•UM*
1DF2!
•um4UW
MLAYE
DHT11模块电路
GND
无源蜂鸣器电路
VCC5V
IK
ND
R—
GKD
继电器电路
P44
四、软件设计
LCD1602显示程序
tifndef_LCD_H
#define二LCD[口
sbitrw=P3^6;7/
ebita=P3八5;
sbxtep=P3^4;
sbitdula=P2^6;
sbitwela=P2^7;
//常穴黑仃六理常穴理禅穴曲禅穴★和■•黑常打穴禅*穴常片穴穴常比黑W穴碎育穴常需畀
bitlcd_bz()//检测lcdB?
jtr碌状态
{
bitreault=0xS0;
PO=Oxff;
rS=a;//i卖忙信号
rw=l;
皀p-1;
_nop_();
_nop_();
_nop_():
_nop_();
result=(bit)(PO&Ox80);
ep-0;
returnresult:
;
}
voidwrite^cmd(ucharcmd)//写指令〃
{
〃while(lcd_bz());
PO=crr.d;
rs-O;
皀p=0;
delay(l);
ep-1;
delay
(1);
ep=O;
voidwxice_addr(ucharmdd:
:
)//写入的地址//
<_wxlre_cnkd(addx|OxSO);〃LCD第一行的首地址
}
voidwrite_byte(uchardat)〃与孑帀〃
//while(lcd^bz());PO=dat;
工Al;
ep=O;
delay
(1);
ep^l;
delay
(1);
ep=0;
}
voidlcd_init()//lcd^J始化//
xw-3;
dula=O;
wela=O;
write_cmd(0x38);//设宣1沪2显示,尹7点阵,8•位数据接口
delay
(1);
wr±re_cmd(OxOc);//设宣开显示,不显示光标
delay
(1);
write_cmd(0x06):
//写一个字符后地址指针加1
delay
(1);
wrxte_CTLd(0x01);//显示渣0,数青指针消0
delay
(1);
}
voiddisplay(ucharadclrrucharq>//addr写入的地址,q写入的字苻或者数字
delay(10>;
wrire_addr(addr>;
wr±ce_byte(q);
delay720>;//LCD显示数据跳变的频率4endif
延时函数
#ifndef_DELAY_H_
#define_DELAY_H_
#defineuintunsignedint
♦defineucharunsignedchar
//★★★★★★★★★★★★★★★**・**・********
voiddelay(ucharms)//延时模块//
{
uchari;
while(ms——)
for(i=0;i<100;i++);
voiddelayl()//大概8us的延时
uchari;
for(i=0;i}
#endif
温湿度DHT11
“fnctofDET“5~
#defineDHT11~H
fincludo'•DELAY.hn
uchardata_byte;
ucharRHfRL^TH/TL;
qbitio=P17;//DHT11接收塔
sbitrelay=P2/s2;
sbitb^op=P2^3;
sbitled-PlA4;
voidst曰工t()//开始'吉号
{
io=l;
dolayl(};
io=0;
delay(25);//3Z低忌线大TblSms,保证能捡测到起始侶号io=l;〃脸测到开始信号后,将电平拉高20-403
delayl();
delayl();
delayl()#//3个延时差不多3*e=24s
}
ucharreceive_byte()//接收一个宇节//
{_
uchariftemp;
for(i=0;i<8;i++)//接受3b"的数拓
{
while(!
io)待503的低电平开始信号结束
delayl();//幵始信号结束之后,5i3^26us-28usdelayl(};
delayl():
tempeh//如果时问为26us-23us则表示汝收至[的救捱是10#
if(io==l)
temp=l;//如杲:
时间扭过26us-26us则表示按收到的数攥是while(io);〃等芍数捱信号高电干3为26us-28us・1/为7Ousdata_byte«=';//将無爭的数梅向高位左瘗
dzrtabytc|fcmp;
returndatabyte;
void“give()//多受《数拒//
{
ucharT_HrT_LrR_H,R_L,check#num_ch.ecZri;
start()次//开始倍号//
io=l;〃主机沒为输入判断从机nHf的响应的信号
if仁io)//判断从机是否有响血詹号
{
whig(!
io)〃/判断从机发出BOX低电平啊应信号是否结束
while(io);//判断从机奖出80us低电平网卫侶号是否结束,若结束进入效堀按受状态
R_E=rGcexve_byre{);//湿更整数
R_L=rece1ve_byte()f//湿皮小叛
T_K=recoxvG_by^e();//温竟整数
T_L=receive—byte();//温肾小数
checlv=receive_byte();//校骏位
io=0;//当所宥的数据接收完成后,将从机电平拉低50“
for(i-0;i<7;i++)〃拉低大概50xs
dalayl();
将从机电平拉高,进入空闲状志
nura^chGCk=R_H+R_L+T_H4T_L;
if(num_checX—check)//舸断读取的数椁与校酚f立号否相冋
{
RH=R_H;
ri>・r[s
TH=T_H;
TL=T_L;
chGck=num_chGck;
}
}
>
lendif
主程序和按键
tinclude
uchartable(]={-0123456789"};sbitSl-P3^7;
sbitS2=P3八6;
uchar11=50,12=50;//设定勿始湿度报警值
y^**********«r*******ir***v*************»»~函*************************************voidmain()
led一ini匕():
//初始化LCD2.6O2//display(OxOOrtable[1]);
while
(1)
{
receive();//姿受数据
display(0x00r'R');//LCD^—行显示
display(0x01r1:
');
display(0x02rtable[RH/10]);
display(0x03rtable[RH%10]);〃湿度整数显示
display(0X04r;
display(0x40,"T1);//LCD第二行显示
display(0x41r1:
');
display(0x42rtable(TH/10]);
display(0x43rCable(TH%10));〃温麦整数显示
dx3play(0x44r•C');
display(0x97'R»)"/LCD第—行蠹示
dioplay(0x38r・:
•);
display(0x39,table[11/10]);
display(0x3artable[Il%:
0]);display(0x0br・Z);
display(0x47J");//LCD第一行显示
display(0x48,・八);
display(0x49rtable[12/iO]);
display(Ox4bz1C1);
〃设定湿度报警范围
if(Sl=0)
{
delay(5);
if(!
S1)
{
11=11+1;
display(0x09,t-able[11/10]);display(0x0artabl包;delay(200);
while(!
SI)
{
I1++;
if(Il>99)
11=0;
delay(50);
display(0x09rtablm[11/10]);display(0x0artabl七[Tl%10]);}
}
}
if(S2==0)
{
delay(5);
if(!
S2)
{
12=12+1;
display(0x49rtabIm[12/10]);display(0x4artable[l2%10]);delay(200);
while(IS2)
{
I2++;
if(I2>99)
12=0;
delay(50);
display(0x49rtable[12/10]);display(0x4aftfiLblm[I2%1O]);}
}
}
//进行湿度判断
//当湿度太高的时候,进行报警
if(|(TH>I2))
//进行湿度判断
〃当湿度太高的时候,进行报警if((RH>I1)|(TH>I2))I
relay=O;led=O;beep=O;
delay(400);led=l;
beep=L;delay(400);
〃显示风.扇的开关状态
display(0x0drro1);display(0x0errn1);
display(0x4dzr*);display(0x4err*);
display(0x4frr1);
}
〃当湿度降低时J取消报鲁
if(|
{ led=L; beep=L;relay=l; 〃显示风扇的开关状态 display(0x4drro1);display(0x4ezTf*); display(0x4frrf1);display(0x0drr1); display(0x0err1); } } 五、调试及运行结果 当渥度达到设定的范围的时候,显示风扇开 当湿度低于设定的范围的时候,显示风扇关 六、总结(感想和心得等) 此次的课程设计做的是我最心塞的一次,因为队友实在是太不给 力了,本来是打了一张板了,可是不知道什么原因LCD1602一直显示不出来,也没有在检查,后来就只能用直接用开发板做了。 这个温湿度釆集控制系统,最最关键的就是温湿度模块——HT11o因为要根据DHT11的参考手册里面的时序来写,才能读取到DHT11传回来的数据,一开始怎么也不能读取到,最后还是万能的XX帮了忙,学到了一个FOR循环大概是8us才能准确的控制时间来读取数据。 还有一个问题不能解决的是LCD的判斷忙的程序不知道为什么不能用。 一直处于忙的状态。 和网上的写法是一样的,可是LCD就是一直是忙的状态。 这个我也是不能解决。 学会了键盘的更多功能。 例如不用通过延时来消抖,按键长按的功能都是很使用的。 由于开发板的P3是键盘和LCD相连接的,所以就不能说控制多个按键实现不同的功能。
展开阅读全文
相关搜索
|