请各位大佬帮忙看看哪个环节出现问题
这是现象,光照强度用的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);
|