×
单片机 > 单片机程序设计 > 详情

DHT11驱动(STM32)

发布时间:2020-06-16 发布时间:
|

一、前期准备

单片机:STM32F103ZET6

开发环境:MDK5.14

库函数:标准库V3.5

DHT11模块:


二、实验效果




三、驱动原理

看数据手册。需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。


四、驱动代码

dht11.h


#ifndef __DHT11_H__

#define __DHT11_H__

#include "stm32f10x.h"

#include "gpio.h"

#include "delay.h"


#define DHT_Direction_I  {GPIOA->CRL &= 0XFFFFFFF0; GPIOA->CRL |= 8;}

#define DHT_Direction_O {GPIOA->CRL &= 0XFFFFFFF0; GPIOA->CRL |= 3;}

/* IO Definitions */

#define O_DHT_DAT PAout(0)

#define I_DHT_DAT PAin(0)

#define DHT_DAT_Pin GPIO_Pin_0

#define    DHTPORT         GPIOA

#define     DHTCLKLINE      RCC_APB2Periph_GPIOA


extern void DHT11Configuration(void);

extern uint8_t DHT11_IsOnline(void);

extern uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi);

#endif



ds1302.c


#include "dht11.h"

      

//复位DHT11

void DHT11_Reset(void)    

{                 

DHT_Direction_O;

    O_DHT_DAT = 0;

    DelayMs(20);   

    O_DHT_DAT = 1;

DelayUs(30);     

}


//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

uint8_t DHT11_IsOnline(void)    

{   

uint8_t retry = 0;

DHT_Direction_I;

    while (I_DHT_DAT && retry < 100)//DHT11会拉低40~80us

{

retry ++;

DelayUs(1);

}

if(retry >= 100)

{

return 1;

}

else

{

retry = 0;

}

    while (!I_DHT_DAT && retry < 100)//DHT11拉低后会再次拉高40~80us

{

retry ++;

DelayUs(1);

}

if(retry >= 100)

{

return 1;

}     

return 0;

}


uint8_t DHT11_ReadBit(void)  

{

  uint8_t retry = 0;

while(I_DHT_DAT && retry < 100)

{

retry ++;

DelayUs(1);

}

retry = 0;

while(!I_DHT_DAT && retry < 100)

{

retry ++;

DelayUs(1);

}

DelayUs(40);//等待40us

if(I_DHT_DAT)

{

return 1;

}

else 

{

return 0;

}

}



uint8_t DHT11_ReadByte(void)    

{        

    uint8_t i,dat;

    dat = 0;

for (i = 0; i < 8; i ++) 

{

    dat <<= 1; 

    dat |= DHT11_ReadBit();

    }     

    return dat;

}


//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)    

{        

  uint8_t buf[5];

uint8_t i;

DHT11_Reset();

if(DHT11_IsOnline() == 0)

{

for(i = 0; i < 5; i ++)//读取40位数据

{

buf[i] = DHT11_ReadByte();

}

if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])

{

*humi = buf[0];

*temp = buf[2];

}

}

else 

{

return 1;

}

return 0;     

}

 

void DHT11Configuration(void)

{  

  GPIO_InitTypeDef  MyGPIO;

 

  RCC_APB2PeriphClockCmd(DHTCLKLINE, ENABLE);  

  MyGPIO.GPIO_Pin = DHT_DAT_Pin;  

  MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;  

  MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(DHTPORT, &MyGPIO);  

O_DHT_DAT = 1;

    

DHT11_Reset();  //复位DHT11



关键字:DHT11  驱动  STM32

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式