OpenEdv-开源电子网

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

DHT11代码我试了好多次都不知道什么原因,无法显示温度湿度,我用的是最小系统板

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-8-6
在线时间
4 小时
发表于 2021-8-13 14:00:37 | 显示全部楼层 |阅读模式
1金钱
#include "dht11.h"
#include "delay.h"
#include "usart.h"
uint8_t dat[5]={0,0,0,0,0};
uint16_t  sum;
void DHT11_Port_Output(void)
{
            GPIO_InitTypeDef  GPIO_InitStructure;
            RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOB时钟
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//设置PB6为输出
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
            GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//设置为推挽输出
                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
                        GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_UP;//上拉
                        GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
}

void DHT11_Port_Input(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOB时钟
                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//设置PB6为输入
                        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN;//普通输入
                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
                        GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
}



uint8_t DHT11_Read_Byte(void)
{
        uint8_t temp;
        uint8_t ReadDat=0;
        uint8_t i;
        uint16_t retry=0;//防止PB5没有收到高电平卡死在程序
        for(i=0;i<8;i++)
        {
                                while(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)==0 && retry<100 )
                        {
                                delay_us(1);
                                retry++;
                        }
                        if(retry==100)
                        {
                                printf("retry:%d\r\n",retry);
                                return 0;
                        }
                        retry=0;
                        delay_us(30);
                        if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)==0)
                        {temp=0;}
                        if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)==1)
                        {temp=1;}
                        while(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)==1 && retry<100)
                        {
                                delay_us(1);
                                retry++;
                        }
                        retry=0;
                        printf("temp:%d\r\n",temp);
                        ReadDat<<=1;
                        ReadDat|=temp;                       
                        printf("ReadDat:%d\r\n",ReadDat);
        }
        return ReadDat;
}



uint8_t DHT_Read(u8 *temp,u8 *html)
{
        uint8_t retry=0;
        uint8_t i;
  DHT11_Port_Output();
        GPIO_ResetBits(GPIOF,GPIO_Pin_6);
        delay_ms(18);
        GPIO_SetBits(GPIOF,GPIO_Pin_6);
        delay_us(40);
        DHT11_Port_Input();
        if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)==0)
                {       
                        while(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)==0 && retry<100 )
                        {
                                delay_us(1);
                                retry++;
                        }
                        retry=0;
                        while(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)==1 && retry<100 )
                        {
                                delay_us(1);
                                retry++;
                        }
                        retry=0;
                        for(i=0;i<5;i++)
                        {
                                dat[i]= DHT11_Read_Byte();
                        }
                        delay_us(50);       
                }
                sum=dat[0]+dat[1]+dat[2]+dat[3];
                if(dat[4]==(u8)(sum) )
     {
                         *temp=dat[0];
                         *html=dat[2];
                         printf("html:%d\r\n",&html);
                    return 1;
                 }
                else
                        return 0;               
}
  这是我的DHT11的代码,问题是我用串口测试 ,时序我觉得没有问题,首先DHT11响应了我一个低电平,但是后面发的数据都是高电平,就很奇怪。希望各位大神给我看看代码。

QQ截图20210813135910.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4729
金钱
4729
注册时间
2015-1-10
在线时间
591 小时
发表于 2021-8-13 16:07:03 | 显示全部楼层
还能有啥原因呢,时序不对咯
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-8-6
在线时间
4 小时
 楼主| 发表于 2021-8-13 16:37:42 | 显示全部楼层
阿侑kevin 发表于 2021-8-13 16:07
还能有啥原因呢,时序不对咯

能不能帮忙看一下时序出现了什么问题,都试了几天了,实在找不出来
回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2021-10-9
在线时间
13 小时
发表于 2021-11-19 20:43:01 | 显示全部楼层
我也遇到同样问题,楼主解决了没?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 14:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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