历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2019年08月14日 | STM32-DHT11(温湿度传感器)之学习笔记

2019-08-14 来源:eefocus

一、模块分析:

原理图和引脚连接图:

在这里插入图片描述

由图可知DHT11(温湿度模块)是单总线的连接,数据的输入输出由一根线完成,DQ网络标号对应的引脚是PG9就是GPIO外设接口G组的第九个引脚。


二、DHT11时序图:


在这里插入图片描述在这里插入图片描述

由上图可以判断当主机开始信号发送之后手袋DHT11响应信号并开始接受数据时,我们可以通过判断高电平的维持时间来获取当前接受的数据位是0/1这样就可以把数据保存下来。判断的依据是开始接受数据前延时超过26-28us,当延时过后检测到的还是高电平(高电平持续70us为数据1)那就证明该数据位为‘1’。因为每一个比特位传输完成之后会有50us的延迟所以当比特位为0时前面已经延时超过高电平时间所以比特位为0时,检测到的是低电平,由此来保存温湿度数据。


三、部分关键代码:

#include “dht11.h”

//单数据总线接口 —>PG9

void DHT11_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

//1:第一步永远是打开时钟,查看固件库

RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOG, ENABLE );


//对结构体成员进行赋值(输出 推挽   上拉  50MHZ)

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//输出模式

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;


//2:对GPIOG进行初始化

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_Init( GPIOG ,&GPIO_InitStructure);


}


/*=2-配置GPIO口的输入模式函数=========*/

static void DHT11_Mode_IN(void)

{

GPIO_InitTypeDef GPIO_InitStruct;


//浮空输入

GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_9;

GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN;

GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;   

GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_NOPULL;   //浮空输入 

GPIO_Init(GPIOG,&GPIO_InitStruct);


}


/*=2-配置GPIO口的输出模式函数=========*/

static void DHT11_Mode_OUT(void)

{

GPIO_InitTypeDef GPIO_InitStruct;


//上拉推挽输出

GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_9;

GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;

GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;

GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;   

GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_UP;

GPIO_Init(GPIOG,&GPIO_InitStruct);


}


/3-配置8位接收数据函数,根据DHT11数据传输时序图编写=/

//数据是高位先出

static uint8_t Read_Byte(void)

{

uint8_t i,temp=0;


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

{

    //数据准备输出  每个数据都有50US的低电平,然后判断后面高电平是时长来决定是1还是0

    //0:高电平时长26~28us

    //1:高电平时长70us   

    /*每一个bit都是以50us的低电平开始,等电平置高,则跳出循环*/

    while( DQ_IN() == 0 );


    /*‘0’表示的置高时间过短,可直接判断‘1’表示的时间,但滞留时间不宜过长,以防跳出下一位的开始时间*/

    delay_us(40);

    

    if( DQ_IN() == 1 )//如果还是高电平,那就是数据1

    {

        /*等待跳出‘1’置高表示的时间*///等待剩余的高电平时间结束

        while( DQ_IN() == 1);

        /*把第(7-i)位置 '1'*/

        temp |= (uint8_t)(0x01<<(7-i));  

    }

    else

    {

        /*把第(7-i)位置 '0'*/

        temp &= (uint8_t)~(0x01<<(7-i));

    }

}

return temp;



}


/*

*功 能:获取温湿度值

*参 数:保存温度读数据的结构体指针

返回值:成功返回1 失败返回0

*

/

/4-根据总时序图编写接收数据函数=/

uint32_t DHT11_GET_TEMP_HUM(DHT11_Data_TypeDef * DHT11_Data)

{

uint16_t count = 0;


DHT11_Mode_OUT();//输出模式

DQ_OUT(0);       /*将主机拉低*/

delay_ms(20);/*配置主机拉低时间,至少拉低18ms*/

DQ_OUT(1);/*将主机拉高*/   

delay_us(30);


DHT11_Mode_IN();//输入模式    

if( DQ_IN() == 0) 

{    

    //printf("开始获取数据rn");

    //因为在空闲状态下,管教是高电平,所以这个时候如果是低电平,则模块有响应

    //等待拉高  时长80us

    while(DQ_IN() == 0)//等待80us结束

    {

        count++;

        if(count > 1000)

               return 0;

        delay_us(1);//每1us检测一次是否拉高

    }  

    //printf("80us lowrn");

    count = 0;

    

    //等待拉高  时长80us

    while( DQ_IN()== 1)//等待80us结束

    {

        count++;

        if(count > 1000)

               return 0;

        delay_us(1);//每1us检测一次是否拉高

    }

   // printf("80us hightrn");

    

    // 获取5个字节数据 

    //分析40位数据,8Bit湿度整数   +8Bit湿度小数   +8Bit温度整数    +8Bit温度小数

    DHT11_Data->humi_int  = Read_Byte();

    DHT11_Data->humi_deci = Read_Byte();

    DHT11_Data->temp_int  = Read_Byte();

    DHT11_Data->temp_deci = Read_Byte();

    DHT11_Data->check_sum = Read_Byte();

   // printf("get data successrn");

    

/*读取结束,将主机设为输出模式*/

 DHT11_Mode_OUT();//输出模式

 DQ_OUT(1);/*将主机拉高,方便下次读取数据*/

    

if(DHT11_Data->check_sum == (DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int + DHT11_Data->temp_deci))                   

{    

    printf("校验和正常rn");

    return 1;

}

else

{

     printf("校验和失败rn");

     return 0;

}


}

else

return 0;


}


推荐阅读

史海拾趣

EUPEC [eupec GmbH]公司的发展小趣事

面对未来市场的机遇和挑战,EUPEC制定了明确的发展战略。公司将继续加大技术创新和研发投入力度,推动电力半导体技术的进步和应用拓展。同时,EUPEC还将加强与国际知名企业的合作与交流,不断提升自身的竞争力和影响力。在应对市场变化和挑战的过程中,EUPEC将始终坚持以客户为中心的理念,为客户提供更优质的产品和服务。

请注意,以上故事是基于EUPEC公司的发展历程和相关信息进行概括和编写的,并非完全基于事实的直接叙述。如需更详细和准确的信息,请参考相关官方资料或新闻报道。

HARTING公司的发展小趣事

EUPEC一直致力于技术创新和研发,不断推动电力半导体技术的进步。在多个关键领域,EUPEC都取得了重要的技术突破,如提高电力转换效率、降低能耗等。这些技术突破不仅提升了EUPEC产品的竞争力,也为客户带来了实实在在的经济效益。同时,EUPEC还积极拓展国际市场,产品广泛应用于电解铝、高压直流输电、软启动、直流传动、高压无功补偿设备等领域。

EBK Kruger GmbH & Co KG公司的发展小趣事

为了提升产品质量和满足客户需求,EBK Kruger开始建立严格的质量管理体系。公司引进了国际先进的生产设备和检测设备,并对员工进行了系统的质量培训。通过不懈的努力,EBK Kruger的产品质量得到了显著提升,赢得了客户的广泛赞誉。同时,公司还获得了多项国际质量认证,进一步提升了品牌形象。

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

近年来,随着新能源市场的蓬勃发展,CDE公司敏锐地抓住了这一机遇。公司积极参与军事和能源应用的高压直流链路电容器市场,并成功推出了针对EV快速充电的高压直流链路电容器。这一产品的推出不仅满足了市场对高效、可靠电容器的需求,也为CDE在新能源领域的发展奠定了坚实基础。

Hisetec Electronic Co Ltd公司的发展小趣事

背景:进入数字化时代,企业面临着前所未有的挑战和机遇。Hisetec Electronic Co Ltd公司深知数字化转型的重要性,开始积极探索数字化转型之路。

发展:公司引入了先进的智能制造系统和大数据分析技术,实现了生产过程的智能化和精细化管理。同时,公司还建立了数字化营销平台,通过精准营销和个性化服务提升客户满意度。数字化转型的成功实施,使Hisetec公司在激烈的市场竞争中保持了领先地位。

HN Electronic Components GmbH & Co Kg公司的发展小趣事

背景:HN Electronics成立于20世纪90年代初,正值全球电子市场快速崛起的时期。公司由一群在半导体领域拥有丰富经验的工程师创立,他们看到了智能手机和消费电子产品市场的巨大潜力。

发展:初期,HN Electronics专注于研发高性能的电源管理芯片,通过技术创新解决了当时市场上存在的能效低、发热量大等问题。公司迅速获得了业界的认可,并与几家知名手机制造商建立了合作关系。

关键事件:1995年,HN Electronics成功推出其首款自主研发的电源管理芯片,该产品迅速成为市场热销产品,为公司赢得了第一桶金。

问答坊 | AI 解惑

解析节气门引发的故障

一辆上海大众POL01.4L轿车,因EPC灯时亮时灭来站维修。连接故障诊断仪车博仕A-2600查询故障,发现有一偶发故障。故障码为17550,loaddetermination,levelnotreached。中文解释为:“未达到测定负荷水平值”,说明发动机没有达到指定的扭矩(扭矩传 ...…

查看全部问答>

Cyclone III FPGA 数据手册

This chapter describes the electric characteristics, switching characteristics, and I/O timing for Cyclone® III devices. A glossary is also included for your reference.…

查看全部问答>

求助:ip和网关不同网段问题

开发中遇到这样的问题: 设备所处的网络比较特殊,网关和ip不在同一网段。 比如ip:192.168.0.2     mask:255.255.255.0     gateway 192.0.0.1 我设置完ip后再去设置网关无法设置成功:调用函数如下所示:     ...…

查看全部问答>

AMD和英特尔的处理器那个好啊

现在来比的话,AMD和英特尔的处理器那个好啊…

查看全部问答>

自己写的johnson计数器出问题了

代码如下: module johnson (clk,rst_n,sw1,sw2,sw3,led); input clk,rst_n; input sw1,sw2,sw3; output [3:0] led; reg [3:0] led; //----------------------------------------- reg[23:0] cnt1; always @(p ...…

查看全部问答>

2812 flash烧写问题,Flash API Error #31

2812烧写的问题,昨天还烧写正常,今天就出现以下的错误: Flash API Error #31: There was a Zero Bit Error on the Program Operation. First Fail Address = 0x003d7801 Expected Data = 0x64a4 Actual Data = 0x653e 但是flash可以擦除, ...…

查看全部问答>

求一篇关于单片机的英文期刊

大四快毕业了,学校要求翻译英文期刊,字数3000左右。在网上找很久都没找到,有没有哪位大哥有电子版的关于单片机的英文期刊啊 ,要有期刊的出处,有点大哥请发到1301152618@qq.com,万分感谢!…

查看全部问答>

关于I2C控制器

高手们,我刚学fpga没多久,有个问题现在要请教大家 多字节的I2C控制器怎么写?最好是verilog hdl  …

查看全部问答>

DCDC预稳压数控电源

木做过电源的也来凑凑热闹,欢迎大家拍砖。…

查看全部问答>

MSP430程序库<九>数码管显示

数码管也是单片机系统最常用的输出设备之一(还有液晶、发光二极管等)。七段(这里用的是8段,有小数点)数码管可以完成显示0-9数字和一部分的英文字符如:A、b。本文实现的程序完成显示数字和可显示的英文字符;同时完成数码管显示的printf函数的移植 ...…

查看全部问答>