四联光电智能照明论坛

标题: 温湿度传感器(DHT11)C代码 [打印本页]

作者: 魔幻使者Jack    时间: 2015-11-16 16:51
标题: 温湿度传感器(DHT11)C代码
最近在玩各种传感器,发表下心得。
这个是STM8连接的一个数字温湿度传感器,只有1根数据线,表面上精度有16位,实际使用时发现,数据后八位(小数位)永远是0x00,╮(╯▽╰)╭,便宜货,就这样,手册见附件,附上代码:

  1. #include "DHT11.h"
  2.             
  3. static bool status;
  4. static u8 value_array[5];//存放五字节数据的数组

  5. void init_DHT11(void)
  6. {
  7.   DQ_PULL;
  8. }

  9. static u8 ReadValue(void)/*读一个字节的数据*/
  10. {
  11.   u8 count;
  12.   static u8 value = 0;
  13.   for(int i = 0; i <8; i++)
  14.   {
  15.     //高位在先
  16.     value =value<< 1;
  17.     count = 0;
  18.     while(DQ_read == 0 && count++ < 254);    //每一位数据前会有一个50us的低电平时间.等待50us低电平结束
  19.     if(count >= 254)
  20.     {
  21.       status=FALSE;
  22.       return 0;    //函数执行过程发生错误就退出函数
  23.     }
  24.     count=0;
  25.     while(DQ_read!= 0&& count++<254);
  26.     if(count>=254)
  27.     {
  28.       status=FALSE;
  29.       return 0;
  30.     }
  31.     else if(count>60)//26-28us的高电平表示该位是0,为70us高电平表该位1
  32.     {
  33.       value++;//进入这里表示该位是1
  34.       count=0;
  35.       while(DQ_read != 0 && count++ < 254);      //等待剩余(约40us)的高电平结束
  36.       if(count >= 254)
  37.       {
  38.         status=FALSE;
  39.         return 0;
  40.       }
  41.     }
  42.   }
  43.   status=TRUE;
  44.   return value;
  45. }


  46. u8* ReadTempAndHumi(void)//读一次的数据,共五字节
  47. {
  48.   u8 i = 0, check_value = 0,count=20;
  49.   
  50.   DQ_Out;
  51.   DQ_L;                 //拉低数据线大于18ms发送开始信号
  52.   _Delay(4);           //需大于18毫秒
  53.   DQ_H;        
  54.   while(count--); //让高电平保持一小段时间,不然会出错;
  55.   DQ_in;     //释放数据线,用于检测低电平的应答信号
  56.   count=0;
  57.   while(DQ_read != 0&& count++ < 254);    //检测应答信号,应答信号是低电平80us
  58.   if(count >=254)
  59.   {
  60.     return 0;
  61.   }
  62.   else
  63.   {  //有应答信号
  64.     count=0;
  65.     while(DQ_read == 0 && count++ < 254);   //等待应答信号结束
  66.     if(count >= 254)   //检测计数器是否超过了设定的范围
  67.     {
  68.       return 0;   //读数据出错,退出函数
  69.     }
  70.     count=0;
  71.     while(DQ_read != 0 && count++ < 254);  //应答信号后会有一个80us的高电平,等待高电平结束
  72.     if(count >= 254)
  73.     {
  74.       return 0; //退出函数
  75.     }
  76.     for(i = 0; i < 5; i++)  //读出湿.温度值
  77.     {
  78.       value_array[i] = ReadValue();
  79.       if(status==FALSE)//调用ReadValue()读数据出错会设定status为EROR
  80.       {
  81.         return 0;
  82.       }
  83.       if(i!= 4)//读出的最后一个值是校验值不需加上去
  84.       {
  85.         check_value += value_array[i];//读出的五字节数据中的前四字节数据和等于第五字节数据表示成功
  86.       }
  87.     }
  88.     if(check_value == value_array[4])  //在没用发生函数调用失败时进行校验
  89.     {  
  90.       return value_array;     //正确的读出dht11输出的数据
  91.     }
  92.     else
  93.     {
  94.       return 0;//校验数据出错
  95.     }
  96.   }
  97. }
  98. /********************************************************************************************/
复制代码






欢迎光临 四联光电智能照明论坛 (http://5xhome.com/) Powered by Discuz! X3.2