基于51单片机的DHT11数字温湿度计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define uchar unsigned char
#define uint unsigned int
ucharbyte,SH,SL,WH,WL,CHECK,FLAG;
sbit LCDRS=P3^2;
sbit LCDEN=P3^3;
//sbit LCDRW=P2^2;
sbit BUS=P3^4;
void delay(ucharms) //精确1ms
{
uchari,j;
for(i=ms*5;i>0;i--)
for(j=100;j>0;j--);
}
void delay1() //约7us
{
uchari;
for(i=3;i>0;i--);
}
/***************LCD配置**********************/
/********************
bit check_busy()//检测busy
{
uchar temp;
bit BB;
LCDRS=0;
LCDRW=1;
LCDEN=1;
P0=temp;
delay(5);
LCDEN=0;
BB=(bit)(temp&0x80);//检测D7是否为1,为1则忙return BB;
}
*********************/
voidwrite_com(uchar com)
{
// while(check_busy());//检测LCD是否忙
delay(5);
LCDRS=0;
// LCDRW=0;
LCDEN=0;
P1=com;
delay(5);
LCDEN=1;
delay(5);
LCDEN=0;
}
voidwrite_data(uchardat)
{
// while(check_busy());//检测LCD是否忙delay(5);
LCDRS=1;
// LCDRW=0;
LCDEN=0;
P1=dat;
delay(5);
LCDEN=1;
delay(5);
LCDEN=0;
}
void dis(ucharadd,uchardat)
{
delay(10);
write_com(add);///送地址
delay(5);
write_data(dat);///送数据
delay(5);
}
voidinit()
{
FLAG=0;
delay(50);
write_com(0x38);
_nop_();
write_com(0x0c);
_nop_();
write_com(0x06);
_nop_();
write_com(0x80);
_nop_();
write_com(0x01);
_nop_();
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*********************DHT11**********************/
void start()
{
BUS=1; //起始总线为高电平
_nop_();
BUS=0; //主机拉低
delay(25); //延时大于18ms
BUS=1; //主机拉高
delay1();
delay1();
delay1();
delay1();
}
ucharreceive_byte()
{
uchari,temp;
for(i=0;i<8;i++)
{
while(!BUS); //检测50us低电平延时是否结束
delay1();
delay1();
delay1();
delay1();
temp=0; //26~28us为数据“0”
if(BUS==1) //70us为数据“1”
temp=1;
while(BUS); //检测数据高电平结束
byte<<=1; //数据存储在bite里,每次右移一位
byte|=temp; //bite右移空位补零,然后与temp进行或运算,赋值给bite }
return byte;
}
voidreceive_data()
{
uchar S_H,S_L,W_H,W_L,CHECK_;
while(FLAG); //采集周期标志位
start();
BUS=1; //设定总线为输入状态
while(BUS); //检测DHT响应低电平
while(!BUS); //检测DHT拉高总线电平
while(BUS); //检测80us后拉低电平
S_H=receive_byte();
S_L=receive_byte();
W_H=receive_byte();
W_L=receive_byte();
CHECK_=receive_byte(); //40bit数据
while(BUS);
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1();
delay1(); //延时50us
BUS=1; //总线经上拉电阻拉高
CHECK=S_H+S_L+W_H+W_L; //校验运算
if(CHECK==CHECK_) //校验
{
SH=S_H-7;
SL=S_L;
WH=W_H-1;
WL=W_L;
CHECK_=CHECK;
}
}
/******************MAIN********************/ void main()
{
init();
while(1)
{
receive_data();
/*********湿度*************/
dis(0x80+0x01,'D');