4133|8

133

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【R7F0C809】温湿度传感器DHT11的移植与调试 [复制链接]

首先说明一下,程序没有调出来,这里分享一下失败的过程和可能的原因。
既然是移植程序,就表明之前程序能够正常运行。移植的源程序之前是用在STM32平台上的,能够读出温湿度数据,但当时用的温湿度传感器DHT11和现在用的不是同一批的。
DHT11是串行单总线数字温湿度传感器,与MCU通信时序如下:
读回的数据为:
一次完整的数据传输为 40bit, 高位先出。
数据格式 :8bit 湿度整数数据 +8bit 湿度小数数据+8bi 温度整数数据 +8bit 温度小数数据+8bit 校验和
数据传送正确时校验和数据等于 “ 8bit 湿度整数数据 +8bit 湿度小数数据+8bi 温度整数数据 +8bit 温度小数数据 ” 所得结果的末 8 位。
读回的温湿度小数数据均默认为0(在8051上验证的)。
移植过程很简单,改写IO口操作函数就可以,调试过程就比较纠结。R7F0C809读回的数据第2、4byte为0,但前四byte之和不等于第5byte,不满足校验和关系。开始以为DHT11有问题,于是拿了块stm32的板子又试了一下,读回的数据同样出错;又用8051单片机试了一下(程序为现用DHT11出厂测试程序),能正确读回数据,读回的数据第2、4byte为0,温湿度整数数据无误。
初步推测有2方面原因:
1.2批DHT11读取数据略有差异,需要移植现用DHT11出厂测试程序
2.DHT11程序中需要用到us级延时函数,且时序中对us延时的精度要求较高。但R7F0C809中实现的定时器中断延时函数delay_us()误差较大,可达2倍(详见:https://bbs.eeworld.com.cn/thread-477149-1-1.html),使得程序无法按照正确时序读回数据。这一点由于手上没有示波器,无法进一步验证。
贴一份程序,有兴趣可帮忙看下。

uart_dht11.zip (56.86 KB, 下载次数: 25)

最新回复

老大你乱些吧,低等待怎么写成DQ而不是!DQ???,下面程序反了,你能调通???     while (DQ&&retry=100) return 1;         else retry=0;     while (!DQ&&retry=100) return 1;                     return 0;  详情 回复 发表于 2016-6-22 21:48
点赞 关注

回复
举报

855

帖子

5

TA的资源

一粒金砂(高级)

沙发
 
/******************************************************************************
* Function Name : Delayus
* Description   : This function implements Delayus function.
* Arguments     : uint8_t
* Return Value  : none
******************************************************************************/
static void Delayus(uint8_t time)
{   /*CPU clock is 20MHz,wait us*/
    uint8_t i;
    for(i=0; i }
瑞萨官方demo里的us级延时函数。

点评

谢谢,我再试试  详情 回复 发表于 2015-11-17 11:13
 
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
 

回复

133

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
人民币的幻想 发表于 2015-11-17 11:06
/******************************************************************************
* Function Name : D ...

谢谢,我再试试
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

4
 
为什么不考虑用定时器做个延时呢??

点评

用的就是定时器中断,但是定时误差较大  详情 回复 发表于 2015-11-17 20:53
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

5
 
这种问题一般直接定位到时序
器件出问题的几率相对比较小
 
个人签名

So TM what......?

 

 

回复

133

帖子

0

TA的资源

一粒金砂(中级)

6
 
强仔00001 发表于 2015-11-17 11:17
为什么不考虑用定时器做个延时呢??

用的就是定时器中断,但是定时误差较大

点评

不会吧,我用过,挺准的,可能我定的时间长  详情 回复 发表于 2015-11-19 21:26
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

7
 
yinyue01 发表于 2015-11-17 20:53
用的就是定时器中断,但是定时误差较大

不会吧,我用过,挺准的,可能我定的时间长

点评

定时器中断实现ms延时挺准的,us延时函数延时5s实测10s左右  详情 回复 发表于 2015-11-19 22:19
 
 
 

回复

133

帖子

0

TA的资源

一粒金砂(中级)

8
 
强仔00001 发表于 2015-11-19 21:26
不会吧,我用过,挺准的,可能我定的时间长

定时器中断实现ms延时挺准的,us延时函数延时5s实测10s左右
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

9
 
老大你乱些吧,低等待怎么写成DQ而不是!DQ???,下面程序反了,你能调通???
    while (DQ&&retry<100)//DHT11会拉低40~80us
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=100) return 1;
        else retry=0;
    while (!DQ&&retry<100)//DHT11拉低后会再次拉高40~80us
        {
                retry++;
                delay_us(1);
        };
        if(retry>=100) return 1;            
        return 0;
 
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
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
快速回复 返回顶部 返回列表