微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > 电子元器件 > DHT11的编程

DHT11的编程

时间:10-02 整理:3721RD 点击:
哪位大虾帮我看看,哪里出错了!
//这个程序只检测湿度
#include <reg52.h>  
//湿度位定义  
sbit dht11 = P2^0;
//存放两字节数据的数组  
static unsigned char value_array[2];
static unsigned char code array[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//函数声明      
void Delay_1ms(unsigned int ms);//延时
static void  Delay_10us(void); //延时 10us
static unsigned char ReadValue(void);//读一个字节的数据
static void SMG_Display(unsigned int value); //数码管显示
unsigned char ReadTempAndHumi(void);//读一次的数据,共五字节
int humi_value;

int main(void)  
{   
      //先等上电稳定  
      Delay_1ms(1000);  
      //因为读一次数据dht11 才会触发一次采集数据.  
      //即在先使用数据时采集一次数据     
      ReadTempAndHumi();  
      while(1)  
      {
             //显示湿度  
         SMG_Display(humi_value);   
       }  
       return 0;  
}  
//延时
void Delay_1ms(unsigned int ms)  
{  
      unsigned int x,y;  
      for(x=ms;x>0;x--)  
      {  
            for(y=124;y>0;y--);  
      }  
}
//延时10us
static void  Delay_10us(void)  
{  
    unsigned char i;  
    i--;  
    i--;  
    i--;  
    i--;  
    i--;  
    i--;  
}
//*读一个字节的数据
static unsigned char ReadValue(void)  
{  
      unsigned char count, value = 0, i;  
      for(i=2;i>0;i--)  
      {  
            //高位在先  
            value <<= 1;  
            count = 0;  
            //每一位数据前会有一个50us 的低电平时间.等待50us 低电平结束  
            while(dht11==0);  
            
            //26-28us 的高电平表示该位是0,为70us 高电平表该位1  
            Delay_10us();  
            Delay_10us();  
            Delay_10us();  
            //延时30us 后检测数据线是否还是高电平  
            if(dht11 != 0)  
            {  
                 //进入这里表示该位是1  
                 value++;  
                 //等待剩余(约40us)的高电平结束  
                 while(dht11 != 0)  
                 {  
                       dht11 = 1;  
                 }                  
            }  
      }      
      return (value);  
}  
//读一次的数据,共两字节  
unsigned char ReadTempAndHumi(void)  
{      
      unsigned char i=0,check_value=0,count=0;   
      dht11=0;       //拉低数据线大于18ms 发送开始信号  
      Delay_1ms(20);   //需大于18 毫秒  
      dht11=1;      //释放数据线,用于检测低电平的应答信号  
      //延时20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线80us  
      Delay_10us();  
      Delay_10us();  
      Delay_10us();  
      Delay_10us();      
      
      if(dht11==0)  
      {
              count = 0;  
        dht11 = 1;//释放数据线
      }   
      //应答信号后会有一个80us 的高电平,等待高电平结束   
      while(dht11 != 0);  
  
      //读出湿.温度值     
      for(i=0;i<2;i++)  
      {  
           value_array[i] = ReadValue();  
           check_value += value_array[i];   
      }  
      
      humi_value = value_array[0];  
      return humi_value;        
}
//数码管显示函数  
static void SMG_Display(unsigned int value)  
{  
      unsigned char ge,bai,shi;  
      ge=value%10;  
      shi=value%100/10;  
      bai=value%1000/100;
        
      
      P0=array[bai];  
      Delay_1ms(2);
        
      P0=array[shi];  
      P0|=0x80;  /*显示小数点*/   
      Delay_1ms(2);  

      P0=array[ge];   
      Delay_1ms(2);  
}        

加油

俺也不懂  不过俺想要小编的程序可否给?

其实我也不懂    谁给解说一下呀

我问一下,你这个程序数据智能检测到湿度吗。

这个这个这个俺也是新手

为什么我把DHT11的数据口接在STC89C52的P1^3时始终采集不到数据,电路我检查过没问题,而接在P2口就可以采集到数据,这是为什么呢?要毕业了,在忙这个毕业设计,好头痛!

挺好的程序,希望可以使用

哎,,,高不会

不懂  小编可否讲解一下

请问你的问题解决了吗

请问你还找得到这个程序吗,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top