基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx

上传人:b****6 文档编号:8509440 上传时间:2023-05-11 格式:DOCX 页数:16 大小:300.80KB
下载 相关 举报
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第1页
第1页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第2页
第2页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第3页
第3页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第4页
第4页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第5页
第5页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第6页
第6页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第7页
第7页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第8页
第8页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第9页
第9页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第10页
第10页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第11页
第11页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第12页
第12页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第13页
第13页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第14页
第14页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第15页
第15页 / 共16页
基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx

《基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx(16页珍藏版)》请在冰点文库上搜索。

基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx

主机信号

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»

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_():

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^l;

ep=0;

voidlcd_init()//lcd^J始化//

xw-3;

dula=O;

wela=O;

write_cmd(0x38);

//设宣1沪2显示,尹7点阵,8•位数据接口

wr±

re_cmd(OxOc);

//设宣开显示,不显示光标

write_cmd(0x06):

//写一个字符后地址指针加1

wrxte_CTLd(0x01);

//显示渣0,数青指针消0

voiddisplay(ucharadclrrucharq>

//addr写入的地址,q写入的字苻或者数字

delay(10>

wrire_addr(addr>

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的延时

l;

#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()#//3个延时差不多3*e=24s

ucharreceive_byte()//接收一个宇节//

{_

uchariftemp;

for(i=0;

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();

//校骏位

//当所宥的数据接收完成后,将从机电平拉低50“

for(i-0;

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'

)"

/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);

S2)

12=12+1;

display(0x49rtabIm[12/10]);

display(0x4artable[l2%10]);

while(IS2)

I2++;

if(I2>

12=0;

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(|<

TH<

led=L;

relay=l;

〃显示风扇的开关状态

display(0x4drro1);

display(0x4ezTf*);

display(0x4frrf1);

display(0x0drr1);

display(0x0err1);

五、调试及运行结果

当渥度达到设定的范围的时候,显示风扇开

当湿度低于设定的范围的时候,显示风扇关

六、总结(感想和心得等)

此次的课程设计做的是我最心塞的一次,因为队友实在是太不给

力了,本来是打了一张板了,可是不知道什么原因LCD1602一直显示不出来,也没有在检查,后来就只能用直接用开发板做了。

这个温湿度釆集控制系统,最最关键的就是温湿度模块——HT11o因为要根据DHT11的参考手册里面的时序来写,才能读取到DHT11传回来的数据,一开始怎么也不能读取到,最后还是万能的XX帮了忙,学到了一个FOR循环大概是8us才能准确的控制时间来读取数据。

还有一个问题不能解决的是LCD的判斷忙的程序不知道为什么不能用。

一直处于忙的状态。

和网上的写法是一样的,可是LCD就是一直是忙的状态。

这个我也是不能解决。

学会了键盘的更多功能。

例如不用通过延时来消抖,按键长按的功能都是很使用的。

由于开发板的P3是键盘和LCD相连接的,所以就不能说控制多个按键实现不同的功能。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2