OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13517|回复: 6

DHT11使用问题

[复制链接]

13

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2011-8-20
在线时间
3 小时
发表于 2011-8-20 17:06:57 | 显示全部楼层 |阅读模式
请教各位同志:
    我用STM32VBT6的PE9连接DHT11的2脚.程序,我是改的原子哥的红外遥控的程序.
    温湿度传感器的使用的是单总线结构:先发一个20ms的低电平,再上拉20~40us左右。然后DHT11会拉低80us,再上拉80us。然后输出40bit的数据位。
    我的问题是:程序进入中断了,可是只能检测到一个pulse.
    我已经弄了两天了。我用示波器看了,DHT11的反馈数据都是正确的.可就是采不到32上来.
    把程序贴在下面.请大家帮我看看是哪儿出问题了。应该怎么改啊。谢谢.谢谢.劳驾各位啦!



********test.c********
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "dht11.h"  
//Mini STM32开发板范例代码1
//红外遥控实验
//正点原子@ALIENTEK
//2010.5.27   
int main(void)
{  
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化
uart_init(72,9600);
LED_Init();   //初始化与LED连接的硬件接口
Dht11_Init(); 
PEout(9) = 1; //因为PE9接了上拉电阻,所以一上电PE9就是高电平.这句话其实可以不要.

delay_ms(10);  //去抖动

PEout(9) = 0; //DHT11的输入端拉低20ms
delay_ms(20); 
Dht11_Exti_Init();
PEout(9) = 1;
   delay_us(10);

while(1)
{
// if(1)
// {       //留做以后采集到数据,输出数据用 
// }
}  
}

********dht11.c函数如下:********
#include "dht11.h"
#include "delay.h"
#include "led.h"
#include "usart.h"

u32 Remote_32data=0;   //湿度 16位 和温度16位数据 
u8  Remote_8data=0;    //后8位检验码 
u8  Remote_Rdy=0; 

void Dht11_Init(void)
{
RCC->APB2ENR|=1<<6;       //PE时钟使能
GPIOE->CRH&=0XFFFFFF0F;
GPIOE->CRH|=0X00000030; //PE9输出  
GPIOE->ODR|=1<<9; //PE.9上拉
}

void Dht11_Exti_Init(void)
{  
RCC->APB2ENR|=1<<6;       //PE时钟使能
GPIOE->CRH&=0XFFFFFF0F;
GPIOE->CRH|=0X00000080; //PE9输入  
GPIOE->ODR|=1<<9; //PE.9上拉 
Ex_NVIC_Config(GPIO_E,9,FTIR);//将line1映射到PE.9,下降沿触发.
MY_NVIC_Init(2,1,EXTI9_5_IRQChannel,2);
}   

u8 Pulse_Width_Check(void)
{
    u8 t=0;  
    while(RDATA)
    {  
t++;delay_us(1);  
        if(t==100)return t; //超时溢出
    }
    return t;
}


void EXTI9_5_IRQHandler(void)
{       
u8 res=0;
        u8 OK=0; 
        u8 RODATA=0;
u8 cnt=0;
// LED1=0;这是我这几天用来观测程序进行到哪儿 用的 
    
while(1)
    {        
        if(RDATA)//有高脉冲出现
        {
            res=Pulse_Width_Check();//获得此次高脉冲宽度 
     
            if(res==100)break;  //非有用信号
            if(res>75&&res<85)
    {
OK=1; //获得开始信号
Remote_Rdy=1;
break;
    }
            if(res>=68&&res<72)RODATA=1;//70usDHT11输出的1
            if(res>=25&&res<29)RODATA=0;//26~28usDHT11输出的0
    if( OK == 1 && cnt < 32)   //采集到湿度和温度的32位数据,以后再做后续处理 
      {             
     Remote_32data<<=1;
            Remote_32data+=RODATA; 
     cnt++;           
     }
     if(cnt>=32&&cnt<40)
     {
Remote_8data<<=1;
Remote_8data+=RODATA;
cnt++;
      }
     if(cnt==40)break;//采集完数据,跳出    
        }  
    }     
EXTI->R=1<<9;      //清除中断标志位       



这是我抓的图。每一个数据位我都数了,是没问题的。我搞不明白的,就是为什么用PE9的中断采不进去40位数据.






  
    
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2011-7-15
在线时间
0 小时
发表于 2012-2-24 13:08:22 | 显示全部楼层
我也碰到类似问题!你解决没有啊现在?望指点下
回复 支持 反对

使用道具 举报

11

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2012-3-13
在线时间
0 小时
发表于 2012-3-27 10:07:09 | 显示全部楼层
成功实现了吗,我现在也在做这个,能给些指导吗?急急!!
自己选择的路,跪着也要走完!
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2012-5-14
在线时间
3 小时
发表于 2012-5-14 19:30:58 | 显示全部楼层
回复【楼主位】tangyuchen163:
---------------------------------
哥们!好了吗?我现在和你是一个现象,怎么解决的?能否发一下你的源文件谢谢!
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2012-5-15 06:12:37 | 显示全部楼层
时间容限太小.
DHT11里面只靠PIC内部的RC振荡器提供时钟,精度不可靠.
你的delay检测,精度不可靠.
捕获脉冲到计时器之间的同步不可靠.
中断内跑while(1),没有完善的错误推出机制不可靠.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-7-19
在线时间
6 小时
发表于 2013-7-19 22:17:01 | 显示全部楼层
DHT11的“校验位”是怎样算得的?如:38 00 22 00 54
回复 支持 反对

使用道具 举报

3

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-12-6
在线时间
24 小时
发表于 2014-12-15 17:02:21 | 显示全部楼层
回复【6楼】7631001:
---------------------------------

例:接收到的40位数据为: 

湿度高8位      湿度低8位      温度高8位      温度低8位      校验位
0011 0101      0000 0000      0001 1000      0000 0000      0100 1101 

计算:

第一步: 0011 0101+0000 0000 = 0011 0101

第二步: 0001 1000+0000 0000 = 0001 1000

第三步: (计算时,逢二进一。)   
                
                 0011 0101
               +0001 1000
              ___________

                 0100 1101
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 21:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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