基于51单片机的DHT11数字温湿度计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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');

相关文档
最新文档