?? dht11.c
字號:
//STC89C52單片機的時鐘頻率是11.0592M
#include "DHT11.h"
#include <reg52.h>
/*讀一個字節的數據*/
static uchar ReadValue(void)
{
uchar count, value = 0, i;
status = OK; //設置標志位為正常狀態
for(i = 8; i > 0; i--)
{
value <<= 1; //高位在先,將得到的數據依次左移,最后得到1字節的數據
count = 0;
//每一位數據前都有50us的低電平等待時間.等待50us時間結束
while(dht11 == 0 && count++ < NUMBER);
if(count >= NUMBER)
{
status = ERROR;//設定錯誤標志
return 0;//函數執行過程發生錯誤就退出函數
}
//26-28us的高電平表示該位為0, 70us的高電平表示該位為1
Delay_10us();
Delay_10us();
Delay_10us();
//延時30us后檢測數據線是否為高電平
if(dht11 != 0)
{
//進入這里表明該位為1
value++;
//等待剩下的40us高電平結束
while(dht11 != 0 && count++ < NUMBER)
{
dht11 = 1;
}
if(count >= NUMBER)
{
status = ERROR;//設定錯誤標志
return 0;
}
}
}
return (value);
}
//讀一次數據,共5個字節
uchar ReadTempAndHumi(void)
{
uchar i = 0, check_value = 0,count = 0;
EA = 0;
dht11 = 0; //先拉低數據線至少18ms,發送開始信號
Delay_1ms(20); //延時大于18ms
dht11 = 1; //釋放數據線,用于檢測低電平響應信號
//等待20-40us,檢測響應信號,響應信號為從機拉低數據線80us
Delay_10us();
Delay_10us();
Delay_10us();
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] = ReadValue(); //調用ReadValue()讀數據
if(status == ERROR)//若讀數據出錯,則退出函數
{
dht11 = 1;
EA = 1;
return ERROR;
}
//若讀到的數據是校驗值,則不需要加上去
if(i != SIZE -1)
{
//若讀到的數據中前4字節數據的和等于第5字節字節,則表示成功
check_value += value_array[i];
}
}//end for
//檢驗讀到的數據是否正確
if(check_value == value_array[SIZE - 1])
{
//將溫濕度值擴大十倍,以方便讀出其中的每一位
humi_value = (value_array[0]+value_array[1]) * 10; //前2bit數據為濕度值
temp_value = (value_array[2]+value_array[3]) * 10; //后2bit為溫度值
dht11 = 1;
EA = 1;
return OK;//正確地讀出dht11輸出的數據
}
else
{
//校驗數據出錯
EA = 1;
return ERROR;
}
}
}
//LCD顯示函數
void SMG_Display(uint value)
{
uchar ge, bai, shi;
ge = value%10+0x30; //必須加上0x30,否則顯示亂碼
shi = value%100/10+0x30;
bai = value/100+0x30;
lcd_write_data(bai);
lcd_write_data(shi);
lcd_write_data('.');
lcd_write_data(ge);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -