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