|
- extern unsigned char DHT11_ReadTempAndHumi(void)
- {
- unsigned char i = 0, check_value = 0, count = 0;
- EA = 0;
- dht11 = 0; //拉低數(shù)據(jù)線大于 18ms 發(fā)送開始信號
- Delay_1ms(20); //需大于 18 毫秒
- dht11 = 1; //釋放數(shù)據(jù)線,用于檢測低電平的應(yīng)答信號
- //延時 20-40us,等待一段時間后檢測應(yīng)答信號,應(yīng)答信號是從機(jī)拉低數(shù)據(jù)線 80us
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- if (dht11 != 0) //檢測應(yīng)答信號,應(yīng)答信號是低電平
- {
- //沒應(yīng)答信號
- EA = 1;
- return ERROR;
- }
- else
- {
- //有應(yīng)答信號
- while (dht11 == 0 && count++ < NUMBER)
- ; //等待應(yīng)答信號結(jié)束
- if (count >= NUMBER) //檢測計(jì)數(shù)器是否超過了設(shè)定的范圍
- {
- dht11 = 1;
- EA = 1;
- return ERROR; //讀數(shù)據(jù)出錯,退出函數(shù)
- }
- count = 0;
- dht11 = 1; //釋放數(shù)據(jù)線
- //應(yīng)答信號后會有一個 80us 的高電平,等待高電平結(jié)束
- while (dht11 != 0 && count++ < NUMBER)
- ;
- if (count >= NUMBER)
- {
- dht11 = 1;
- EA = 1;
- return ERROR; //退出函數(shù)
- }
- //讀出濕.溫度值
- for (i = 0; i < SIZE; i++)
- {
- value_array[i] = DHT11_ReadValue();
- if (status == ERROR) //調(diào)用 ReadValue()讀數(shù)據(jù)出錯會設(shè)定 status 為 ERROR
- {
- dht11 = 1;
- EA = 1;
- return ERROR;
- }
- //讀出的最后一個值是校驗(yàn)值不需加上去
- if (i != SIZE - 1)
- {
- //讀出的五字節(jié)數(shù)據(jù)中的前四字節(jié)數(shù)據(jù)和等于第五字節(jié)數(shù)據(jù)表示成功
- check_value += value_array[i];
- }
- } //end for
- //在沒用發(fā)生函數(shù)調(diào)用失敗時進(jìn)行校驗(yàn)
- if (check_value == value_array[SIZE - 1])
- {
- //將溫濕度擴(kuò)大 10 倍方便分離出每一位
- humi_value = value_array[0] * 10;
- temp_value = value_array[2] * 10;
- dht11 = 1;
- EA = 1;
- return OK; //正確的讀出 dht11 輸出的數(shù)據(jù)
- }
- else
- {
- //校驗(yàn)數(shù)據(jù)出錯
- EA = 1;
- return ERROR;
- }
- }
- }
復(fù)制代碼
上述程序就是DHT11的驅(qū)動程序。 |
|