uint8_t DHT11_Check(void){ //等待DHT11回应,返回1:未检测到DHT11,返回0:成功(IO接收) uint8_t retry=0; //定义临时变量 DHT11_IO_IN(); //IO到输入状态 //GPIO端口输入时,配置为上拉输入或者浮空输入,因为外接上拉电阻,所以默认为高电平 //如果DHT11的数据线输入为高电平,且 retry 小于100,则将 retry 加1,并延时1微秒,重复这个过程直到 retry // 大于等于100 或者DHT11的数据线输入变成低电平。如果 retry //大于等于100,表示检测失败,返回1;否则,将 retry 重置为0。 while (HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET) == 1) && retry<100) //DHT11会拉低40~80us { retry++; HAL_Delay(1); } if(retry>=100)return 1; else retry=0; //如果DHT11的数据线输入为低电平,且 retry 小于100,则将 retry 加1,并延时1微秒,重复这个过程直到 retry 大于等于100 或者DHT11的数据线输入变成高电平。如果 retry 大于等于100,表示检测失败,返回1;否则,返回0,表示检测成功。 while ((HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET)) == 0) && retry<100) //DHT11拉低后会再次拉高40~80us { retry++; HAL_Delay(1); } if(retry>=100)return 1; return 0; }改错
时间: 2024-03-14 22:42:45 浏览: 138
根据您提供的代码,可能存在以下几个问题:
1. 函数名中的 `DHT11_Check` 可能应该改为 `DHT11_Check_Response` ,因为函数的作用是检测 DHT11 是否响应。
2. `while` 循环语句中的语法格式不正确,应该是 `while(condition)` 的形式,而不是 `while(condition) XXXX` 的形式。
3. 在第一个 `while` 循环中,`HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET) == 1` 应该改为 `HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET`,因为 DHT11 会在开始传输数据时将数据线拉低,因此应该判断 GPIOB 的输入状态是否为低电平。
4. 在第二个 `while` 循环中,`HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET)) == 0` 应该改为 `HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_SET`,因为 DHT11 会在开始传输数据时将数据线拉高,因此应该判断 GPIOB 的输入状态是否为高电平。
改过后的代码如下所示:
```c
uint8_t DHT11_Check_Response(void) {
uint8_t retry = 0;
DHT11_IO_IN(); //IO到输入状态
while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET && retry < 100) { //DHT11会拉低40~80us
retry++;
HAL_Delay(1);
}
if (retry >= 100) return 1;
else retry = 0;
while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET && retry < 100) { //DHT11拉低后会再次拉高40~80us
retry++;
HAL_Delay(1);
}
if (retry >= 100) return 1;
return 0;
}
```
阅读全文