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