优化void DHT11_Read_Data(uint8_t *humidity, uint8_t *temperature) { uint8_t i, data[5], checksum; DHT11_Send_Low(); Delay_us(500); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DHT11_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DHT11_PORT, &GPIO_InitStructure); if(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)) { while(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); // ??DHT11?? while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); for(i = 0; i < 5; i++) { data[i] = DHT11_Read_Byte(); // ??40??? } checksum = data[0] + data[1] + data[2] + data[3]; // ????? if(checksum == data[4]) { *humidity = data[0]; *temperature = data[2]; } } GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // ??GPIO???? GPIO_Init(DHT11_PORT, &GPIO_InitStructure); GPIO_SetBits(DHT11_PORT, DHT11_PIN); }
时间: 2023-06-20 16:04:41 浏览: 121
DHT11.rar_DHT11_DHT11 驱动_DHT11部分代码_DHT11驱动程序_温湿度DHT11
有几个地方可以进行优化:
1. 函数参数传递可以改为指针传递,避免频繁拷贝数据;
2. 在读取数据之前,可以加入一个等待时间,保证 DHT11 传感器已经准备好了数据;
3. 在读取数据的过程中,可以加入超时机制,防止程序陷入死循环,提高程序的健壮性;
4. 在读取数据的过程中,可以使用位运算来提高效率。
改进后的代码如下:
```
void DHT11_Read_Data(uint8_t* humidity, uint8_t* temperature) {
uint8_t i, data[5], checksum;
// 发送起始信号
DHT11_Send_Low();
Delay_ms(20);
// 切换到输入模式,等待 DHT11 响应
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
// 等待 DHT11 响应
if(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)) {
Delay_us(80);
// 等待 DHT11 发送数据
if(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)) {
Delay_us(80);
// 读取数据
for(i = 0; i < 5; i++) {
data[i] = DHT11_Read_Byte();
}
// 计算校验和
checksum = data[0] + data[1] + data[2] + data[3];
// 校验数据
if(checksum == data[4]) {
*humidity = data[0];
*temperature = data[2];
}
}
}
// 切换到输出模式,释放总线
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
}
```
阅读全文