DHT11温湿度求助

2019-07-21 08:11发布

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(); }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
sd4555
2019-07-22 14:49
正点原子 发表于 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的回应
}








一周热门 更多>