2870|1

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

哪位高手玩过DHT11,有问题请教 [复制链接]

调试DHT11程序两天了 仍然觉得不对劲......代码如下
DHT11.C

#include
#include
#include "DHT11.H"

unsigned char DHT11_init(void){
        unsigned char i=16;
        DHT11_IO_OUT;
        DHT11_IO_SET;
        _delay_ms(1);
        DHT11_IO_CLR;
        _delay_ms(20);   //主机拉低IO,并至少保持18ms
        DHT11_IO_SET;
        _delay_us(10);   // 主机拉高IO 20到40us;其后 器件响应 40-50us电平
        
        DHT11_IO_IN;
        //DHT11_IO_SET;  //带有上拉 暂时注释,因为电路中已有4.7K上接电阻,以免上拉太强
        while(i--){   //每5us采样一次 若采到0 说明器件响应正常,若16次以后仍未采到 说明100us时间已过 器件仍未应答 有问题
                _delay_us(5);
                if (DHT11_IO_READ_L){
                while (DHT11_IO_READ_L){asm("nop");}  //本人程序中 读到响应0即完成器件存在的判断,故器件响应的0有可能尚未结束,nop若干进行渡过
            while (DHT11_IO_READ_H){asm("nop");}  //器件响应0后 会拉高IO 40-50us 后以低电平开始发数据,故渡过        
                        return 1;
                }
        }
        return 0;
        //器件应答正常则返回1 否则返回0 符合日常习惯
        
}        

unsigned char  DHT11_READ_BYTE(void){
        unsigned char i,dat=0;                      //DHT11_INIT时 已将口线设为输入
        for (i=0;i<8;i++){
                while (DHT11_IO_READ_L){asm("nop");}  //渡过每个数据开始位时的低电平12-14us 其后,器件将拉高数据线,发0时 保持26--28us 发1时 保持116-118us
                                               //故在渡过起始0电平后的50us时进行采样 若为高 则是1,若为低,实际是下一位的起始0电平,仍能说明当前所发的是0
        _delay_us(50);
        if (DHT11_IO_READ_H)
        {
           dat |= 0x01;                           //手册写明,数据格式是高位先出
           while (DHT11_IO_READ_H)
           {
                   asm("nop");                    //因发1时,高电平较长,nop渡过
           }
        }
        dat <<= 1;                                    //读到数据,左移1位,预备接收下一位
        }
        return dat;
}  


主程序片断

  while(1)
    {
               
               
               
                _delay_ms(255);
                _delay_ms(255);
                _delay_ms(255);
                _delay_ms(255);
                _delay_ms(255);
                _delay_ms(255);
                _delay_ms(255);
                LCD12864_WRITE_BYTE_S(0,0x01);
                DHT11_init();
                RH[0] = DHT11_READ_BYTE();
                RH[1] = DHT11_READ_BYTE();
                RH[2] = DHT11_READ_BYTE();
                RH[3] = DHT11_READ_BYTE();
                RH[4] = DHT11_READ_BYTE();
                LCD12864_WRITE_BYTE_S(0,0x88);
                LCD12864_WRITE_BYTE_S(1,RH[0]/100+0x30);
                LCD12864_WRITE_BYTE_S(1,(RH[0]%100)/10+0x30);
                LCD12864_WRITE_BYTE_S(1,(RH[0]%100)%10+0x30);
               
                LCD12864_WRITE_BYTE_S(1,' ');
                LCD12864_WRITE_BYTE_S(1,RH[1]/100+0x30);
                LCD12864_WRITE_BYTE_S(1,(RH[1]%100)/10+0x30);
                LCD12864_WRITE_BYTE_S(1,(RH[1]%100)%10+0x30);
               
                LCD12864_WRITE_BYTE_S(0,0x90);
                LCD12864_WRITE_BYTE_S(1,RH[2]/100+0x30);
                LCD12864_WRITE_BYTE_S(1,(RH[2]%100)/10+0x30);
                LCD12864_WRITE_BYTE_S(1,(RH[2]%100)%10+0x30);
                  
                LCD12864_WRITE_BYTE_S(1,' ');
                LCD12864_WRITE_BYTE_S(1,RH[3]/100+0x30);
                LCD12864_WRITE_BYTE_S(1,(RH[3]%100)/10+0x30);
                LCD12864_WRITE_BYTE_S(1,(RH[3]%100)%10+0x30);
                  
       LCD12864_WRITE_BYTE_S(0,0x98);
       LCD12864_WRITE_BYTE_S(1,RH[4]/100+0x30);
       LCD12864_WRITE_BYTE_S(1,(RH[4]%100)/10+0x30);
       LCD12864_WRITE_BYTE_S(1,(RH[4]%100)%10+0x30);                  
                  
                   if ((RH[0]+RH[1]+RH[2]+RH[3])==RH[4]){
                           LCD12864_WRITE_STR_S("check OK");
                   }
                   else
                   LCD12864_WRITE_STR_S("Error");
                  

程序运行结果如图
现在问题是  温度数据明显太高了 ,北方冬天室内 怎么就有40多度


请各位指点一下,谢谢

[ 本帖最后由 whg0109 于 2013-12-17 12:08 编辑 ]

DSC_0048.JPG (3.5 MB, 下载次数: 1)

DSC_0048.JPG

最新回复

现在解决了么?  详情 回复 发表于 2013-12-17 17:31

点评

现在解决了么?  详情 回复 发表于 2013-12-17 17:31
点赞 关注
 

回复
举报

577

帖子

9

TA的资源

纯净的硅(中级)

沙发
 

回复 楼主whg0109 的帖子

现在解决了么?
 
个人签名哈喽,我是卡索KaSuo~~
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表