kin_ 发表于 2018-2-13 21:51:50

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

本帖最后由 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;
    u8 i=0;
    DHT11_RST();
    if(DHT11_Check()==0)
    {
      for(i=0;i<5;i++)
      {
            buf=DHT11_ReadByte();
      }
      if(buf+buf+buf+buf==buf)
      {
            *sd=buf;
            *wd=buf;

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

toofree 发表于 2018-2-13 23:31:05

“一线”器件对时序要求特别严格,每个关键延时不能太长也不能太短。建议你先把delay_ms()、delay_us()调准确,至少不要差太多。

不吃肉的羊 发表于 2018-2-13 23:48:57

赞同楼上意见,一看就是时序的问题。

robter 发表于 2018-2-20 08:09:35

解决没有?经验分享一下

kin_ 发表于 2018-2-22 22:24:27

robter 发表于 2018-2-20 08:09
解决没有?经验分享一下

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

robter 发表于 2018-2-24 08:33:44

感觉应该是延时时间的问题,加外部晶振,相当于修改了时钟、延时时间
页: [1]
查看完整版本: STM8L152 DHT11测试数据一直是零,大神们看看