你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的数字温湿度传感器之驱动DHT11

[复制链接]
攻城狮Melo 发布时间:2023-3-18 14:22
DHT11模块简介
DHT11数字温湿度传感器,用来测量环境的温度和湿度,而且传输的数据是数字信号,这与DS18B20传输的模拟采集的数据不一样,相比DS18B20而言DHT11的数据采集的处理更加精确,而且驱动也更加方便。
DHT11传感器包括一个电阻式测湿元件和一个NTC测温元件,而且传感器中嵌入一个8位单片机。传感元件测量到数据后经过内嵌MCU处理后,能够直接输出处理好的数据。
DHT11与单片机之间采用单总线通信,只需要初始化一个I/O口即可实现温湿度的实时测量。
其相关参数如下:

201911241037112.png

DHT11数据传输

DHT11数据传输是单总线通信方式,即通过一个IO口完成数据的双向输入输出,DHT11每一次向单片机传输数据是传输40Bit的数据包,40Bit的数据包中包含如下内容:
(32-39)湿度的整数部分
(24-31)湿度的小数部分
(16-23)温度的整数部分
(8-15)温度的小数部分
(0-7)数据校验部分,前四部分的和
例如:

2019112410431168.png

湿度为:45.0
温度为:28.0
校验为:73=45+28(数据正确)


DHT11通信时序

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

总的时序图如示:

20191124105804147.png

第一步:发送复位信号,此时引脚应模式为推挽输出。拉低数据线,持续t1(至少18ms)时间;然后拉高数据线,持续t2(20~40us)时间。
第二步:读取相应,此时引脚应模式为浮空输入。DHT11会先拉低数据线,持续t3(40~50us)时间,作为相应信号;然后DHT11拉高数据线,持续t4(40 ~50us)时间,开始传输数据包。
第三步:传输数据包。传输“1”时,12 ~14us低电平+116 ~118us高电平;传输“0”时,12 ~14us低电平+26 ~28us高电平。

20191124110636317.png


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


代码实现
驱动代码主要实现如下几个模块:
相关引脚初始化
复位模块
判断响应模块
读取数据包模块
显示模块

相关引脚初始化
由于是一个IO口,要满足输出和检测电平,所以我写了俩个函数来切换引脚的模式,可以使引脚在推挽输出和浮空输入之间切换:
  1. /* 相关引脚的配置,DHT是单通道通信,所以一个引脚就够了 */
  2. void DHT_GPIO_Config_Output( void )
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStruct;       
  5.        
  6.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  7.         GPIO_InitStruct.GPIO_Pin = DHT_PIN;
  8.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  9.         GPIO_Init(DHT_PORT, &GPIO_InitStruct);
  10. }

  11. /* 同一个引脚 要在输入和输出的时候进行切换引脚模式 */
  12. void DHT_GPIO_Config_Input( void )
  13. {
  14.         GPIO_InitTypeDef GPIO_InitStruct;
  15.        
  16.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  17.         GPIO_InitStruct.GPIO_Pin = DHT_PIN;
  18.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_Init(DHT_PORT, &GPIO_InitStruct);
  20. }
复制代码

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

复位模块
  1. void DHT11_Rst( void )
  2. {
  3.         DHT_GPIO_Config_Output();
  4.         DHT11_L;
  5.         Delay_ms( 20 );
  6.         DHT11_H;
  7.         Delay_us( 30 );
  8. }
复制代码

判断响应模块
  1. uint8_t DHT11_Check( void )
  2. {
  3.         uint8_t t;
  4.         /* 浮空输入,判断引脚输入电平 */
  5.         DHT_GPIO_Config_Input();
  6.         while( DHT11_Value_L && t<100 )
  7.         {
  8.                 t++;
  9.                 Delay_us(1);
  10.         }
  11.         if( t>100 ) return 1;
  12.         t=0;
  13.         while( DHT11_Value_H && t<100 )
  14.         {
  15.                 t++;
  16.                 Delay_us(1);
  17.         }
  18.         if( t>100 ) return 1;
  19.         return 0;
  20. }
复制代码

读取数据包模块
  1. void DHT11_Read_Data( uint8_t *temp, uint8_t *humi )
  2. {
  3.         uint8_t i,t;
  4.         uint9_t data[5];
  5.         DHT_GPIO_Config_Input();
  6.         /* 执行40次读取位数据,data指向数据包 */
  7.         for( i=0;i<40;i++ )
  8.         {
  9.                 /* 开始低电平 */
  10.                 while( DHT11_Value_L && t<100 )
  11.                 {
  12.                         t++;
  13.                         Delay_us(1);
  14.                 }
  15.                 t=0;
  16.                 /* 开始高电平 */
  17.                 while( DHT11_Value_H && t<100 )
  18.                 {
  19.                         t++;
  20.                         Delay_us(1);
  21.                 }
  22.                 Delay_us(40);
  23.                 /* 判断高电平持续时间 */
  24.                 if( DHT11_Value_H )
  25.                 {
  26.                         data[i/8] |= 0x01;
  27.                         data[i/8] = data[i/8]<<(i%8);
  28.                 }
  29.                 else
  30.                         data[i/8] = data[i/8]<<(i%8);
  31.                        
  32.         }
  33.         /* 将数据地址传出去 */
  34.         *humi = data[0];
  35.         *temp = data[2];
  36. }
复制代码

只是大体总结了一下,有不足之处还望各位朋友指出
————————————————
版权声明:Aspirant-GQ
如有侵权请联系删除



收藏 评论0 发布时间:2023-3-18 14:22

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版