你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8L152 DHT11测试数据一直是零,大神们看看

[复制链接]
kin_ 提问时间:2018-2-13 21:51 /
本帖最后由 kin_ 于 2018-2-13 22:03 编辑

用stm8l做温度检测,输出至串口,都出来的数据全是零。同样的程序在stm8s208板子上顺利运行,研究了好几天了,大神们来看看

main函数部分是初始化时钟分频为1

DHT11初始化工作-----------------------------------------
#define DZX_Pin GPIO_Pin_7
#define DZX_Port GPIOD

#define DZX_L GPIO_WriteBit(DZX_Port,DZX_Pin,RESET)
#define DZX_H GPIO_WriteBit(DZX_Port,DZX_Pin,SET)

#define DZX_O GPIO_Init(DZX_Port,DZX_Pin,GPIO_Mode_Out_PP_High_Fast)
#define DZX_I GPIO_Init(DZX_Port,DZX_Pin,GPIO_Mode_In_PU_No_IT)
#define DZX_V GPIO_ReadInputDataBit(DZX_Port,DZX_Pin)


DHT11代码部分-----------------------------------------
void DHT11_RST(void)
{
    DZX_O;
    DZX_L;
    delay_ms(20);
    DZX_H;
    delay_us(30);
}

u8 DHT11_Check(void)
{
  u8 retry=0;

  DZX_I;
  while(DZX_V && retry<100)
  {
    retry++;
    delay_us(1);
  }
  if(retry>=100) return 1; //DHT11不存在
  else retry=0;

  while(DZX_V==0 && retry<100)
  {
    retry++;
    delay_us(1);
  }
  if(retry>=100) return 1; //DHT11不存在
  else retry=0;

  return 0;//检测到DHT11
}

u8 DHT11_ReadBit(void)
{
    while(DZX_V==1);
    while(DZX_V==0);
    delay_us(40);
    if(DZX_V==1) return 1;
    else return 0;
}

u8 DHT11_ReadByte(void)
{
    u8 i=0;
    u8 dat=0;

    for(i=0;i<8;i++)
    {
      dat<<=1;
      dat|=DHT11_ReadBit();
    }
    return dat;
}

u8 DHT11_ReadData(u8 *sd,u8 *wd)
{
    u8 buf[5];
    u8 i=0;
    DHT11_RST();
    if(DHT11_Check()==0)
    {
        for(i=0;i<5;i++)
        {
            buf=DHT11_ReadByte();
        }
        if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])
        {
            *sd=buf[0];
            *wd=buf[2];

            return 0;
        }
        else
        {
            return 1; //通讯错误
        }
    }
    else
    {
        return 1; //DHT11 不存在
    }

}

void DHT11_Demo(void)
{
    u8 sd;
    u8 wd;

    if(DHT11_ReadData(&sd,&wd)==0)
    {
        printf("当前环境湿度:%d %%\r\n",sd);
        printf("当前环境温度:%d ℃\r\n",wd);
        printf("\r\n");
    }
    else
    {
        printf("DHT11温湿度传感器检测失败!\r\n");
    }

    delay_ms(1000);
}


收藏 评论5 发布时间:2018-2-13 21:51

举报

5个回答
toofree 回答时间:2018-2-13 23:31:05
“一线”器件对时序要求特别严格,每个关键延时不能太长也不能太短。建议你先把delay_ms()、delay_us()调准确,至少不要差太多。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

不吃肉的羊 回答时间:2018-2-13 23:48:57
赞同楼上意见,一看就是时序的问题。

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

robter 回答时间:2018-2-20 08:09:35
解决没有?经验分享一下
kin_ 回答时间:2018-2-22 22:24:27
robter 发表于 2018-2-20 08:09
解决没有?经验分享一下

问题解决了,之前用的是内部的晶振,焊上一个外部晶振,时序就好了,内部晶振不可靠

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

robter 回答时间:2018-2-24 08:33:44
感觉应该是延时时间的问题,加外部晶振,相当于修改了时钟、延时时间
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版