OpenEdv-开源电子网

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

DHT11温湿度求助

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-3-15
在线时间
1 小时
发表于 2014-3-25 10:15:06 | 显示全部楼层 |阅读模式

DHT11温湿度求助,我用的电压是5V的,用的是PD2脚 ,可是显示初始化错误,不懂错在哪里在,找不着,帮我看一下,谢谢。

DHT.H的文件
#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"  

//IO方向设置

#define DHT11_IO_IN()  {GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=8<<3;}
#define DHT11_IO_OUT() {GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=3<<3;}

////IO操作函数                                                                              

#define    DHT11_DQ_OUT PDout(2) //数据端口     PD2 .C

#define    DHT11_DQ_IN  PDin(2)  //数据端口     PD2

u8 DHT11_Init(void);           //初始化DHT11

u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度

u8 DHT11_Read_Byte(void); //读出一个字节

u8 DHT11_Read_Bit(void);   //读出一个位

u8 DHT11_Check(void);       //检测是否存在DHT11

void DHT11_Rst(void);         //复位DHT11   

#endif

--------------------------------------
DHT.C的文件
#include "dht.h"
#include "delay.h"

//复位DHT11

void DHT11_Rst(void)     

{                

    DHT11_IO_OUT();      //SET OUTPUT

    DHT11_DQ_OUT=0;    //拉低DQ

    delay_ms(20);    //拉低至少18ms

    DHT11_DQ_OUT=1;    //DQ=1

    delay_us(30);            //主机拉高20~40us

}

//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

u8 DHT11_Check(void)         

{  

       u8 retry=0;

       DHT11_IO_IN();//SET INPUT    

    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us

       {

              retry++;

              delay_us(1);

       };   

       if(retry>=100)return 1;

       else retry=0;

    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us

       {

              retry++;

              delay_us(1);

       };

       if(retry>=100)return 1;     

       return 0;

}

//从DHT11读取一个位

//返回值:1/0

u8 DHT11_Read_Bit(void)                 

{

      u8 retry=0;

       while(DHT11_DQ_IN&&retry<100)//等待变为低电平

       {

              retry++;

              delay_us(1);

       }

       retry=0;

       while(!DHT11_DQ_IN&&retry<100)//等待变高电平

       {

              retry++;

              delay_us(1);

       }

       delay_us(40);//等待40us

       if(DHT11_DQ_IN)return 1;

       else return 0;            

}

//从DHT11读取一个字节

//返回值:读到的数据

u8 DHT11_Read_Byte(void)   

{       

    u8 i,dat;

    dat=0;

       for (i=0;i<8;i++)

       {

            dat<<=1;

           dat|=DHT11_Read_Bit();

    }                                           

    return dat;

}

//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

u8 DHT11_Read_Data(u8 *temp,u8 *humi)   

{       

      u8 buf[5];

       u8 i;

       DHT11_Rst();

       if(DHT11_Check()==0)

       {

              for(i=0;i<5;i++)//读取40位数据

              {

                     buf=DHT11_Read_Byte();

              }

              if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

              {

                     *humi=buf[0];

                     *temp=buf[2];

              }

       }else return 1;

       return 0;     

}

//初始化DHT11的IO口 DQ 同时检测DHT11的存在

//返回1:不存在

//返回0:存在      

u8 DHT11_Init(void)

{

       RCC->APB2ENR|=1<<8;    //使能PORTD口时钟
    RCC->APB2ENR|=1<<5;    //使能PORTD口时钟

       GPIOD->CRL&=0XFFFFF0FF;//PORTD.2 推挽输出

       GPIOD->CRL|=0X00000300;

       GPIOD->ODR|=1<<2;      //输出1                               

       DHT11_Rst();

       return DHT11_Check();

}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-25 15:28:03 | 显示全部楼层
#define DHT11_IO_IN()  {GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=8<<3;}
#define DHT11_IO_OUT() {GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=3<<3;}
改为:
#define DHT11_IO_IN()  {GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=8<<8;}
#define DHT11_IO_OUT() {GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=3<<8;}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-3-15
在线时间
1 小时
 楼主| 发表于 2014-3-25 16:35:13 | 显示全部楼层
谢谢原子老师的回答,试了,还是不可以的。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-3-15
在线时间
1 小时
 楼主| 发表于 2014-3-25 16:46:17 | 显示全部楼层
谢谢原子老师可以了,真的那样改就行。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-4-21
在线时间
0 小时
发表于 2014-4-22 07:37:01 | 显示全部楼层
楼主 你的DHT11能用了吗?我的DHT11读数据的时候返回值全是1,很明显不对,也不知道是什么原因
回复 支持 反对

使用道具 举报

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
发表于 2015-9-19 13:28:24 | 显示全部楼层
复位函数中 延时 是us
问不是ms
再不玩命努力,你就老了
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2015-8-19
在线时间
3 小时
发表于 2015-9-19 13:45:04 | 显示全部楼层
回复【5楼】981108685@qq.com:
---------------------------------
时序问题,的速度可能太快了,
回复 支持 反对

使用道具 举报

8

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-2-9
在线时间
10 小时
发表于 2015-9-20 11:11:02 | 显示全部楼层
GPIOD->CRL是32位的寄存器  每一个IO要用到4位
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-5-10
在线时间
20 小时
发表于 2018-11-7 15:06:41 | 显示全部楼层
正点原子 发表于 2014-3-25 15:28
#define&nbsp;DHT11_IO_IN()&nbsp;&nbsp;{GPIOD-&gt;CRL&=0XFFFFF0FF;GPIOD-&gt;CRL|=8&lt;&lt;3;}
#define&nbs ...

原子哥,知道为啥我的也是初始化失败吗?
用的PB1口 啊,配置也都是正确的@正点原子


#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"   


//IO方向设置
#define DHT11_IO_IN()  {GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=8<<4;}
#define DHT11_IO_OUT() {GPIOB->CRL&=0XFFFFFF0F;GPIOB->CRL|=3<<4;}
////IO操作函数                                                                                          
#define        DHT11_DQ_OUT PBout(1) //数据端口        PB9
#define        DHT11_DQ_IN  PBin(1)  //数据端口        PB9


u8 DHT11_Init(void);//初始化DHT11
u8 DHT11_Read_Data(u8 *temp_h,u8 *temp_l,u8 *humi);//读取温湿度
u8 DHT11_Read_Byte(void);//读出一个字节
u8 DHT11_Read_Bit(void);//读出一个位
u8 DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11   
#endif

#include "dht11.h"
#include "delay.h"


//复位DHT11
void DHT11_Rst(void)          
{                 
        DHT11_IO_OUT();         //SET OUTPUT
    DHT11_DQ_OUT=0;         //拉低DQ
    delay_ms(30);            //拉低至少18ms
    DHT11_DQ_OUT=1;         //DQ=1
        delay_us(30);             //主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)           
{   
        u8 retry=0;
        DHT11_IO_IN();//SET INPUT         
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=100)return 1;
        else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
        {
                retry++;
                delay_us(1);
        };
        if(retry>=100)return 1;            
        return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void)                          
{
        u8 retry=0;
        while(DHT11_DQ_IN&&retry<100)//等待变为低电平
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT11_DQ_IN&&retry<100)//等待变高电平
        {
                retry++;
                delay_us(1);
        }
        delay_us(40);//等待40us
        if(DHT11_DQ_IN)return 1;
        else return 0;                  
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)   
{        
    u8 i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                   dat<<=1;
            dat|=DHT11_Read_Bit();
    }                                                    
    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp_h,u8 *temp_l,u8 *humi)   
{        
        u8 buf[5];
        u8 i;
        DHT11_Rst();
        if(DHT11_Check()==0)
        {
                for(i=0;i<5;i++)//读取40位数据
                {
                        buf=DHT11_Read_Byte();
                }
                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
                {
                        *humi=buf[0];
                        *temp_h=buf[2];
                        *temp_l=buf[3];
                }
        }else return 1;
        return 0;            
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在                  PB9!!
//返回1:不存在
//返回0:存在             
u8 DHT11_Init(void)
{         
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PG端口时钟
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 //PG11端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                 //初始化IO口
        GPIO_SetBits(GPIOB,GPIO_Pin_1);                                                 //PG11 输出高
                            
        DHT11_Rst();  //复位DHT11
        return DHT11_Check();//等待DHT11的回应
}








回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 20:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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