关于读取DHT11温湿度传感器的问题

2019-07-21 01:11发布

本帖最后由 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是存在的;但就是获取数据那里出了问题。想问下我程序哪里有问题吗

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。