关于stm32mini板读取DHT11数据问题

2019-07-21 00:54发布

昨天看了原子哥的视频,读出了数据,但是不知道为什么温度和数据的值相同并且一直是12.看了代码没有发现问题,DHT11是好的测试过。
void DHT11_Rst(void)         //
{                 
                DHT11_IO_OUT(); //SET PA0 OUTPUT
    DHT11_DQ_OUT=0; //à-μíDQ
    delay_ms(20);    //à-μí18us
    DHT11_DQ_OUT=1; //DQ=1
                delay_us(30);     //40ms
        //        DHT11_IO_IN();
}
//μè′yDDHT11μÄ»Øó|
//·μ»Ø1:Î′¼ì2aμ½DDHT11μÄ′æÔú
//·μ»Ø0:′æÔú
u8 DHT11_Check(void)           
{   
       
        u8 retry=0;
        DHT11_IO_IN();//SET PA0 INPUT         
    while (DHT11_DQ_IN&&retry<100)
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=100)return 1;
        else retry=0;
    while (!DHT11_DQ_IN&&retry<100)
        {
                retry++;
                delay_us(1);
        };
        if(retry>=100)return 1;            
        return 0;
}
//′óDS18B20&#182;áè&#161;ò&#187;&#184;&#246;&#206;&#187;
//·μ&#187;&#216;&#214;μ£o1/0
u8 DHT11_Read_Bit(void)                          
{
        u8 retry=0;
        while(DHT11_DQ_IN&&retry<100)//???????
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT11_DQ_IN&&retry<100)//??????
        {
                retry++;
                delay_us(1);
        }
        delay_us(40);//??40us
        if(DHT11_DQ_IN)return 1;
        else return 0;                  
}


u8 DHT11_Read_Byte(void)    // read one byte
{        
    u8 i,dat;
    dat=0;
        for (i=1;i<8;i++)
        {
        dat<<=1;
        dat|=DHT11_Read_Bit();
    }                                                    
    return dat;
}
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
        u8 buf[5];
        u8 i;
        DHT11_Rst();
        if(DHT11_Check()==0)
        {
                for(i=0;i<5;i++)//??40???
                {
                        buf[i]=DHT11_Read_Byte();
                }
                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
                {
                        *humi=buf[0];
                        *temp=buf[2];
                }
        }else return 1;
        return 0;            
}


            
u8 DHT11_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //ê1&#196;üPORTA&#191;úê±&#214;ó
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                //PORTA0 í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_SetBits(GPIOA,GPIO_Pin_0);    //ê&#228;3&#246;1

        DHT11_Rst();

        return DHT11_Check();
       
       
}



int main(void)
{
        u8 t=0;                            
        u8 temperature;
        u8 humidity;
       
        SystemInit();         
        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
        uart_init(9600);                 //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a9600
        LED_Init();                                  //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú
        LCD_Init();
        POINT_COLOR=RED;//éè&#214;&#195;×&#214;ì&#229;&#206;aoìé&#171;
        LCD_ShowString(60,50,200,16,16,"Every time");       
        LCD_ShowString(60,70,200,16,16,"DHT11 TEST");       
        LCD_ShowString(60,90,200,16,16,"dzswise");
        LCD_ShowString(60,110,200,16,16,"2019/5/25");                  
        while(DHT11_Init())        //DHT11 3&#245;ê&#188;&#187;ˉ       
        {
                LCD_ShowString(60,130,200,16,16,"DHT11 Error");
                delay_ms(200);
                LCD_Fill(60,130,239,130+16,WHITE);
                delay_ms(200);
        }                                                                  
        LCD_ShowString(60,130,200,16,16,"DHT11 OK");
        POINT_COLOR=GREEN;//éè&#214;&#195;×&#214;ì&#229;&#206;a&#194;ìé&#171;
        LCD_ShowString(60,150,200,16,16,"Temp:  C");       
        LCD_ShowString(60,170,200,16,16,"Humi:  %");       
        while(1)
        {                      
                if(t%10==0)//&#195;&#191;100ms&#182;áè&#161;ò&#187;′&#206;
                {                                                                          
                        DHT11_Read_Data(&temperature,&humidity);       
       
                        LCD_ShowNum(60+40,150,temperature,2,16);        //&#207;&#212;ê&#190;&#206;&#194;&#182;è   
                   LCD_ShowNum(60+40,170,humidity,2,16);        //&#207;&#212;ê&#190;êa&#182;è          
                }                                  
                 delay_ms(10);
                t++;
                if(t==20)
                {
                        t=0;
                        LED0=!LED0;
                }
        }
}






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