run out of here 2022-09-04 14:47 采纳率: 100%
浏览 96
已结题

STM32F103C8T6驱动DHT22温湿度模块

问题遇到的现象和发生背景

使用STM32F103C8T6驱动DHT22温湿度传感器
使用PA4作为数据端时,结果符合
使用PA9作为数据端时,结果与预期不符

问题相关代码,请勿粘贴截图

dh22.h

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

//IO·½ÏòÉèÖÃ
#define DHT22_IO_IN()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
#define DHT22_IO_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;}
////IO²Ù×÷º¯Êý                                               
#define    DHT22_DQ_OUT PBout(9) 
#define    DHT22_DQ_IN  PBin(9) 


u8 DHT22_Init(void);
u8 DHT22_Read_Data(u16 *temp,u16 *humi);
u8 DHT22_Read_Byte(void);
u8 DHT22_Read_Bit(void);
u8 DHT22_Check(void);
void DHT22_Rst(void);    
    
#endif




dht22.c

#include "dht22.h"
#include "delay.h"



#if SYSTEM_SUPPORT_OS
#include "includes.h"                    
#endif

//¸´Î»DHT22
//Ö÷»úÐźÅ
void DHT22_Rst(void)       
{
    DHT22_IO_OUT();//SET OUTPUT
    DHT22_DQ_OUT=0;
    delay_ms(1);
    DHT22_DQ_OUT=1;
    delay_us(30);
}

u8 DHT22_Check(void)        
{   
    u8 retry=0;
    DHT22_IO_IN();
    while (DHT22_DQ_IN&&retry<200)
    {
        retry++;
        delay_us(1);
    }     
    if(retry>=200)return 1;
    else retry=0;
    while (!DHT22_DQ_IN&&retry<200)
    {
        retry++;
        delay_us(1);
    }
    if(retry>=200)return 1;        
    else return 0;
}


u8 DHT22_Read_Bit(void)              
{
     u8 retry=0;
    while(DHT22_DQ_IN&&retry<200)
    {
        retry++;
        delay_us(1);
    }
    retry=0;
    while(!DHT22_DQ_IN&&retry<200)
    {
        retry++;
        delay_us(1);
    }
    delay_us(40);
    if(DHT22_DQ_IN)return 1;
    return 0;           
}

u8 DHT22_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
    for (i=0;i<8;i++) 
    {
           dat<<=1; 
        dat|=DHT22_Read_Bit();
    }                            
    return dat;
}

u8 DHT22_Read_Data(u16 *temp,u16 *humi)    
{        
     u8 buf[5];
    u8 i,sum;
    DHT22_Rst();
    if(DHT22_Check()==0)
    {
        for(i=0;i<5;i++)
        {
            buf[i]=DHT22_Read_Byte();
        }
//        *humi=buf[0]*256+buf[1];
//        *temp=buf[2]*256+buf[3];
        sum =((buf[0]+buf[1]+buf[2]+buf[3])&0xFF);
        if(sum==buf[4])//УÑé
        {
            
            *humi=buf[0]*256+buf[1];
            *temp=buf[2]*256+buf[3];
        }
    }else return 1;
    return 0;        
}

u8 DHT22_Init(void)
{     
     GPIO_InitTypeDef  GPIO_InitStructure;
     
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);    
    
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOB, &GPIO_InitStructure);            
     GPIO_SetBits(GPIOB,GPIO_Pin_9);                         
                
    DHT22_Rst(); 
    return DHT22_Check();
} 





运行结果及报错内容

正常是20多度,湿度是40多,但是这明显数据没有正确

img

我的解答思路和尝试过的方法

尝试过使用PA4端,符合预期效果,但想知道PB9为啥不能用

我想要达到的结果

使用STM32F103C8T6的PB9端驱动DHT22温湿度传感器

  • 写回答

1条回答 默认 最新

  • Flyshine~ 2022-09-04 17:09
    关注

    配置IO方向那里改一下试试:
    #define DHT22_IO_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=4<<4;}

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月12日
  • 已采纳回答 9月4日
  • 创建了问题 9月4日

悬赏问题

  • ¥15 学习Python如何找兼职
  • ¥15 python结合Matlab仿真忆阻器
  • ¥35 有人会注册whatsaop协议号吗?
  • ¥15 lead dbs 无法导入影像数据
  • ¥15 多目标MPA算法优化编程实现
  • ¥15 反激PWM控制芯片调研
  • ¥15 Python for loop减少运行时间
  • ¥15 fluent模拟物质浓度udf
  • ¥15 Collection contains no element matching the predicate
  • ¥20 冻品电商平台的搜索是怎么实现的