【R7F0C809】温湿度传感器DHT11的移植与调试

yinyue01   2015-11-17 10:27 楼主
首先说明一下,程序没有调出来,这里分享一下失败的过程和可能的原因。
既然是移植程序,就表明之前程序能够正常运行。移植的源程序之前是用在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, 2015-11-17 10:27 上传)

回复评论 (8)

/******************************************************************************
* 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:06
引用: 人民币的幻想 发表于 2015-11-17 11:06
/******************************************************************************
* Function Name : D ...

谢谢,我再试试
点赞  2015-11-17 11:13
为什么不考虑用定时器做个延时呢??
点赞  2015-11-17 11:17
这种问题一般直接定位到时序
器件出问题的几率相对比较小
So TM what......?
点赞  2015-11-17 13:12
引用: 强仔00001 发表于 2015-11-17 11:17
为什么不考虑用定时器做个延时呢??

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

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

定时器中断实现ms延时挺准的,us延时函数延时5s实测10s左右
点赞  2015-11-19 22:19
老大你乱些吧,低等待怎么写成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/
点赞  2016-6-22 21:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复