求帮忙看一下这个DHT11温湿度传感器的时序代码到底是哪里错了,好无助

2019-07-21 05:40发布

项目里用DHT11温湿度传感器搞了好久好久,始终发现不了问题,好无助新手小白
求大神帮帮忙 真的不觉得自己时序有错 发送数据到串口 ack=1 dat始终=255



#include "dht11.h"
#include "delay.h"

u8 ack,hh;
u8 BUF[5];
long long  value=0;
       
void DHT11_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
       
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_SetBits(GPIOA, GPIO_Pin_7);
        delay_ms(1000);

}


void input_mode()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;   
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
}

void output_mode()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;   
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}


void DHT11_send()
{
        GPIO_ResetBits(GPIOA,GPIO_Pin_7);
        delay_ms(18);
        GPIO_SetBits(GPIOA,GPIO_Pin_7);
        delay_us(30);
        input_mode();
       
}

u8 DHT11_check()                                       //check=1
{
        u8 retry=50;
        while(!DHT11_DQ_IN)
                        {
                                retry--;
                        delay_us(1);
                                }
         if(retry ==0) return 0;//3¬ê±íË3ö
         else retry=60;
       

        while(DHT11_DQ_IN &&retry>0)
           {
                                retry--;
                        delay_us(1);
                }
        if(retry==0) return 0;
  else return 1;
}


//void Time_us(u16 count)
//{
//        count--;
//        delay_us(1);
//}

//u8 DHT11_Read_Bit()
//{
//        u8 countdown=10;
//        while((!DHT11_DQ_IN)&&countdown)
//        {
//                countdown--;
//                delay_us(1);
//        }
//        delay_us(35);
//        if(DHT11_DQ_IN==1) return 1;
//        return 0;
//}

u8 DHT11_Read_byte()
{
        u8 dat=0;
        u8 i;
        for(i=0;i<8;i++)
   {
     while(!DHT11_DQ_IN)
                 delay_us(40);
    if( DHT11_DQ_IN)      //&#161;°1&#161;±
             dat=(dat<<1)+1;
                else
                   dat=(dat<<1)+1;     //&#161;°0&#161;±
          
   }
         return dat;
}


void DHT11_Get(u8 *temperature,u8* humidity )            
{
//    u8 i;
          DHT11_send();
   ack=DHT11_check();
        hh=DHT11_Read_byte();
        if(ack)
                {
                  BUF[0]=DHT11_Read_byte();
                        BUF[1]=DHT11_Read_byte();
                        BUF[2]=DHT11_Read_byte();
                        BUF[3]=DHT11_Read_byte();
                       
          }
          if(BUF[0]+BUF[1]+BUF[2]+BUF[3]==BUF[4])
                        {
                                        *humidity =(BUF[0]<<4)+BUF[1];
                                        *temperature =(BUF[2]<<4)+BUF[3];
                                }
          
}




以下是main函数部分
int main(void)
{               
       
        delay_init();                   
        uart_init(115200);       
        DHT11_Init();
        while(1)
        {
                DHT11_Init();
                DHT11_Get(&humid,&temp);
                delay_ms(10);

                printf(" %d ",ack);
                printf(" %d ",hh);
                printf(" humid:%d ",humid);
                printf(" temp:%d ",temp);
                delay_ms(3000);
                         
}
        }

另附时序图
求大佬帮忙啊啊啊 此贴勿沉 谢谢了 真的搞了很久很难过




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