- 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的驅動程序。 |