uint8_t DHT11_Check(void) // 检查DHT11响应 { uint8_t retry = 0; while(DHT11_DATA && retry < 100) // 等待DHT11拉低数据线 { retry++; Delay_us(1); } if(retry >= 100) { return 1; } else { retry = 0; while(!DHT11_DATA && retry < 100) // 等待DHT11拉高数据线 { retry++; Delay_us(1); } if(retry >= 100) { return 1; } } return 0; } uint8_t DHT11_ReadBit(void) // 读取一个数据位 { uint8_t retry = 0; while(DHT11_DATA && retry < 100) // 等待DHT11拉低数据线 { retry++; Delay_us(1); } retry = 0; while(!DHT11_DATA && retry < 100) // 等待DHT11拉高数据线 { retry++; Delay_us(1); } Delay_us(40); // 数据持续时间 if(DHT11_DATA) { return 1; } else { return 0; } }
时间: 2024-04-28 16:19:09 浏览: 87
这段代码是用于读取DHT11传感器数据的。其中,DHT11_Check函数用于检测DHT11传感器是否响应,DHT11_ReadBit函数用于读取一个数据位。在两个函数中,都有一个retry变量,用于记录等待的次数,如果等待的次数超过了100次,就会返回1,表示读取失败。而DHT11_DATA则是一个宏定义,用于表示DHT11传感器数据线的状态。
相关问题
#include "dht11.h" void Delay_us(uint16_t delay) { __HAL_TIM_DISABLE(&htim3); __HAL_TIM_SET_COUNTER(&htim3,0); __HAL_TIM_ENABLE(&htim3); uint16_t curCnt=0; while(1) { curCnt=__HAL_TIM_GET_COUNTER(&htim3); if(curCnt>=delay) break; } __HAL_TIM_DISABLE(&htim3); } void DHT11_OUT(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void DHT11_IN(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void DHT11_Strat(void) { DHT11_OUT(); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); HAL_Delay(20); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); Delay_us(30); } uint8_t DHT11_Check(void) { uint8_t retry = 0 ; DHT11_IN(); while(GPIO_PIN_SET == HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8) && retry <100) { retry++; Delay_us(1);//1us } if(retry>=100) {return 1;} else retry = 0 ; while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8) && retry<100) { retry++; Delay_us(1);//1us } if(retry>=100) {return 1;} return 0 ; } uint8_t DHT11_Read_Bit(void) { uint8_t retry = 0 ; while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) && retry <100) { retry++; Delay_us(1); } retry = 0 ; while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) && retry<100) { retry++; Delay_us(1); } Delay_us(40); if(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8)) return 1; else return 0 ; } uint8_t DHT11_Read_Byte(void) { uint8_t i , dat ; dat = 0 ; for(i=0; i<8; i++) { dat <<= 1; dat |= DHT11_Read_Bit(); } return dat ; } uint8_t DHT11_Read_Data(uint8_t* temp , uint8_t* humi) { uint8_t buf[5]; uint8_t i; DHT11_Strat(); 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 ; } void func_1() { uint8_t temperature = 1 ; uint8_t humidity = 1; uint8_t aTXbuf[32] ; while(1){ DHT11_Read_Data(&temperature , &humidity); sprintf((char*)aTXbuf,"%d , %d %% \r\n" ,temperature ,humidity); HAL_UART_Transmit(&huart1, aTXbuf, strlen((const char*)aTXbuf), 200); HAL_Delay(5000); } } int temperature_humidity_device_control(protocol_package_t *pk) { printf("temperature_humidity_device_control\r\n"); if(pk->function == 0x16 && pk->data[0] == 0x00) { printf("temperature_humidity_device_control success\r\n"); uint8_t temperature = 1 ; uint8_t humidity = 1; uint8_t aTXbuf[32] ; //DHT11_Read_Data(&temperature , &humidity); pk->data[0] = 0x35; } return 0; }改错
在你提供的代码中,没有包含头文件 "main.h" 和 "stdio.h"。你需要添加这两个头文件到你的代码中,这样才能正确使用其中的函数和变量。
另外,你在调用 sprintf 函数时,第二个参数类型应该是 char*,而不是 uint8_t*。因此,你需要将 aTXbuf 声明为 char 类型数组,而不是 uint8_t 类型数组。同时,在使用 strlen 函数计算字符串长度时,应该传入一个 char* 类型的参数。
最后,你可以将 DHT11_Read_Data 函数的返回值直接返回,而不需要使用 if-else 语句判断后再返回。因为函数内部已经有了返回值,可以直接将其返回给调用者。
以下是修改后的代码:
```c
#include "main.h"
#include "stdio.h"
#include "dht11.h"
extern UART_HandleTypeDef huart1;
extern TIM_HandleTypeDef htim3;
void Delay_us(uint16_t delay) {
__HAL_TIM_DISABLE(&htim3);
__HAL_TIM_SET_COUNTER(&htim3,0);
__HAL_TIM_ENABLE(&htim3);
uint16_t curCnt=0;
while(1)
{
curCnt=__HAL_TIM_GET_COUNTER(&htim3);
if(curCnt>=delay)
break;
}
__HAL_TIM_DISABLE(&htim3);
}
void DHT11_OUT(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void DHT11_IN(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void DHT11_Strat(void) {
DHT11_OUT();
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_Delay(20);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
Delay_us(30);
}
uint8_t DHT11_Check(void) {
uint8_t retry = 0 ;
DHT11_IN();
while(GPIO_PIN_SET == HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8) && retry <100)
{
retry++;
Delay_us(1);//1us
}
if(retry>=100)
{return 1;}
else retry = 0 ;
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8) && retry<100)
{
retry++;
Delay_us(1);//1us
}
if(retry>=100)
{return 1;}
return 0 ;
}
uint8_t DHT11_Read_Bit(void) {
uint8_t retry = 0 ;
while(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) && retry <100)
{
retry++;
Delay_us(1);
}
retry = 0 ;
while(GPIO_PIN_RESET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) && retry<100)
{
retry++;
Delay_us(1);
}
Delay_us(40);
if(GPIO_PIN_SET==HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8)) return 1;
else return 0 ;
}
uint8_t DHT11_Read_Byte(void) {
uint8_t i , dat ;
dat = 0 ;
for(i=0; i<8; i++)
{
dat <<= 1;
dat |= DHT11_Read_Bit();
}
return dat ;
}
uint8_t DHT11_Read_Data(uint8_t* temp , uint8_t* humi) {
uint8_t buf[5];
uint8_t i;
DHT11_Strat();
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];
return 0;
}
}
return 1;
}
void func_1() {
uint8_t temperature = 1;
uint8_t humidity = 1;
char aTXbuf[32];
while(1){
DHT11_Read_Data(&temperature , &humidity);
sprintf(aTXbuf,"%d , %d %% \r\n" ,temperature ,humidity);
HAL_UART_Transmit(&huart1, (uint8_t*)aTXbuf, strlen(aTXbuf), 200);
HAL_Delay(5000);
}
}
int temperature_humidity_device_control(protocol_package_t *pk) {
printf("temperature_humidity_device_control\r\n");
if(pk->function == 0x16 && pk->data[0] == 0x00)
{
printf("temperature_humidity_device_control success\r\n");
uint8_t temperature = 1 ;
uint8_t humidity = 1;
char aTXbuf[32];
DHT11_Read_Data(&temperature , &humidity);
sprintf(aTXbuf,"%d , %d %% \r\n" ,temperature ,humidity);
strncpy((char*)pk->data, aTXbuf, strlen(aTXbuf));
pk->data_len = strlen(aTXbuf);
pk->data[0] = 0x35;
}
return 0;
}
```
#include "dht11.h" #define DHT11_GPIO_PORT GPIOB #define DHT11_GPIO_PIN GPIO_PIN_8 static void DHT11_DelayUs(uint32_t us) { __HAL_TIM_SET_COUNTER(&htim1, 0); while (__HAL_TIM_GET_COUNTER(&htim1) < us); } static uint8_t DHT11_ReadBit(void) { uint8_t retry = 0; while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET) { if (++retry > 100) { return DHT11_TIMEOUT; } DHT11_DelayUs(1); } retry = 0; while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) { if (++retry > 100) { return DHT11_TIMEOUT; } DHT11_DelayUs(1); } return GPIO_PIN_SET; } uint8_t DHT11_ReadData(DHT11_Data_TypeDef *data) { uint8_t buffer[5] = {0}; uint8_t i, j; /* 发送起始信号 */ HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET); DHT11_DelayUs(18000); HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET); DHT11_DelayUs(40); /* 等待应答信号 */ if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET) { while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET); while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET); for (i = 0; i < 5; i++) { for (j = 0; j < 8; j++) { if (DHT11_ReadBit() == DHT11_TIMEOUT) { return DHT11_TIMEOUT; } DHT11_DelayUs(30); if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) { buffer[i] |= (1 << (7 - j)); } } } if ((buffer[0] + buffer[1] + buffer[2] + buffer[3]) == buffer[4]) { data->Humidity = buffer[0]; data->Temperature = buffer[2]; return DHT11_OK; } else { return DHT11_ERROR; } } return DHT11_TIMEOUT; } void DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 使能GPIOB时钟 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /* 配置GPIOB8引脚为输入模式 */ GPIO_InitStruct.Pin = DHT11_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct); }
这是一个用于读取DHT11温湿度传感器数据的函数库,包含了初始化函数DHT11_Init()和读取数据函数DHT11_ReadData(),以及一些辅助函数。在读取数据时,函数会发送起始信号,等待应答信号,然后读取40位数据,计算校验和并返回温湿度数据。该函数库需要在使用之前调用DHT11_Init()函数进行初始化。
阅读全文