OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4084|回复: 3

关于DHT11为什么输出一直都是高电平?

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-11-1
在线时间
3 小时
发表于 2020-11-1 23:40:27 | 显示全部楼层 |阅读模式
4金钱
uint8_t dat[5]={0x00,0x00,0x00,0x00,0xFF};
void Delay_us(uint16_t us)
{
  uint16_t fac_us=0xffff-us;
  __HAL_TIM_SET_COUNTER(&htim6,fac_us);
  HAL_TIM_Base_Start(&htim6);
  while(fac_us<0xffff)
  {
    fac_us=__HAL_TIM_GET_COUNTER(&htim6);
  }
  HAL_TIM_Base_Stop(&htim6);
}
void DHT11_PortOutput(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,GPIO_PIN_SET);
}
void DHT11_PortInput(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}
uint8_t DHT11_Read_Byte(void)
{
  uint8_t ReadData=0;
  int i;
  int retry=0;
  for(i=0;i<8;i++)
  {
    while(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_6)==GPIO_PIN_RESET&&retry<100)
    {
  Delay_us(1);
  retry++;
    }
    Delay_us(30);
    if(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_6)==GPIO_PIN_SET)
    {
  ReadData<<=1;
     ReadData|=0x01;
  printf("1\n");
    }
    else
    {
  ReadData<<=1;
     ReadData|=0x00;
  printf("0\n");
    }
    retry=0;
    while(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_6)==GPIO_PIN_SET&&retry<100)
    {
      Delay_us(1);
      retry++;
    }
    retry=0;
  }
  return ReadData;
}
uint8_t DHT11_Read(void)
{
  uint8_t i;
  int retry=0;
  DHT11_PortOutput();
  HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,GPIO_PIN_RESET);
  Delay_us(20000);
  HAL_GPIO_WritePin(GPIOG,GPIO_PIN_6,GPIO_PIN_SET);
  Delay_us(36);
  DHT11_PortInput();
  while(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_6)==GPIO_PIN_RESET&&retry<100)
  {
    Delay_us(1);
    retry++;
  }
  printf("retry=%d\n",retry);
  retry=0;
  while(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_6)==GPIO_PIN_SET&&retry<100)
  {
    Delay_us(1);
    retry++;
  }
  printf("retry=%d\n",retry);
  retry=0;   
  for(i=0;i<5;i++)
  {
    dat[i]=DHT11_Read_Byte();
  }
  if(dat[0]+dat[1]+dat[2]+dat[3]==dat[4])
  {
    return 1;
  }
  else
    return 0;
}
上面是整个程序流程定时器6间隔1us。求教为何它的输出为什么一直都是高电平?从输出上可看到有短暂的低电平,之后就一直都是高电平

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-11-1
在线时间
3 小时
 楼主| 发表于 2020-11-2 00:04:28 来自手机 | 显示全部楼层
补充一句,使用的单片机为STM32F746NG
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-11-1
在线时间
3 小时
 楼主| 发表于 2020-11-2 10:44:00 来自手机 | 显示全部楼层
顶,求回复
回复

使用道具 举报

11

主题

2141

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4855
金钱
4855
注册时间
2015-1-10
在线时间
608 小时
发表于 2020-11-3 16:28:44 | 显示全部楼层
之前用这个的时候会出现有的时候IO线就是没变化的,所以读取DHT11的代码都用超时跳出了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-29 23:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表