历史上的今天
返回首页

历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2021年09月01日 | STM32—驱动DHT11数字温湿度传感器

2021-09-01 来源:eefocus

DHT11模块简介

DHT11数字温湿度传感器,用来测量环境的温度和湿度,而且传输的数据是数字信号,这与DS18B20传输的模拟采集的数据不一样,相比DS18B20而言DHT11的数据采集的处理更加精确,而且驱动也更加方便。


DHT11传感器包括一个电阻式测湿元件和一个NTC测温元件,而且传感器中嵌入一个8位单片机。传感元件测量到数据后经过内嵌MCU处理后,能够直接输出处理好的数据。

DHT11与单片机之间采用单总线通信,只需要初始化一个I/O口即可实现温湿度的实时测量。


其相关参数如下:

在这里插入图片描述

DHT11数据传输

DHT11数据传输是单总线通信方式,即通过一个IO口完成数据的双向输入输出,DHT11每一次向单片机传输数据是传输40Bit的数据包,40Bit的数据包中包含如下内容:


(32-39)湿度的整数部分

(24-31)湿度的小数部分

(16-23)温度的整数部分

(8-15)温度的小数部分

(0-7)数据校验部分,前四部分的和

例如:

在这里插入图片描述

湿度为:45.0

温度为:28.0

校验为:73=45+28(数据正确)


DHT11通信时序

由于DHT11和单片机是单总线通信的,所以数据的双向传输就依靠严格的时序规定了,DHT11和单片机通信的时序有三部分:


单片机向DHT11发送复位信号

DHT11响应单片机的信号

DHT11向单片机传输数据包

总的时序图如示:

在这里插入图片描述

第一步:发送复位信号,此时引脚应模式为推挽输出。拉低数据线,持续t1(至少18ms)时间;然后拉高数据线,持续t2(20~40us)时间。


第二步:读取相应,此时引脚应模式为浮空输入。DHT11会先拉低数据线,持续t3(40~50us)时间,作为相应信号;然后DHT11拉高数据线,持续t4(40 ~50us)时间,开始传输数据包。


第三步:传输数据包。传输“1”时,12 ~14us低电平+116 ~118us高电平;传输“0”时,12 ~14us低电平+26 ~28us高电平。

在这里插入图片描述

这三步就完成了一次完整的数据传输,然后就单片机是对接收到的数据包进行处理显示就好了。


代码实现

驱动代码主要实现如下几个模块:


相关引脚初始化

复位模块

判断响应模块

读取数据包模块

显示模块

相关引脚初始化

由于是一个IO口,要满足输出和检测电平,所以我写了俩个函数来切换引脚的模式,可以使引脚在推挽输出和浮空输入之间切换:


/* 相关引脚的配置,DHT是单通道通信,所以一个引脚就够了 */

void DHT_GPIO_Config_Output( void )

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStruct.GPIO_Pin = DHT_PIN;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(DHT_PORT, &GPIO_InitStruct);

}


/* 同一个引脚 要在输入和输出的时候进行切换引脚模式 */

void DHT_GPIO_Config_Input( void )

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStruct.GPIO_Pin = DHT_PIN;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(DHT_PORT, &GPIO_InitStruct);

}


在初始化的时候会开启时钟,所以这俩个模块就不用开启时钟


复位模块

void DHT11_Rst( void )

{

DHT_GPIO_Config_Output();

DHT11_L;

Delay_ms( 20 );

DHT11_H;

Delay_us( 30 );

}


判断响应模块

uint8_t DHT11_Check( void )

{

uint8_t t;

/* 浮空输入,判断引脚输入电平 */

DHT_GPIO_Config_Input();

while( DHT11_Value_L && t<100 )

{

t++;

Delay_us(1);

}

if( t>100 ) return 1;

t=0;

while( DHT11_Value_H && t<100 )

{

t++;

Delay_us(1);

}

if( t>100 ) return 1;

return 0;

}


读取数据包模块

void DHT11_Read_Data( uint8_t *temp, uint8_t *humi )

{

uint8_t i,t;

uint9_t data[5];

DHT_GPIO_Config_Input();

/* 执行40次读取位数据,data指向数据包 */

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

{

/* 开始低电平 */

while( DHT11_Value_L && t<100 )

{

t++;

Delay_us(1);

}

t=0;

/* 开始高电平 */

while( DHT11_Value_H && t<100 )

{

t++;

Delay_us(1);

}

Delay_us(40);

/* 判断高电平持续时间 */

if( DHT11_Value_H )

{

data[i/8] |= 0x01;

data[i/8] = data[i/8]<<(i%8);

}

else

data[i/8] = data[i/8]<<(i%8);

}

/* 将数据地址传出去 */

*humi = data[0];

*temp = data[2];

}

推荐阅读

史海拾趣

AIM - American Iron and Metal公司的发展小趣事

为了进一步提升竞争力,AIM开始着手整合电子行业的上下游产业链。公司通过收购、合资等方式,与多家供应商和合作伙伴建立了紧密的合作关系。这种整合不仅降低了生产成本,还提高了产品的质量和交付速度,使AIM在激烈的市场竞争中保持领先地位。

汇顶科技(GOODiX)公司的发展小趣事

随着国内市场的饱和,AIM开始寻求海外市场的拓展。公司制定了详细的国际化战略,通过参加国际展览、建立海外销售渠道等方式,逐步打开了欧美、东南亚等地区的市场。AIM的产品质量和技术水平得到了国际客户的认可,出口额逐年攀升。

Custom Connector Corporation公司的发展小趣事

随着电子行业的不断发展,CCC始终将技术创新作为公司发展的核心驱动力。公司投入大量研发资金,引进先进技术和设备,不断提升产品的性能和品质。同时,CCC还积极与高校、科研机构合作,共同研发具有自主知识产权的新产品。这些创新成果不仅为CCC赢得了市场的认可,也推动了整个电子连接器行业的技术进步。

华瓷(Chinocera)公司的发展小趣事

在追求经济效益的同时,华瓷始终注重环保和可持续发展。公司投入大量资金用于研发环保型陶瓷材料和生产工艺,致力于减少生产过程中的能源消耗和废弃物排放。同时,华瓷还积极参与社会公益事业,为保护环境、促进可持续发展贡献自己的力量。

Galaxy Microelectronics公司的发展小趣事

飞翼科技(FEIYI)在多个领域的发展均体现了其创新驱动的发展战略。无论是无人机技术的智能化应用,还是绿色矿山技术的创新突破,亦或是电容式触摸感应芯片的市场领先,都离不开公司对技术创新的不断追求。飞翼科技积极与高校、研究机构及行业专家开展合作,集聚顶尖科技人才,共同推动技术进步和产业升级。同时,公司还注重知识产权保护,拥有国家专利技术300余项,为企业的持续发展提供了有力保障。通过这些努力,飞翼科技在电子行业中不断崛起,成为行业内的佼佼者。

All Sensors公司的发展小趣事

All Sensors公司的创始人Dennis被誉为美国硅谷的传奇人物。在70年代,Dennis在硅谷成功发明了全球第一颗压力传感器,这一创新不仅奠定了All Sensors在传感器领域的领先地位,也为整个电子行业带来了新的技术革命。这颗传感器的诞生,标志着All Sensors正式踏上了传感器技术的研发之路,为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

lm741的资料

本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 rt  …

查看全部问答>

两款直流开关电源设计分析

简易型直流开关电源     由TEA1520系列构成的简易型直流开关电源电路如图1所示。                   图1由TEA1520系列构成简易型直流开关电源的电路     为防止 ...…

查看全部问答>

硬件工程师的设计之路

难得休息两天,回到工作,第一件事情是给媳妇帮忙翻译论文,而手头上的事情虽然充满着挑战,当总体还是应付的过来。由于很长一段的时间都是直接给国外做支持工作,对比国内项目的管理,让我生出了一种感受,同样的方法,同样的流程,到了我们这里一 ...…

查看全部问答>

IA4421无线模块的问题

#include        \"reg52.h\" #include    \"uart.h\" sbit                sdi=        P1^4; sbit            &n ...…

查看全部问答>

在dll里用了这个代码,g_hInst,videownd是从外部传过来的. IDD_CAMERA_DIALOG是dll里的资源,这样为什么不行?如果把IDD_

在dll里用了这个代码,g_hInst,videownd是从外部传过来的.  IDD_CAMERA_DIALOG是dll里的资源,这样为什么不行?如果把IDD_CAMERA_DIALOG也从外部传进来就可以.DialogBoxParam(g_hInst, MAKEINTRESOURCE( IDD_CAMERA_DIALOG ),videownd, (DLG ...…

查看全部问答>

程序列表

  最近想做一个程序列表,就是显示当前正在运行的所有应用程序列表(不是进程),但不知道怎么获取,有没有直接获取的?进程我知道怎么获取。   谢谢大家提供信息。…

查看全部问答>

如何降低嵌入式设备中的电视卡的工作能耗?

一个装有Linux的嵌入式设备,要减少其电视卡的功耗该如何处理啊?(电视卡为mini pci接口) 我的想法有: 1. 让系统待机。但是不知道让系统待机的话,该电视卡是否还在继续接收电视信号? 2. 关闭电视卡的接收端口,但不知怎么写啊,那位大虾推 ...…

查看全部问答>

STM32F103的USB/CAN怎么共用?(电路设计问题)

请问一下STM32的USB/CAN口在不能remap的条件下,接口电路(CAN收发器/usb总线)能否实现两个应用并存但是不同时应用:指的是在用CAN时不用USB,在用USB时不用CAN,能否实现?需要注意什么? 补充一下:我测试了TJA1050的RX/TX脚有内部上拉也不知 ...…

查看全部问答>

电梯的RFID控制

本帖最后由 dontium 于 2015-1-23 13:18 编辑 RFID的与电梯的控制与运行是否有比较好的解决方案求高手支招 …

查看全部问答>

单片机设计电路应如何考虑

我是名初学者,只会一点编程,对于设计电路时就老是会遇到问题,比如再把74hc245接入电路时,就老是会想这个芯片的需要的 驱动电流多少,最大负载多少,看技术手册又看不懂,都是英文,而且那些参数标的我的是一头雾水,不知道那个才是我的那个答 ...…

查看全部问答>