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条回答
正点原子
1楼-- · 2019-07-21 12:18
#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;}
liwanxi
2楼-- · 2019-07-21 17:12
 精彩回答 2  元偷偷看……
liwanxi
3楼-- · 2019-07-21 21:22
谢谢原子老师可以了,真的那样改就行。
981108685@qq.co
4楼-- · 2019-07-22 01:31
楼主 你的DHT11能用了吗?我的DHT11读数据的时候返回值全是1,很明显不对,也不知道是什么原因
逍遥居士_888
5楼-- · 2019-07-22 04:08
复位函数中 延时 是us
问不是ms
老陆
6楼-- · 2019-07-22 08:32
回复【5楼】981108685@qq.com:
---------------------------------
时序问题,的速度可能太快了,

一周热门 更多>