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;
}
}
}
|