changpian_cp 2025-12-28 21:04 采纳率: 0%
浏览 3

关于#单片机#的问题:我在写一个温度传感器但是发现我把PA11拆开 没有连接还是发现响应成功 不知道为什么哪里有问题

我在写一个温度传感器
但是发现我把PA11拆开 没有连接还是发现响应成功 不知道为什么哪里有问题

img

#include "stm32f10x.h"                  // Device header
#include "sys.h"
#include "Delay.h"
#include "DHT11.h"
#define DT GPIO_Pin_11

#define OUT 0     //输出模式
#define INOUT 1   //输入模式
 
#define    DHT11_0   GPIO_ResetBits(GPIOA,DT)
#define    DHT11_1   GPIO_SetBits(GPIOA,DT)


uint8_t DHT11_Init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Pin=DT;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        DHT11_1;
    
        DHT11_Rst();
        return DHT11_Check();
}


//模式切换
void    DHT11_Mode(uint8_t mode)
{

    GPIO_InitTypeDef GPIO_InitStructure;
    if(mode==OUT)
    {
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出模式
      GPIO_InitStructure.GPIO_Pin=DT;
      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    }
    else if(mode==INOUT)
    {
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入模式
      GPIO_InitStructure.GPIO_Pin=DT;
      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    
    }
      GPIO_Init(GPIOA,&GPIO_InitStructure);

}






 void DHT11_Rst(void)       
{                 
    DHT11_Mode(OUT);     //SET OUTPUT
    DHT11_0;     //拉低
    Delay_ms(20);        //拉低至少18ms
    DHT11_1;     //拉高
    Delay_us(30);         //主机拉高20~40us
}
  
//响应
uint8_t DHT11_Check(void)
{
    u8 retty=0;
    DHT11_Mode(INOUT);
    while(GPIO_ReadInputDataBit(GPIOA,DT)==0 && retty < 100)
    {
        retty++;
        Delay_us(1);
    };
    if(retty>100)
        {
            return 1;
        }
        else 
        {
            retty=0;
        }
        
    while(GPIO_ReadInputDataBit(GPIOA,DT)==1 && retty < 100)
    {
        retty++;
        Delay_us(1);
    };
        if(retty>100)
        {
            return 1;
        }
        else 
        {
            return 0;
        }
        

}

//读取一个字节
u8 DHT11_Read_But(void)
{
    u8 retty=0;
    while(GPIO_ReadInputDataBit(GPIOA,DT)==0 && retty < 100)
    {
        retty++;
        Delay_us(1);
    };
    retty=0;
        while(GPIO_ReadInputDataBit(GPIOA,DT)==1 && retty < 100)
    {
        retty++;
        Delay_us(1);
    };
    Delay_us(40);//等待40us
    if(PAin(DT)==1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
    
}



//读取一位 8个字节
u8 DHT11_Read_Byte(void)
{
    u8 i;
    u8 dat=0;
    for(i=0;i<8;i++)
    {
        dat<<=1;
        dat |= DHT11_Read_But();
    }
        return dat;

}

//读取湿度 温度值
u8 DHT11_Read_Data(u8 *humi,u8 *temp) 
{
    u8 Buf[5];
    u8 i;
    DHT11_Rst();
    if(DHT11_Check()==0)
    {
        for(i=0;i<5;i++)
        {
            Buf[i]=DHT11_Read_Byte();  
        }
        if(Buf[4]==(Buf[0]+Buf[1]+Buf[2]+Buf[3]))
        {
            *humi =Buf[0];
            *temp =Buf[2];
             
        }
  }
    else 
    {
        return 1;
    }
        return 0;
    
}  







#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"                  // Device header
//初始化
uint8_t DHT11_Init(void);
//模式切换
void DHT11_Mode(uint8_t mode);
//起始
void DHT11_Rst(void);   
//响应
uint8_t DHT11_Check(void);
//读取一个字节
u8 DHT11_Read_But(void);
//读取一位 8个字节
u8 DHT11_Read_Byte(void);
//读取湿度 温度值
u8 DHT11_Read_Data(u8 *humi,u8 *temp); 


#endif


主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "src.h"
#include "DHT11.h"
u8 hum ,tem;

int main(void)
{
    OLED_Init();
    src_Init();
    DHT11_Init();
  if(DHT11_Init()==1)
    {
        OLED_Printf(0,0,OLED_8X16,"响应失败...");
        Delay_ms(500);
    }
    else
    {
     OLED_Printf(0,0,OLED_8X16,"响应成功...");
     Delay_ms(500);

    }
  
    
    while (1)
    {
        DHT11_Read_Data(&hum,&tem);    
        
      OLED_Printf(0,16,OLED_8X16,"温度:%d",hum);
      OLED_Printf(0,32,OLED_8X16,"湿度:%d",tem);
        
    OLED_Update();    
        
    }
    
}



  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-12-28 21:04
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题分析

    根据你的描述,问题出在单片机的PA11引脚上。虽然你没有连接PA11引脚,但是程序仍然能够响应成功。这可能是因为单片机的引脚默认状态或是某些内部配置导致的。

    可能原因

    1. 引脚默认状态: 单片机的引脚可能有默认的高阻态或是低阻态,这可能导致程序能够正常工作。
    2. 内部配置: 单片机可能有内部配置使得某些引脚能够自动连接到其他引脚。
    3. 电压源: 如果你使用的是电压源来连接引脚,可能导致引脚的状态被改变。

    解决方案

    1. 检查单片机的数据手册: 查看单片机的数据手册,了解其引脚的默认状态和内部配置。
    2. 检查电路连接: 确保电路连接正确,避免短路或是其他问题。
    3. 使用多米诺电路: 使用多米诺电路来检测引脚的状态,确保引脚的状态正确。
    4. 重新配置单片机: 重新配置单片机的内部配置,确保引脚的状态正确。

    核心代码

    // 检查PA11引脚的状态
    if (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_11) == 0) {
        // PA11引脚为低电平
    } else {
        // PA11引脚为高电平
    }
    

    注意

    上述代码仅供参考,具体的解决方案需要根据单片机的数据手册和实际情况来确定。

    评论

报告相同问题?

问题事件

  • 修改了问题 12月28日
  • 修改了问题 12月28日
  • 创建了问题 12月28日