温湿度传感器---DHT11

来源:互联网 发布:linux网关配置arp 编辑:程序博客网 时间:2024/04/28 19:36

一、DHT11简介

DHT11是一款有已校准数字信号输出的温湿度传感器,传感器包括一个电阻式感湿元件和一个NTC测温元件。



pin名称注释1VDD供电 3-5.5V DC2DATA串行数据,单总线3NC空脚,请悬空4GND接地,电源负极

二、DHT11模块特点

1. 可以检测周围环境的湿度和温度。

2. 湿度测量范围:20% - 95%(0 度-50 度范围)湿度测量误差:+-5%。
3. 温度测量范围:0 度 - 50 度温度测量误差:+/-2 度。

4. 工作电压3.3V - 5V。

5. 输出形式数字输出。

6. 单线制串行接口。

三、DHT11原理图


四、程序

#include <reg52.h>#include <intrins.h> typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable   */typedef signed   char  S8;       /* defined for signed 8-bits integer variable   */typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable  */typedef signed   int   S16;      /* defined for signed 16-bits integer variable    */typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable  */typedef signed   long  S32;      /* defined for signed 32-bits integer variable    */typedef float          F32;      /* single precision floating point variable  32   */typedef double         F64;      /* double precision floating point variable  64   */#define uchar unsigned char#define uint  unsigned int#define Data_0_time 4sbit  P2_0  = P2^0 ;U8  U8FLAG,k;U8  U8count,U8temp;U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;U8  U8comdata;U8  outdata[5]; U8  indata[5];U8  count, count_r = 0;U8  str[5]={"RS232"};U16 U16temp1,U16temp2;void SendData(U8 *a){    outdata[0] = a[0];     outdata[1] = a[1];    outdata[2] = a[2];    outdata[3] = a[3];    outdata[4] = a[4];    count      = 1;    SBUF       = outdata[0];}void Delay(U16 j){    U8 i;    for(; j > 0; j--)    {         for(i = 0; i < 27; i++);    }}void Delay_10us(void){    U8 i;    i--;    i--;    i--;    i--;    i--;    i--;}void COM(void){    U8 i;    for(i = 0; i < 8; i++)       {        U8FLAG = 2;        while((!P2_0) && U8FLAG++);        Delay_10us();        Delay_10us();        Delay_10us();        U8temp = 0;        if(P2_0)U8temp = 1;        U8FLAG = 2;        while((P2_0) && U8FLAG++);          if(U8FLAG == 1)break;        U8comdata<<=1;        U8comdata|=U8temp;        //0    }}void RH(void){    P2_0 = 0;    Delay(180);    P2_0 = 1;    Delay_10us();    Delay_10us();    Delay_10us();    Delay_10us();    P2_0 = 1;      if(!P2_0) //T !      {        U8FLAG = 2;         while((!P2_0) && U8FLAG++);        U8FLAG = 2;        while((P2_0) && U8FLAG++);        COM();        U8RH_data_H_temp = U8comdata;        COM();        U8RH_data_L_temp = U8comdata;        COM();        U8T_data_H_temp  = U8comdata;        COM();        U8T_data_L_temp  = U8comdata;        COM();        U8checkdata_temp = U8comdata;        P2_0 = 1;        U8temp = (U8T_data_H_temp + U8T_data_L_temp + U8RH_data_H_temp + U8RH_data_L_temp);        if(U8temp == U8checkdata_temp)        {            U8RH_data_H = U8RH_data_H_temp;            U8RH_data_L = U8RH_data_L_temp;            U8T_data_H  = U8T_data_H_temp;            U8T_data_L  = U8T_data_L_temp;            U8checkdata = U8checkdata_temp;        }    }}void main(){//uchar str[6]={"RS232"};TMOD = 0x20;TH1  = 253;TL1  = 253;TR1  = 1;SCON = 0x50;  ES   = 1;EA   = 1;TI   = 0;RI   = 0;SendData(str);Delay(1);while(1){   RH();   str[0] = U8RH_data_H;   str[1] = U8RH_data_L;   str[2] = U8T_data_H;   str[3] = U8T_data_L;   str[4] = U8checkdata;   SendData(str);   Delay(20000);}}void RSINTR() interrupt 4 using 2{    U8 InPut3;    if(TI == 1)    {        TI = 0;        if(count != 5)        {            SBUF = outdata[count];            count++;        }    }    if(RI == 1)      {        InPut3 = SBUF;        indata[count_r] = InPut3;        count_r++;        RI = 0;         if(count_r == 5)        {            count_r = 0;            str[0]  = indata[0];            str[1]  = indata[1];            str[2]  = indata[2];            str[3]  = indata[3];            str[4]  = indata[4];            P0 = 0;        }    }}



0 0
原创粉丝点击