OpenEdv-开源电子网

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

STM32F103C8T6 HAL DHT11读取数据和串口打印数据一直不变

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-11-23
在线时间
5 小时
发表于 2020-4-15 15:41:14 | 显示全部楼层 |阅读模式
1金钱

dht11.h文件内容
#ifndef __DHT11_H
#define __DHT11_H

#include "main.h"
#include "sys.h"

typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;

//IO方向设置
#define dht11_Pin_input()  {dht11_GPIO_Port->CRH &= 0xFFFFF0FF;        dht11_GPIO_Port->CRH |= 8 << 8;}        // PB3 IN  MODE
#define dht11_Pin_output() {dht11_GPIO_Port->CRH &= 0xFFFFF0FF;        dht11_GPIO_Port->CRH |= 3 << 8;}        // PB3 OUT MODE

////IO操作函数
#define        dht11_Pin_in PBout(3) //数据端口        PB3
#define        dht11_Pin_out  PBin(3)  //数据端口        PB3

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
u8 DHT11_Read_Data_Float(float *temp,float *humi);
void delay_us(uint32_t us);

#endif




dht11.c文件
#include "dht11.h"
#include "stdio.h"
#include "gizwits_product.h"

void delay_us(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
        {
                ;
        }
}
//复位DHT11
void DHT11_Rst(void)
{
    dht11_Pin_output();        //SET OUTPUT
    HAL_GPIO_WritePin(dht11_GPIO_Port, dht11_Pin, GPIO_PIN_RESET);         //拉低DQ
    HAL_Delay(20);            //拉低至少18ms,(DHT22 500us)
    HAL_GPIO_WritePin(dht11_GPIO_Port, dht11_Pin, GPIO_PIN_SET);         //DQ=1
    delay_us(30);             //主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
    u8 retry=0;
    dht11_Pin_input();//SET INPUT
    while (HAL_GPIO_ReadPin(dht11_GPIO_Port, dht11_Pin)&&retry<100)//DHT11会拉低40~80us
    {
        retry++;
        delay_us(1);
    };
    if(retry>=100)return 1;
    else retry=0;
    while (!HAL_GPIO_ReadPin(dht11_GPIO_Port, dht11_Pin)&&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(HAL_GPIO_ReadPin(dht11_GPIO_Port, dht11_Pin)&&retry<60)//等待变为低电平
    {
        retry++;
        delay_us(1);
    }
    retry=0;
    while(!HAL_GPIO_ReadPin(dht11_GPIO_Port, dht11_Pin)&&retry<100)//等待变高电平
    {
        retry++;
        delay_us(1);
    }
    delay_us(40);//等待40us
    if(HAL_GPIO_ReadPin(dht11_GPIO_Port, dht11_Pin))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;
}

u8 DHT11_Read_Data_Float(float *temp,float *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] << 8) + buf[1]) / 10.0;
                        *temp=((buf[2] << 8) + buf[3]) / 10.0;
        }
    } else return 1;
    return 0;
}

//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
u8 DHT11_Init(void)
{
          HAL_Delay(1000);
    u8 ret = 1;
    DHT11_Rst();  //复位DHT11
    ret = DHT11_Check();
    printf("dht11 init %s. \r\n", ret == 0 ? "ok" : "failed");
    return ret;
}





main函数 main().JPG

最佳答案

查看完整内容[请看2#楼]

现在本人已解决,是硬件问题,不是软件
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-11-23
在线时间
5 小时
 楼主| 发表于 2020-4-15 15:41:15 | 显示全部楼层
现在本人已解决,是硬件问题,不是软件
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2020-4-16 01:15:04 | 显示全部楼层
有我们开发板的话,可以用我们开发板试试看
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-11-23
在线时间
5 小时
 楼主| 发表于 2020-4-16 07:59:40 | 显示全部楼层
我用的是杜洋的开发板,教程是两家都看的
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-6-8
在线时间
3 小时
发表于 2020-4-19 20:42:45 | 显示全部楼层
请问是硬件什么问题
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2020-11-11
在线时间
0 小时
发表于 2020-11-11 17:46:32 | 显示全部楼层
我的也是有一个错误过不去
回复

使用道具 举报

75

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2021-2-5
在线时间
135 小时
发表于 2021-3-10 23:07:17 | 显示全部楼层
两个问题:
1,这个代码的IO反向设置确定没问题吗?CRH不是管理的IO口从8到15吗所以如果你的IO口是3,不是应该使用CRL吗?
2,我现在遇到的是,DHT11模块可以在正点原子的精英板上运行并且读取数据,但是用在我自己画的板子也是C8T6的芯片,初始化成功,检测成功,读取数据就会失败,debug的时候发现会在读取数据时的检测DHT11是否存在时失败,明明都已经可以检测出DHT11了,读取数据时再检测一次,为什么会检测不到?求教,谢谢
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2020-12-4
在线时间
9 小时
发表于 2021-6-14 11:52:09 | 显示全部楼层
15284083060 发表于 2021-3-10 23:07
两个问题:
1,这个代码的IO反向设置确定没问题吗?CRH不是管理的IO口从8到15吗所以如果你的IO口是3,不是 ...

兄弟,我也遇到你这样的问题,我检查了一个星期,最终怀疑硬件问题,换了杜邦线,换了dht11和c8t6,最后发现是c8t6出现了问题
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-6-18
在线时间
8 小时
发表于 2022-2-14 21:55:09 | 显示全部楼层
hal 库用寄存器操作io口也行嘛
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-3-10
在线时间
3 小时
发表于 2022-3-10 11:44:19 来自手机 | 显示全部楼层
ArcticLEO 发表于 2020-4-16 07:59
我用的是杜洋的开发板,教程是两家都看的

我也是杜洋的开发版,我是直接检测不到传感器,具体原因是什么呢
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-3-10
在线时间
3 小时
发表于 2022-3-10 11:45:33 来自手机 | 显示全部楼层
894风的归宿 发表于 2021-6-14 11:52
兄弟,我也遇到你这样的问题,我检查了一个星期,最终怀疑硬件问题,换了杜邦线,换了dht11和c8t6,最后 ...

为什么别人的可以呢?我就不行,同样的程序,我同学正常,我不行,都是c8t6
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-4-28
在线时间
9 小时
发表于 2023-10-13 13:35:35 | 显示全部楼层
STM32F103C8T6
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 15:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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