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

#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();
}
}