- extern unsigned char DHT11_ReadTempAndHumi(void)
- {
- unsigned char i = 0, check_value = 0, count = 0;
- EA = 0;
- dht11 = 0; //拉低数据线大于 18ms 发送开始信号
- Delay_1ms(20); //需大于 18 毫秒
- dht11 = 1; //释放数据线,用于检测低电平的应答信号
- //延时 20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线 80us
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- if (dht11 != 0) //检测应答信号,应答信号是低电平
- {
- //没应答信号
- EA = 1;
- return ERROR;
- }
- else
- {
- //有应答信号
- while (dht11 == 0 && count++ < NUMBER)
- ; //等待应答信号结束
- if (count >= NUMBER) //检测计数器是否超过了设定的范围
- {
- dht11 = 1;
- EA = 1;
- return ERROR; //读数据出错,退出函数
- }
- count = 0;
- dht11 = 1; //释放数据线
- //应答信号后会有一个 80us 的高电平,等待高电平结束
- while (dht11 != 0 && count++ < NUMBER)
- ;
- if (count >= NUMBER)
- {
- dht11 = 1;
- EA = 1;
- return ERROR; //退出函数
- }
- //读出湿.温度值
- for (i = 0; i < SIZE; i++)
- {
- value_array[i] = DHT11_ReadValue();
- if (status == ERROR) //调用 ReadValue()读数据出错会设定 status 为 ERROR
- {
- dht11 = 1;
- EA = 1;
- return ERROR;
- }
- //读出的最后一个值是校验值不需加上去
- if (i != SIZE - 1)
- {
- //读出的五字节数据中的前四字节数据和等于第五字节数据表示成功
- check_value += value_array[i];
- }
- } //end for
- //在没用发生函数调用失败时进行校验
- if (check_value == value_array[SIZE - 1])
- {
- //将温湿度扩大 10 倍方便分离出每一位
- humi_value = value_array[0] * 10;
- temp_value = value_array[2] * 10;
- dht11 = 1;
- EA = 1;
- return OK; //正确的读出 dht11 输出的数据
- }
- else
- {
- //校验数据出错
- EA = 1;
- return ERROR;
- }
- }
- }
复制代码
上述程序就是DHT11的驱动程序。 |