|
#ifndef _DHT11_H_
#define _DHT11_H_
#include"DALAY.H"
#define uchar unsigned char
#define uint unsigned int
uchar RH,RL,TH,TL; //設(shè)置存儲溫濕度的變量
uchar data_byte;
sbit IO=P1^0; //數(shù)據(jù)口
//初始化
void start()//開始信號
{
IO=1;
delay_10us();
IO=0;
delay_1ms(20); //拉低至少 18ms 保證能檢測到起始信號
IO=1; //檢測到開始信號后,將電平拉高20-40us
delay_10us(); //延時20-40us
delay_10us();
delay_10us();
delay_10us();
}
uchar receive_byte()//接收一個字節(jié)
{
uchar i,temp;
for(i=0;i<8;i++)
{
while(!IO);//等待50us的低電平開始信號結(jié)束
delay_10us(); //開始信號結(jié)束后,延時26us-28us
delay_10us();
delay_10us();
temp=0; //如果時間為26us-28us 則表示接收的數(shù)據(jù)為'0'
if(IO==1)
temp=1;//如果時間超過26us-28us 則表示收到的數(shù)據(jù)為'1'
while(IO);//等待數(shù)據(jù)信號高電平, '0'為26us-28us;'1'為70us
data_byte<<=1;//將接收到的數(shù)據(jù)向高位左移
data_byte|=temp;
}
return data_byte;
}
void receive() //接收數(shù)據(jù)
{
start();//開始信號初始化
IO=1; //主機設(shè)為輸入 判斷從機DHT11的響應(yīng)信號
if(!IO) //判斷是否有響應(yīng)信號
{
while(!IO);//判斷從機發(fā)出80us低電平信號是否結(jié)束
while(IO);
RH= receive_byte();//濕度整數(shù)
RL= receive_byte();//濕度小數(shù)
TH= receive_byte();//溫度整數(shù)
TL= receive_byte();//溫度小數(shù)
IO=0;//當(dāng)所有的數(shù)據(jù)接收完成后,將從機電平拉低50us
delay_10us(); //拉低50us
delay_10us();
delay_10us();
delay_10us();
delay_10us();
IO=1;//將從機電平拉高,進入空閑狀態(tài)
/* num_check=R_H+R_L+T_H+T_L;
if(num_check=check)//判斷讀取的數(shù)據(jù)與校驗位是否相同
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
check=num_check;
}*/
}
}
#endif
|
|