iceman_hds 2024-01-07 20:52 采纳率: 0%
浏览 8

不知道为什么最后串口输出的温湿度一直是0


uint8_t dat[5]={0x00,0x00,0x00,0x00,0x00};    //存储读取的温湿度信息
uint32_t sum=0;         //存放校验时的求和


void DHT11_PortOutput(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//推挽输出
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出50MHz
 GPIO_Init(GPIOB,&GPIO_InitStructure);
}
 

void DHT11_PortInput(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//
 GPIO_Init(GPIOB,&GPIO_InitStructure);
}


uint8_t DHT_Read_Byte(void)
{
  uint8_t temp;      //存放读取到的位数据
  uint8_t ReadDat = 0;
  uint8_t i;
  uint8_t retry = 0;
  for(i=0;i<8;i++)
  {
    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==0 && retry < 100)     //等待DHT11输出高电平
        {
            delay_us(1);
            retry++;
        }
        retry = 0;
    delay_us(30);          //延时30us,由于‘0’代码高电平时间26-28us,‘1’代码高电平时间70us,
    temp = 0;             //先将寄存器清零
      if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==1)        //延时30us之后如果还是高电平,证明为1代码
      temp = 1;            //1存储
    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==1 && retry < 100)      //等待信号被拉低,跳出
        {
            delay_us(1);
            retry++;
        }
        retry = 0;
        ReadDat<<=1;           //数据左移1位,存放新得到的数据
        ReadDat|= temp;         //新得到的数据放到最后1位
  }
    return ReadDat;
}





uint8_t DHT_Read(void)
{
    uint8_t i;
    uint8_t retry = 0;
    DHT11_PortOutput();           //端口方向设置为输出
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);           //端口数据拉低
  delay_ms(18);          //延时18ms,时序要求
  GPIO_SetBits(GPIOB,GPIO_Pin_5);           //端口数据拉高
  delay_us(40);          //延时40us,
    DHT11_PortInput();           //方向设置为输入
  delay_us(20);          //延时20us
  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==0)          //如果读取到低电平,证明DHT11响应
  {
    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==0 && retry < 100)  //等待变高电平
        {
            delay_us(1);
            retry++;
        }
        retry = 0;
    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) ==1 && retry < 100) //等待变低电平
        {
            delay_us(1);
            retry++;
        }
        retry = 0;
    for(i=0;i<5;i++)    //循环5次将40位读出
     {
      dat[i] = DHT_Read_Byte();    //读出1个字节
     }
    delay_us(50);         //最后延时等待50us
  }
  sum=dat[0]+dat[1]+dat[2]+dat[3];     //4个字节数据的和
  if(dat[4]==(u8)(sum))     //4个数据和的末8位要和第5个数据相等,才算读取正确
    {
      return 1 ;                  //校验正确,返回1
    }
  else
      return 0 ;                  //校验错误,返回0
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-07 22:08
    关注

    【相关推荐】



    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7453114
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:串口通信——根据波特率计算定时器重装载值
    • 您还可以看一下 张云波老师的以太坊智能合约项目实战课程中的 整个游戏的状态定义小节, 巩固相关知识点
    • 除此之外, 这篇博客: 微机原理问答题中的 一般接口电路中应具有哪些电路器件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      (1) 输入、输出数据锁存器和缓冲器,用于解决CPU与外设之间速度不匹配的矛盾,以及起隔离和缓冲的作用。
      (2) 控制命令和状态寄存器,以存放CPU对外设的控制命令以及外设的状态信息。
      (3) 地址译码器,用于选择接口电路中的不同端口(寄存器)。
      (4) 读写控制逻辑
      (5) 中断控制逻辑


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 1月7日