STM8208C8驱动DHT11问题

2019-07-19 20:09发布

本帖最后由 zsky66 于 2017-10-3 12:27 编辑

[mw_shl_code=c,true]#include "DHT11.h"
#include "delay.h"
#include "iostm8s208c8.h"

/*
PB7设置位推挽输出模式
*/
void DQ_out()
{
  PB_DDR_bit.DDR7 = 1;
  PB_CR1_bit.C17 = 1;
  PB_CR2_bit.C27 = 0;
}


/*
PB7设置为浮空输入模式
*/
void DQ_in()
{
  PB_DDR_bit.DDR7 = 0;
  PB_CR1_bit.C17 = 0;
  PB_CR2_bit.C27 = 0;
}


/*
DHT11起始信号
*/
void DHT11_start(void)
{
  DQ_out();                          //PB7设置为输出模式
  PB_ODR_bit.ODR7 = 0;              //拉低PB7
  delay_ms(18);                    //延时18ms
  PB_ODR_bit.ODR7 = 1;            //拉高延时30us
  delay_us(30);
  
}


/*DHT11响应函数
返回1:接受失败
返回0:成功
*/
u8 DHT11_check()
{
  u8 retry = 0;
  DQ_in();                              //PB7设置为浮空输入模式
  while(PB_IDR_bit.IDR7 && retry<100)   //在此等待DHT11拉低总线电平
  {
    retry++;
    delay_us(1);
  }
  if(retry>=100) return 1;
  else retry = 0;
  while(!PB_IDR_bit.IDR7 && retry<100)  //等待DHT11拉高总线电平
  {
    retry++;
    delay_us(1);
  }
  if(retry>=100) return 1;
  return 0;
}

/*DHT11读取一个位*/
u8 DHT11_read_bit()
{
  u8 retry = 0;
  while(PB_IDR_bit.IDR7 && retry<100)
  {
    retry++;
    delay_us(1);
  }
  retry = 0;
  while(!PB_IDR_bit.IDR7 && retry<100)
  {
    retry++;
    delay_us(1);
  }
  delay_us(40);
  if(PB_IDR_bit.IDR7)return 1;
  else return 0;
}

/*DHT11读取一个字节*/
u8 DHT11_read_byte()
{
  u8 dat = 0;
  u8 i;
  for(i=0;i<8;i++)
  {
    dat<<=1;
    dat |= DHT11_read_bit();
  }
  return dat;
}

//u8 DHT11_read_temper()
//{
//  u8 buf[5];
//  u8 i;
//  u8 *temper;
//  DHT11_start();
//  if(DHT11_check() == 0)
//  {
//    for(i=0;i<5;i++)
//    {
//      buf=DHT11_read_byte();
//    }
//    if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
//    {
//      //*humi = buf[0];
//      *temper = buf[2];
//    }
//  }else return 1;
//  return *temper;
//}














[/mw_shl_code]自己做了一块板子,目的是使用STM8S208驱动DHT11温湿度传感器,但是现在的问题是DHT11复位之后,无法在MCU端口读取到DHT11的低电平响应,检查了很长一段时间也没发现啥问题,所有特来论坛请教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。