本帖最后由 shengbeer 于 2019-5-20 17:01 编辑
各位前辈大家好,我目前正在做一个读取DHT11的程序;但是读出来的引脚的数据始终是为1(高电平),启动时序这边我已经通过示波器测过了没有问题;而且DHT11也有响应,但是就是获取不到发送的数据。请问又碰到过这个情况的嘛。麻烦解下惑
下面放上我的main程序和DHT11程序
main.c
int main(void)
{
u8 kk,num,i,m;
u16 retry=0;//定义临时变量
num = 0;
i = 0;
kk = 0;
m = 1;
USART1_Int(9600);
SysTick_Delay_Ms(1000); //等待上电延时一秒
//使用DHT11初始化函数初始化
//检测DHT11是否响应
//第一步 将DHT11的PA5引脚设置为输出状态
DHT11_PortOUT();
DHT11_LOW;//将PA5引脚输出至少18ms的低电平
SysTick_Delay_Ms(20); //拉低至少18ms
DHT11_HIGH; //拉高主机引脚
SysTick_Delay_Us(20); //等待30us
DHT11_PortIN(); //设置PA5为输入状态,准备接收DHT11响应信号
m = DHT11_Check();
printf(" test: %d
",m);
for(i = 0; i<40;i++)
{
kk = DHT11_Read_Bit();
printf(" test: %d
",kk);
}
}
下面是DHT11的程序
void DHT11_PortIN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//Configure pin as input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void DHT11_PortOUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//Configure pin as input
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
}
//void Test(void)
//{
// GPIO_InitTypeDef GPIO_InitStructure;
// //Configure pin as input
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
// GPIO_Init(GPIOA,&GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_4);
//}
//检测DHT11是否存在
void DHT11_Rst(void)
{
DHT11_PortOUT(); //SET OUTPUT
DHT11_LOW; //DQ=0
SysTick_Delay_Ms(20); //拉低至少18ms
DHT11_HIGH; //DQ=1
SysTick_Delay_Us(20); //主机拉高20~40us
}
//读一位数据
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)&&retry<100) //等待变为低电平
{
retry++;
SysTick_Delay_Us(1);
}
retry=0;
while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)&&retry<100) //等待变为高电平
{
retry++;
SysTick_Delay_Us(1);
}
SysTick_Delay_Us(40);//等待40s
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5))
return 1;
else
return 0;
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
u16 retry=0;//定义临时变量
DHT11_PortIN();//SET INPUT
while ((!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5))&&retry<100)//DHT11会拉低40~80us
{
retry++;
SysTick_Delay_Us(1);
};
if(retry>=100)return 1;
else retry=0;
while (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)&&retry<100)//DHT11拉低后会再次拉高40~80us
{
retry++;
SysTick_Delay_Us(1);
};
if(retry>=100)return 1;
return 0;
}
另外我这边没有给DATA引脚加上一个上拉电阻,想请问下这样会不会有影响其中u8 DHT11_Check(void) 返回的是0 检测到DHT11是存在的;但就是获取数据那里出了问题。想问下我程序哪里有问题吗
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>