找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 814|回复: 2
打印 上一主题 下一主题
收起左侧

关于ucosii下dht11和ds18b20一直获取不了数据的问题

[复制链接]
跳转到指定楼层
楼主
请各位大佬帮忙看看哪个环节出现问题
这是现象,光照强度用的GY-30,iic通信可以正常获取数据

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

#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}
////IO操作函数                                               
#define    DHT11_DQ_OUT PAout(8) //数据端口    PA0
#define    DHT11_DQ_IN  PAin(8)  //数据端口    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);        //读出一个字节
u8 DHT11_Read_Bit(void);        //读出一个位
u8 DHT11_Check(void);            //检测是否存在DS18B20
void DHT11_Rst(void);            //复位DS18B20   


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

//GPIO_InitTypeDef GPIO_Initure;
//    DHT11_RCC();           //开启GPIOB时钟
//   
//    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时钟
//   
//    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);
//     

//    }
//复位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的回应
//返回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读取一个字节
//返回值:读到的数据
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 同时检测DS的存在
//返回1:不存在
//返回0:存在         
u8 DHT11_Init(void)
{


    GPIO_InitTypeDef GPIO_Initure;
    DHT11_RCC();           //开启GPIOB时钟
   
    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//这里面写了一个接口口函数sensor_poll();  专门用于换取传感器数据
这是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);





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2023-4-20 08:26 | 只看该作者
dht11和ds18b20和光照强度有毛关系 ?
回复

使用道具 举报

板凳
ID:883242 发表于 2023-4-20 16:13 | 只看该作者
你都用上ucosii了,为什么还要写 delay_ms(900); 这种东西?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表