本程序使用于 STC12C5 系列單片機,使用其他單片機特別注意時序問題 #include <reg51.h> #include <intrins.h> unsigned char TH_data; // 溫度高 8 位 unsigned char TL_data; // 溫度低 8 位 unsigned char RH_data; // 濕度高 8 位 unsigned char RL_data; // 濕度低 8 位 unsigned char CK_data; sbit DHT11_Data = P2^0; // DHT11 數(shù)據(jù)線 void delay_us(unsigned char us) //@12.000MHz { while(us--) { _nop_(); _nop_(); } } void delay_ms(unsigned char ms) //@12.000MHz { unsigned char i, j; while(ms--) { _nop_(); _nop_(); i =12; j =168; do { while (--j); } while (--i); } } /****************************************************************************/ // 函數(shù)名稱 : DHT_Read // 函數(shù)功能 : DHT11 讀取數(shù)據(jù) /****************************************************************************/ unsigned char DHT_Read() { unsigned char i; // 定義變量,用于循環(huán) unsigned char temp; // 定義變量,用于臨時返回值 unsignedchar com_data; // 定義變量,用于返回值 unsigned char respond; // 定義變量,用于響應(yīng)處理 for(i=0;i<=7;i++) // 接收 8bit 數(shù)據(jù) { respond=0; while((!DHT11_Data)&& respond<100)// 等待 50us 低電平開始信號結(jié)束 { respond++; delay_us(1); } delay_us(28);//開始信號結(jié)束后延時 26us-28us if(DHT11_Data) { temp=1; respond=0; while((DHT11_Data)&& respond<100) { respond++; delay_us(1); } } else { temp=0; } com_data<<=1; com_data|=temp; } return(com_data); } /****************************************************************************/ /****************************************************************************/ // 實現(xiàn)功能: DHT11 采集溫濕度 /***************************************************************************/ void DHT11_Gets(void) { unsigned char respond;// 定義變量,用于響應(yīng)處理 unsigned charTH_temp,TL_temp,RH_temp,RL_temp,CK_temp; DHT11_Data=0; delay_ms(20);// 主機拉低總線必須大于 18ms, 保證 DHT11 能檢測到信號 DHT11_Data=1;// 發(fā)送信號結(jié)束,拉高電平延時 20-40us delay_us(30);// 延時大約 30us if(!DHT11_Data) // 判斷 DHT11 是否低電平響應(yīng)信號 { respond=0; while((!DHT11_Data)&& respond<80) { respond++; delay_us(1); } respond=0; while((DHT11_Data)&&respond<100) { respond++; delay_us(1); } RH_temp = DHT_Read(); RL_temp = DHT_Read(); TH_temp = DHT_Read(); TL_temp = DHT_Read(); CK_temp = DHT_Read(); DHT11_Data=0; delay_us(50); DHT11_Data=1; if((RH_temp+RL_temp+TH_temp+TL_temp)==CK_temp) { RH_data = RH_temp; RL_data = RL_temp; TH_data = TH_temp; TL_data = TL_temp; } }
|