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的低电平响应,检查了很长一段时间也没发现啥问题,所有特来论坛请教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
zsky66
1楼-- · 2019-07-19 22:25
 精彩回答 2  元偷偷看……
zsky66
2楼-- · 2019-07-19 22:43
[mw_shl_code=c,true]#include "DHT11.h"
#include "delay.h"
#include "iostm8s208c8.h"

u8 temp = 0;
u8 a;
int main(void)
{

  CLK_ICKR = 0x01;                      //启用内部时钟
  CLK_SWR = 0xe1;                       //不分频
  CLK_CKDIVR = 0X00;
  while(!CLK_ICKR_bit.HSIRDY);
  
  delay_init(16);                       //延时函数初始化
  DHT11_start();                        //DHT11初始化
  a = DHT11_check();                    
  temp = DHT11_read_byte();
  while(1);
}[/mw_shl_code]
正点原子
3楼-- · 2019-07-20 01:15
帮顶
664688064z
4楼-- · 2019-07-20 06:12
 精彩回答 2  元偷偷看……
664688064z
5楼-- · 2019-07-20 08:47
 精彩回答 2  元偷偷看……

一周热门 更多>