基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx
《基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温湿度DHT11采集word文档良心出品Word格式.docx(16页珍藏版)》请在冰点文库上搜索。
主机信号
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_():
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'
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);
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相连接的,所以就不能说控制多个按键实现不同的功能。