STM32 DTH11温湿度模块读写代码

2019-08-14来源: eefocus关键字:STM32  DTH11  温湿度模块  读写代码

dth11.c


    #include "dth11.h"

    /*

    DTH11 ---->PG9

    */

     void DHT11_Init(void)

     {

             GPIO_InitTypeDef     GFIO_InitStruct;

             //开始GPIOG时钟

             RCC_AHB1PeriphClockCmd(RCC_AHBPeriph_GPIOG, ENABLE);

             //配置以及初始化GPIO模式

             GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_out;  //输出

             GPIO_InitStruct.GPIO_OType =GPIO_OType_PP;  //推挽

             GPIO_InitStruct. GPIO_Pin  =GPIO_Pin_9;    //引脚

             GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP; //上拉

             GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;    

             

             GPIO_Init(GPIOG,&GPIO_InitStruct);

   }


     void DHT11_Modeout(void)

     {

             GPIO_InitTypeDef     GFIO_InitStruct;

             //开始GPIOG时钟

             RCC_AHB1PeriphClockCmd(RCC_AHBPeriph_GPIOG, ENABLE);

             //配置以及初始化GPIO模式

             GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_out;  //输出

             GPIO_InitStruct.GPIO_OType =GPIO_OType_PP;  //推挽

             GPIO_InitStruct. GPIO_Pin  =GPIO_Pin_9;    //引脚

             GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP; //上拉

             GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;    

             

             GPIO_Init(GPIOG,&GPIO_InitStruct);

   }

    void DHT11_ModeIn(void)

  {

GPIO_InitTypeDef  GPIO_InitStruct;

//配置为输出模式,DTH11链接STM32只有一根线,采用的是单总线模式,所以要同时定义输入输出模式

GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN; //输出

GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_9; //引脚

GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉­

GPIO_Init(GPIOG, &GPIO_InitStruct);

   }

   

     uint8_t    DTH11_ReadByte(void)

      {

                uint8_t data =0;

                uint8_t   i;

            

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

              {

                  while(  DTH11_IN()  == 0 );

                   if( DTH11_IN() ==1)

                   {

                          date |= 0x1 <<(7-i);

                    }else{

                     data &=~(0x1<<(7-i));

                    }

                   while(DTH11_IN() == 1);

              }

       }

         return data;

    }


int DHT11_ReadData(uint8_t DataBuf[])

{

int ret = -1;

uint8_t cnt = 0;

DHT11_ModeOut();            

DHT11_DQ(1);

delay_us(30);

DHT11_DQ(0);

delay_ms(20);   

DHT11_DQ(1);

delay_us(30);

DHT11_ModeIn();

while( DHT11_IN() == 0 )

{

delay_us(1);

cnt++;

if(cnt > 100)

ret = -1;

}

cnt = 0;

while( DHT11_IN() == 1 )

{

delay_us(1);

cnt++;

if(cnt > 100)

ret = -1;

}

for(cnt=0;cnt<5;cnt++)

{

DataBuf[cnt] = DHT11_ReadByte();

}

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

{

ret = 0;   

}

delay_s(1);   

delay_ms(300);   

return ret;

}


dth11.h

     #ifndef  _DTH11_H

#define _DTH11_H

 

#inlcude "stm32f4xx.h"

#include "systick.h"

#define DTH11_DQ(a);     if(a)

                                              GPIO_Setbit(GPIOG,GPIO_Pin_9);

                                             else

                                             GPIO_ResetBits(GPIOG, GPIO_Pin_9);

     #define DTH11_IN()    GPIO_ReadInputDateBit(GPIOG,  GPIO_Pin_9);  //此函数是读取PG9的电平

void DTH11_Init(void);

int DTH11_ReadData(uint8_t  DataBuff[]);

#endif


关键字:STM32  DTH11  温湿度模块  读写代码

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471065.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32之SHT30温湿度传感器驱动代码
下一篇:STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f103在使用定时器1重映射引脚输出PWM

在使用stm32f103ZGT6单片机输出PWM时候,各种配置都不能正确输出,后来查看手册,PE11该引脚对应的确实是定时器1的通道2,但是属于该引脚的重映射功能,遇到这种情况,需要多加一条语句。RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 ,ENABLE);      //TIM1时钟使能    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM1
发表于 2019-08-21
stm32f103在使用定时器1重映射引脚输出PWM

STM32F10x TIM1 CH3/CH4 的重映射PWM输出

TIMx在ARR上的预装载寄存器  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能,高级定时器必须开启这个  TIM_Cmd(TIM1, ENABLE);  //使能TIM1  }    .H文件#ifndef __TIMER_H#define __TIMER_H#include "stm32f10x.h"  void TIM1_PWM_Init(u16 arr,u16 psc); #endif2.应用版源码   
发表于 2019-08-21

stm32 TIM1PWM多通道捕获模式测速

因为一个项目的要求,需要测速,之前就想学一下stm32的捕获模式了,借这个机会,刚好利用一下,现在分享出来。硬件:MCU:stm32f103zet6平台:航太电子流行7号智能小车显示:mini12864软件:语言:C语言IDE:keil5测速部分环境是典型的测速方法,测速码盘加光电对管,单片机采集光电对管模块传来的PWM波,要对两个轮子测速,实际速度取俩轮的较大值。软件上采用了TIM1的捕获模式,使用了通道CH1和CH4,分别对应PA8和PA11,先看下官方对输入捕获模式的描述:在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当发生捕获事件时,相应的CCxIF标志
发表于 2019-08-21

STM32F103ZET定时器TIM1输出六路带死区互补PWM波形

TIM_OCInitStructure;     GPIO_InitTypeDef GPIO_InitStructure;     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;     TIM_BDTRInitTypeDef TIM_BDTRInitStructure;       NVIC_InitTypeDef NVIC_InitStructure;         RCC_APB2PeriphClockCmd
发表于 2019-08-21

STM32的TIM1互补PWM输出

芯片为STM32F412VETx,使用的是高级定时器TIM1的PWM互补PWM输出,看一下STM32CubeMX配置,再看时钟的配置,TIM1用的是APB2的时钟,。再看引脚的配置产生的PWM频率为:Fpwm = 96MHz / ((95+1)(9999+1)) =100Hz,占空比为50%然后生成代码,看下代码中的FMX_TIM1_Init函数初始化/* TIM1 init function */static void FMX_TIM1_Init(void){   TIM_ClockConfigTypeDef sClockSourceConfig;  TIM_Mast
发表于 2019-08-21
STM32的TIM1互补PWM输出

STM32高级定时器TIM1、TIM15输出PWM

配置GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_1);该函数配置对应GPIO引脚的功能,具体的引脚功能参数GPIO_AF_x 找对应的芯片数据手册 查看下图为STM32F051C8T6相关引脚功能与其他普通定时器不同的是 特别注意TIM1、TIM15的BDTR寄存器 需要将MOD置位(寄存器第15位) 才能输出PWMTIM1->BDTR|=1<<15;TIM15->BDTR|=1<<15;
发表于 2019-08-21
STM32高级定时器TIM1、TIM15输出PWM

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved