温湿度传感器DHT11传感器应用

  • 格式:doc
  • 大小:3.12 MB
  • 文档页数:6

下载文档原格式

  / 15
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

温湿度传感器DHT11应用

学习C51单片机时做的第一个传感器就是DHT11,感觉学到了一点东西,以下是我自己的作品以及程序,希望可以帮到你...

DHT11主要是接收数据及处理的函数,根据它的时序图,一般会很容易写出函数,且不会出太大错误的。然后再使用LCD1602将数据显示出来,程序里都写得很清楚了。

程序原型如下:

#include

typedef unsigned char U8;

#define uchar unsigned char

#define uint unsigned int

sbit D=P0^3; //DHT11信号接收端

sbit lcden=P1^2; //1602使能端

sbit lcdrs=P1^0; //1602数据命令选择端

/************定义区************/

U8 FLAG;

U8 temp;

U8 TH,TL,RH,RL;

U8 TH_temp,TL_temp,RH_temp,RL_temp,check_temp;

U8 comdata;

/************延时函数************/

void delay(uint z) //毫秒级延长

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void Delay_nms(unsigned char n) // 延时n ms

{

U8 i,j;

for(j=n;j>0;j--)

{

for(i=0;i<29;i++);

}

}

void Delay1s() // 延时n s

{

U8 i,j,k;

for(i=20;i>0;i--)

{

for(j=250;j>0;j--)

{

for(k=250;k>0;k--);

}

}

}

void Delay_40us(void) //延时40us

{

U8 i;

for(i=0;i<12;i++);

}

/************DHT11采集数据************/

void DATA_R(void)

{

U8 i;

for(i=0;i<8;i++) //每次采集8位数据

{

FLAG=2;

while((!D)&&FLAG++); //拉低50us 为接受一bit数据作准备

D=1; //电平已拉高,这句可不要

temp=0; //默认为低电平,即"0"

Delay_40us(); //延时40s后再测

if(D) temp=1; //如果40us后仍是高电平,是"1"

comdata<<=1;

comdata|=temp; //将值赋给U8comdata,每次赋一位

FLAG=2;

while((D)&&FLAG++); //延时等待电位降低进行下一次循环}

}

/************DHT11数据校验************/

void DATA_C(void)

{

D=0;

Delay_nms(180); //主机拉低电位180ms

D=1;

Delay_40us(); //主机拉高电位40us

D=1;

if(!P) //如果电位为低,表明从机响应信号已到达

{

FLAG=2;

while((!D)&&FLAG++); //判断从机拉低电位80us

FLAG=2;

while((D)&&FLAG++); //判断从机拉高电位80us,准备采集数据

DATA_R();

RH_temp=comdata; //湿度高8位

DATA_R();

RL_temp=comdata; //湿度低8位

DATA_R();

TH_temp=comdata; //温度高8位

DATA_R();

TL_temp=comdata; //温度低8位

DATA_R();

check_temp=comdata; //校验8位

D=1;

temp=(TH_temp+TL_temp+RH_temp+RL_temp);

if(temp==check_temp) //数据校验如果正确进行下一步

{

RH=RH_temp;

RL=RL_temp;

TH=TH_temp;

TL=TL_temp;

}

}

}

/************LCD1602部分************/

void write_data(uchar date) //1602写数据

{

lcdrs=1;

P3=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

// delay(200);

delay(5);

}

void write_com(uchar com) //1602写指令

{

lcdrs=0;

P3=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void LCD_init() //1602初始化

{

lcden=0;

write_com(0x38); //8位,2行

write_com(0x0c); //显示开,光标关,不闪烁

write_com(0x06); //读写字符指针加1,屏幕不移动write_com(0x01); //清屏

}

/************主函数************/

void main()

{

DATA_C();

P2=TL;

LCD_init();

while(1)

{

write_data('S'); // 第一行显示湿度

write_data('D');

write_data(':');

write_data(RH/10+0x30);