標(biāo)題: 關(guān)于ucosii下dht11和ds18b20一直獲取不了數(shù)據(jù)的問題 [打印本頁]

作者: wf269929670    時(shí)間: 2023-4-19 11:04
標(biāo)題: 關(guān)于ucosii下dht11和ds18b20一直獲取不了數(shù)據(jù)的問題
請各位大佬幫忙看看哪個環(huán)節(jié)出現(xiàn)問題
這是現(xiàn)象,光照強(qiáng)度用的GY-30,iic通信可以正常獲取數(shù)據(jù)

dht11.h
#define DHT11_GPIO_PORT GPIOA
#define DHT11_GPIO_PIN  GPIO_PIN_8
#define DHT11_RCC()     __HAL_RCC_GPIOA_CLK_ENABLE();
//IO方向設(shè)置

#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}
////IO操作函數(shù)                                               
#define    DHT11_DQ_OUT PAout(8) //數(shù)據(jù)端口    PA0
#define    DHT11_DQ_IN  PAin(8)  //數(shù)據(jù)端口    PA0
//void DHT11_IO_IN();
//void DHT11_IO_OUT();
u8 DHT11_Init(void);            //初始化DS18B20
u8 DHT11_Read_data(u8 *temp,u8 *humi) ;


u8 DHT11_Read_Byte(void);        //讀出一個字節(jié)
u8 DHT11_Read_Bit(void);        //讀出一個位
u8 DHT11_Check(void);            //檢測是否存在DS18B20
void DHT11_Rst(void);            //復(fù)位DS18B20   


dht11.c
#include "DHT11.h"
#include "delay.h"   
//void DHT11_IO_IN()
//{
//

//GPIO_InitTypeDef GPIO_Initure;
//    DHT11_RCC();           //開啟GPIOB時(shí)鐘
//   
//    GPIO_Initure.Pin=DHT11_GPIO_PIN;             //PB8
//    GPIO_Initure.Mode=GPIO_MODE_INPUT;  //推挽輸出
//    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
//    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
//    HAL_GPIO_Init(DHT11_GPIO_PORT,&GPIO_Initure);
//     

//    }

//    void DHT11_IO_OUT()
//{
//

//GPIO_InitTypeDef GPIO_Initure;
//    DHT11_RCC();           //開啟GPIOB時(shí)鐘
//   
//    GPIO_Initure.Pin=DHT11_GPIO_PIN;             //PB8
//    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽輸出
//    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
//    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
//    HAL_GPIO_Init(DHT11_GPIO_PORT,&GPIO_Initure);
//     

//    }
//復(fù)位DS18B20
void DHT11_Rst(void)      
{                 
    DHT11_IO_OUT(); //SET PA0 OUTPUT
    //HAL_GPIO_WritePin (DHT11_GPIO_PORT,DHT11_GPIO_PIN,GPIO_PIN_RESET);
  DHT11_DQ_OUT=0;
    delay_ms(20);    //拉低750us
     //HAL_GPIO_WritePin (DHT11_GPIO_PORT,DHT11_GPIO_PIN,GPIO_PIN_SET);
    DHT11_DQ_OUT=1;
    delay_us(30);     //15US
}
//等待DS18B20的回應(yīng)
//返回1:未檢測到DS18B20的存在
//返回0:存在
u8 DHT11_Check(void)        
{   
    u8 retry=0;
    DHT11_IO_IN();//SET PA0 INPUT     
  //  while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT,DHT11_GPIO_PIN)&&retry<100)
     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讀取一個位
//返回值:1/0
u8 DHT11_Read_Bit(void)              // read one bit
{
  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);
if(DHT11_DQ_IN)
    return 1;
else return 0;
}
//從DS18B20讀取一個字節(jié)
//返回值:讀到的數(shù)據(jù)
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++)
        {
        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;
}

//初始化DS18B20的IO口 DQ 同時(shí)檢測DS的存在
//返回1:不存在
//返回0:存在         
u8 DHT11_Init(void)
{


    GPIO_InitTypeDef GPIO_Initure;
    DHT11_RCC();           //開啟GPIOB時(shí)鐘
   
    GPIO_Initure.Pin=DHT11_GPIO_PIN;             //PB8
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽輸出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
    HAL_GPIO_Init(DHT11_GPIO_PORT,&GPIO_Initure);
    //    HAL_GPIO_WritePin(DHT11_GPIO_PORT,DHT11_GPIO_PIN,GPIO_PIN_SET);
     DHT11_DQ_OUT;
    DHT11_Rst();

    return DHT11_Check();
}  


main.c//這里面寫了一個接口口函數(shù)sensor_poll();  專門用于換取傳感器數(shù)據(jù)
這是dht11的部分

    delay_ms(900);
                            //delay_ms(1);
                DHT11_Read_data( &temp, &humi) ;   
                            swstate = 1;
                printf("temp=%f,humi=%f\r\n",temp,humi);

這是ds18b20的部分

temperature=DS18B20_Get_Temp();   
                                printf("\r\ntemperature=%4.1f\r\n",temperature);               
                             
            delay_ms(500);






作者: man1234567    時(shí)間: 2023-4-20 08:26
dht11和ds18b20和光照強(qiáng)度有毛關(guān)系 ?
作者: Hephaestus    時(shí)間: 2023-4-20 16:13
你都用上ucosii了,為什么還要寫 delay_ms(900); 這種東西?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1