|
dht11传感器51单片机驱动代码
#include "dht11.h"
void dht_Delay(unsigned int j) //延时0.1ms,晶振为11.0592M
{
unsigned char i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us()
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
//接收一个字节
unsigned char rev_byte( )
{
unsigned char i,temp,rev_data=0;
for(i=0;i<8;i++)
{
while(dat==0); //等待50us的低电平
Delay_10us(); //延时30us
Delay_10us();
Delay_10us();
temp=0;
if(dat==1) //判断数据为0或1
temp=1;
while(dat==1); //等待1的高电平结束
rev_data<<=1;
rev_data|=temp;
}
return rev_data;
}
//读温湿度
void RH(unsigned char *rh,unsigned char *tem)
{
unsigned char rh_h,rh_l,tem_h,tem_l,rh_ht,rh_lt,tem_ht,tem_lt,check;
dat=0; //拉低18ms
dht_Delay(180);
dat=1; //总线由上拉电阻拉高延时20us以上
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
dat=1; //dat引脚设为读状态
if(dat==0) //判断是否有低电平响应信号
{
while(dat==0); //等待 80us 的低电平响应信号
while(dat==1); //等待80us的高电平响应
rh_ht=rev_byte(); //接收湿度高8位
rh_lt=rev_byte(); //湿度低8位
tem_ht=rev_byte(); //温度高8位
tem_lt=rev_byte(); //温度低8位
check=rev_byte();
dat=1;
if(rh_ht+rh_lt+tem_ht+tem_lt==check) //数据校验
{
rh_h=rh_ht;
rh_l=rh_lt;
tem_h=tem_ht;
tem_l=tem_lt;
*rh=rh_h;
*tem=tem_h;
}
}
}
|
|