四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4135|回复: 0
打印 上一主题 下一主题

温湿度传感器(DHT11)C代码

[复制链接]
  • TA的每日心情
    郁闷
    2016-1-18 09:58
  • 7

    主题

    30

    帖子

    326

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    326
    跳转到指定楼层
    楼主
    发表于 2015-11-16 16:51:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近在玩各种传感器,发表下心得。
    这个是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. /********************************************************************************************/
    复制代码

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-4-30 00:24 , Processed in 1.093750 second(s), 29 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表