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];
}

STM32—驱动DHT11数字温湿度传感器的更多相关文章

  1. DH11数字温湿度传感器

    DH11数字温湿度传感器是一种集温度.湿度一体的复合传感器,它能把温度和湿度物理量通过温.湿度敏感元件和相应电路转化成方便计算机.PLC.智能仪表等数据采集设备直接读取的数字量.DHT11由电阻式感湿 ...

  2. 数字温湿度传感器DHT11--操作源代码

    //IO定义 #define P_DataIN_DHT11 PB0_IN #define P_DataOUT_DHT11 PB0_OUT //宏定义 #define BSET_DHT11 P_Data ...

  3. STM32驱动DHT11温湿度传感器

    DHT11 是一款湿温度一体化的数字传感器.该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接.通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温 ...

  4. STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

    1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...

  5. 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...

  6. Arduino和C51开发DHT11温湿度传感器

    技术:51单片机.Arduino.DHT11.温湿度传感器.传感器   概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...

  7. 温湿度传感器DHT11程序示例

    DHT11概述 HT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器. 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性.传感器包括一个电阻式 ...

  8. 四博智慧物联系统入门示例-1.增加一个DHT11温湿度传感器

    1.准备工作 DOIT农业控制开发板或者esp32模组,并下载 四博智慧物联系统快速入门-2.准备工作 章节中的固件 DHT11连接在端口01 使用快速入门注册的管理账号和用户 2.配置网络 3.绑定 ...

  9. Arduino I2C + 温湿度传感器AM2321

    (2015.5.17:本日志的内容有所更新,参见<使用Arduino Wire Library读取温湿度传感器AM2321>.) AM2321是广州奥松电子生产的数字式温湿度传感器.虽是国 ...

随机推荐

  1. Android java层常见加密算法的hook自吐以及栈信息的打印

    杂谈:其实原理并没有很难,本质就是hook Android的框架层中的api将我们想要的key和iv(也可以没有,就打个比方),但是目前的话,很多厂家已经不在直接调用java层的这些加密算法的api了 ...

  2. 第一个用户进程 - Android 的 Init 进程

    本文尝试对着 <深入理解 Android 5.0 系统>来对 android 9.0 的启动代码进行分析,但是分析过程中发现自己缺乏操作系统方面的知识,以致于只能做一些简单分析.最近也买了 ...

  3. ADB命令 连接WIFI检测序列号

    利用ADB 电脑与手机相连 查看序列号: adb shell  getprop ro.serialno 查看机器的SN号 adb shell getprop 查看机器的全部信息参数 查看IP地址: a ...

  4. 家庭账本开发day02

    今日完成 今天主要进行了前台界面的构架,利用layUI已有的模板编写新增账单界面 然后进行了后端的Bean和Servlet的初步编写,实现数据库的构建. 遇到问题 获取前端传输数据,并添加数据到数据库 ...

  5. [刘阳Java]_精选20道Java多线程面试题

    1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器时间让给其它任务 (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务 (4) ...

  6. Scala学习——基础入门

    基础语法 1)注意点 1)区分大小写 -  Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 2)类名 - 对于所有的类名的第一个字母要大写. 3)方法名 ...

  7. python基础之操作数据库(pymysql)操作

    import pymysqlimport datetime#安装 pip install pymysql"""1.连接本地数据库2.建立游标3.创建表4.插入表数据.查询 ...

  8. 记一次 .NET 某云采购平台API 挂死分析

    一:背景 1. 讲故事 大概有两个月没写博客了,关注我的朋友应该知道我最近都把精力花在了星球,这两个月时间也陆陆续续的有朋友求助如何分析dump,有些朋友太客气了,给了大大的红包,哈哈,手里面也攒了1 ...

  9. P6295 有标号 DAG 计数

    P6295 有标号 DAG 计数 题意 求 \(n\) 个点有标号弱联通 DAG 数量. 推导 设 \(f_i\) 表示 \(i\) 个点有标号 DAG 数量(不保证弱联通),有: \[f(i)=\s ...

  10. java String转List<Device>集合

    // 从Redis中获得正常设备的数量 String success = redisService.get(RedisKey.CULTIVATION_RECORD_SUCCESS); //建立一个li ...