void start()
{
DHTIO=1;
delay_10us();
DHTIO=0;
delay(25); // 主機把總線拉低必須大于18ms保證DHT11能檢測到起始信號
DHTIO=1; //發送開始信號結束后拉高電平延時20-40us
delay_10us();
delay_10us();
delay_10us();
}
/*-------------DHT11接受一個數據----------------*/
unsigned char COM()
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
while(!DHTIO);//等待50us低電平結束
delay_10us();
delay_10us();
delay_10us();
temp=0;
if(DHTIO==1)
temp=1; //如果26us-28us之后還為高電平則表示接收的數據為'1'
while(DHTIO) //等待數據信號高電平'0'為26us-28us'1'為70us
comdata<<=1;
comdata|=temp;
}
return comdata;
}
/*--------------DHT11接收數據--------------*/
void RH()
{
unsigned char wendu_h_temp,wendu_l_temp,shidu_h_temp,shidu_l_temp,check_temp,i;
start();
DHTIO=1;
if(!DHTIO) //判斷從機是否有低電平響應信號
{
while(!DHTIO);//判斷從主機是否發出80us的低電平相應是否結束
while(DHTIO);//判斷主機是否發出80us高電平,發出則開始采集數據
shidu_h_temp=COM();//采集濕度整數
shidu_l_temp=COM();//采集濕度小數
wendu_h_temp=COM();//采集溫度整數
wendu_l_temp=COM();//采集溫度小數
check_temp=COM();//采集校驗位
DHTIO=0; //當最后一bit數據接完畢后從機拉低電平50us//
for(i=0;i<7;i++) //差不多50us的延時
delay_10us();
DHTIO=1; //總線由上拉電阻拉高進入空閑狀態
num_check=shidu_h_temp+shidu_l_temp+wendu_h_temp+wendu_l_temp;
if(num_check=check_temp) //判斷讀到的四個數據之和是否與校驗位相同
{
shidu_h_data=shidu_h_temp;
shidu_l_data=shidu_l_temp;
wendu_h_data=wendu_h_temp;
wendu_l_data=wendu_l_temp;
check_temp=num_check;
}
}
}
|