|
最近在用DHT11测量温湿度的时候遇到了一些问题,查询相关资料需要在DHT11的数据口加上拉电阻,但是在仿真和实物中加上拉电阻DHT11读数不正常,不加上拉电阻反而能使用,看仿真好像是数据口不能正常下拉。
相关代码如下:
//DHT11相关函数
/*******************************************************************************
* 函 数 名 : rev_byte
* 函数功能 : DHT11接受字节
* 输 入 : 无
* 输 出 : rev_data
*******************************************************************************/
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;
}
/*******************************************************************************
* 函 数 名 : RH
* 函数功能 : DHT11读取
* 输 入 : *rh、*tem
* 输 出 : 无
*******************************************************************************/
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;
}
}
}
|
|