DHT11 驱动程序,调试成功了,如果用在不是52单片机的,只需修改时间就可以了。
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbit DHT = P1^3 ;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
uchar DATARHT[5],RTflag=0,tm[6];
uchar FLAG;
void Delay_t(uint j)
{ uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
uchar COM()
{
uchar i,comdata,temp1;
for(i=0;i<8;i++)
{
FLAG=2;
while((!DHT)&&FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
temp1=0;
if(DHT)temp1=1;
FLAG=2;
while((DHT)&&FLAG++);
//超时则跳出for循环
if(FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
comdata<<=1;
comdata|=temp1;
}
return (comdata);
}
void RH(void)
{
uchar i,temp;
//主机拉低18ms
DHT=0;
Delay_t(180);
DHT=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
DHT=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DHT) //T !
{
FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DHT)&&FLAG++);
FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DHT)&&FLAG++); //数据接收状态
for(i=0;i<5;i++)
{
DATARHT[i]=COM();
}
DHT=1;
//数据校验
temp=(DATARHT[0]+DATARHT[1]+DATARHT[2]+DATARHT[3]);
if(temp==DATARHT[4])
{
RTflag=1;
}
if(RTflag==1)
{
RTflag=0;
tm[0]=DATARHT[0]/10;
tm[1]=DATARHT[0]%10;
tm[2]=DATARHT[1]/10; //湿度
tm[3]=DATARHT[2]/10;
tm[4]=DATARHT[2]%10;
tm[5]=DATARHT[3]/10; //温度
}
}
}