历史上的今天

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

正在发生

2021年09月10日 | STM32驱动dht11温湿度传感器

发布者:gamma14 来源: eefocus关键字:STM32  驱动  dht11  温湿度传感器 手机看文章 扫描二维码
随时随地手机看文章

DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大电流 0.5mA。


DHT11 的技术参数如下:
  工作电压范围:3.3V -5.5V
  工作电流  :平均 0.5mA
  输出:单总线数字信号
  测量范围:湿度 20~90%RH,温度 0~50℃
  精度  :湿度±5%,温度±2℃

  分辨率  :湿度 1%,温度 1℃


DHT11有效总线包含三条,VCC GND DAT,看起来与DS18B20类似,但是简单很多,不需要设置命令,只需要读取数据包就可以了,每次读取数据一共读取40个BIT也就是五个字节,高位在前MSB五个字节分别是:  8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据   +8bit校验和 


读写时序如下

首先主机发送开始信号,即:(最开始状态依然是高电平)拉低数据线,保持 t1 (至少 18ms)时间,然后拉高数据线 t2(20~40us)时间,(此时需要转换输入输出模式)然后读取 DHT11 的响应,正常的话, DHT11 会拉低数据线,保持 t3 (40~50us)时间,作为响应信号,然后 DHT11 拉高数据线,保持 t4(40~50us)时间后,开始输出数据


也就是说,每次需要复位,检查响应,才能开始读数据,数据的格式如下

由此我们可以看到,每个数据都是有一个12-14us的起始位开始,是0还是1需要我们监测之后的高电平时间长度,基本上我们可以认为高电平持续时间大于35us的基本就是1了

(注意不能等待这个电平超过40us)因为一次0的时间就是40us,等待太长会可能丢掉下一个数据的起始位(这里我们可以用等待点评延时计数的模式来判定时间,当电平为0,等待他为1,每等待一次计数1us,最后看高电平持续时间)


驱动代码如下所示

   #ifndef __DHT11_H
      #define __DHT11_H 
      #include "ioremap.h"   
      #include "delay.h"
      #include "uart.h"
      //IO方向设置
      #define DHT11_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
      #define DHT11_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
      IO操作函数											   
      #define	DHT11_DQ_OUT PGout(11) //数据端口 PG11 
      #define	DHT11_DQ_IN  PGin(11)  //数据端口 PG11
      u8 Dht11Init(void);       //初始化DHT11
      u8 Dht11ReadData(u8 *temp,u8 *humi);       //读取温湿度
      u8 Dht11ReadByte(void);       //读出一个字节
      u8 Dht11ReadBit(void);       //读出一个位
      u8 Dht11Check(void);       //检测是否存在DHT11
      void Dht11Rst(void);       //复位DHT11  
      void Dht11Show(void);#endif
      1

 

   #include "dht11.h"
      //复位DHT11
      void Dht11Rst(void)	   
      {DHT11_IO_OUT(); 	
       //SET OUTPUT
      DHT11_DQ_OUT=       0; 	
       //拉低DQ
      DelayMs(       20);    	
       //拉低至少18ms
      DHT11_DQ_OUT=       1; 	
       //DQ=1 
      DelayUs(       30);     	
       //主机拉高20~40us
      }//等待DHT11的回应
      //返回1:未检测到DHT11的存在
      //返回0:存在
      u8 Dht11Check(void) 	   
      {u8 retry=       0;DHT11_IO_IN();       //SET INPUT	 
      while (DHT11_DQ_IN&&retry<       100)       //DHT11会拉低40~80us
      {retry++;DelayUs(       1);};	 
      if(retry>=       100)       return 
       1;else retry=       0;while (!DHT11_DQ_IN&&retry<       100)       //DHT11拉低后会再次拉高40~80us
      {retry++;DelayUs(       1);};if(retry>=       100)       return 
       1;	    
      return 
       0;}//从DHT11读取一个位
      //返回值:1/0
      u8 Dht11ReadBit(void) 			 
      {u8 retry=       0;while(DHT11_DQ_IN&&retry<       100)       //等待变为低电平
      {retry++;DelayUs(       1);}retry=       0;while(!DHT11_DQ_IN&&retry<       100)       //等待变高电平
      {retry++;DelayUs(       1);}DelayUs(       40);       //等待40us
      if(DHT11_DQ_IN)       return 
       1;else 
       return 
       0;		   
      }//从DHT11读取一个字节
      //返回值:读到的数据
      u8 Dht11ReadByte(void)    
      {u8 i,dat;dat=       0;for (i=       0;i<       8;i++){dat<<=       1;dat|=Dht11ReadBit();}						    
      return dat;}//从DHT11读取一次数据
      //temp:温度值(范围:0~50°)
      //humi:湿度值(范围:20%~90%)
      //返回值:0,正常;1,读取失败
      u8 Dht11ReadData(u8 *temp,u8 *humi)    
      {u8 buf[       5];u8 i;Dht11Rst();if(Dht11Check()==       0){for(i=       0;i<       5;i++)       //读取40位数据
      {buf[i]=Dht11ReadByte();}if((buf[       0]+buf[       1]+buf[       2]+buf[       3])==buf[       4]){*humi=buf[       0];*temp=buf[       2];}}       else 
       return 
       1;return 
       0;	    
      }//初始化DHT11的IO口 DQ 同时检测DHT11的存在
      //返回1:不存在
      //返回0:存在    	 
      u8 Dht11Init(void)
      {RCC->APB2ENR|=       1<<       8;    
       //使能PORTG口时钟 
      GPIOG->CRH&=       0XFFFF0FFF;       //PORTG.11 推挽输出
      GPIOG->CRH|=       0X00003000;GPIOG->ODR|=       1<<       11;      
       //输出1
      Dht11Rst();return Dht11Check();}void Dht11Show(void)
      {
       	u8 temp,humi;	if(Dht11ReadData(&temp,&humi))
       	{		printf(       "DHT11 read failedrn");
       	}	else
      
       	{		printf(       "温度 %d 湿度 %d rn",temp,humi);
       	}}


关键字:STM32  驱动  dht11  温湿度传感器 引用地址:STM32驱动dht11温湿度传感器

上一篇:stm32F4使用温湿度传感器模块-->DHT11
下一篇:STM32入门篇之DHT11温湿度传感器

推荐阅读

因为烧屏或者说灼屏(Burn-in)问题,LG OLED电视不止一次公开“出丑”。  今年1月份,科技媒体Rtings自购了6台LG 2017款C7 OLED电视来模拟日常使用场景下的耐用性,即烧屏现象何时会出现。  9月7日,测试进行到第32周,开机总时长4000小时左右的三台测试电视出现了肉眼可见的烧屏问题。  其中两台电视的共同点是一直固定在美国某新闻频道,亮度...
目的通过调试程序,观察程序的运行情况。主要是简单介绍程序的调试方法,当然相对于一些集成开发环境,这种调试方法就显得有点落后了。由于我坚持不使用集成开发环境,所以只能这样了。要求安装TrueSTUDIO for STM32,这是STM32官方免费的集成开发环境。安装这个IDE的目的只有一个,就是使用它的GDBServer。实验步骤1.使用《基于STM32从零写操作系统系列...
近期帮客户调试STM8的程序使用到OptionByte配置,在网上查询几乎都是介绍如何通过函数实现;后查看IAR帮助文档找到了IAR配置OptionByte的方法。具体方法如下:1、在工程Options...选项Debugger中选择你的调试工具,选择好后会在IAR的菜单栏中出现对应的调试工具菜单。如下图所示,我这里选择的是ST_LINK。2、选择上图所示ST_LINK菜单中的Option Bytes选项...
近日,中国电信对外公布,中国电信湖北公司在武汉 18 所高校建成电信三千兆网络,“三千兆网络“指的是千兆宽带、千兆 5G、千兆 WiFi 全覆盖,对此,可以达到室内外无缝衔接的效果,让用户在校园内均能享受高带宽、低延时的网络。三千兆网络的建成,将有助于高校线上教育体系的建设,以及校园大数据综合治理,切合推进智慧校园的建设。该项目是中国电...

史海拾趣

问答坊 | AI 解惑

请问用什么电机

请问用什么电机可以精确定位,是用步进电机吗,好像步进电机的功率不大,有几百W。…

查看全部问答∨

34063问题

用MC34063做电源时有干扰怎么去解决呀 各位大哥帮帮忙 谢谢了 电路是非达林顿接法…

查看全部问答∨

急问!!!

急问!做射频微波方面电路和系统的 想在大连找工作 都有哪些企业啊? 在大连做IC设计的公司都有哪些啊? 麻烦高手们给推荐以下,谢谢!…

查看全部问答∨

wince6.0 nandflash驱动 FAL+FMD

最近在做Wince6.0的NANDFlash驱动,采用的是FAL+FMD架构,但是这种架构有一个严重的问题,就是在操作MLC的nandflash时,很不稳定,经常出错,性能较差。 我的板子上的nandflash芯片型号为:SAMSUNG 825 K9GAG08U0M,大小为2G。 有没有达人做过, ...…

查看全部问答∨

2410PCB问题

买了一2410开发板,学了一段时间,总感不爽。一些问题总是一知半解,希望自己亲手做一块板出来。 现在问题,像2410的脚这么密   1.线宽多少合适   2.过孔的内外径多少合适   3.做几层合适   以上问题 ...…

查看全部问答∨

有关串口通讯的问题 232—>485->232 老生常谈,希望赐教

小弟正在开发一个进站车辆排队系统,需要在大门口安装一个232刷卡器,为了节约成本,不想在大门口安装电脑了,想直接从232转到485在转回232,连接到机房的电脑上,距离大约有200米。从网上查了很多资料,没有正解。又在此网站上看到一个帖子(RS232 ...…

查看全部问答∨

请教如何编写接收小区广播消息的代码

开发平台是VS2005,请问如何编写接收小区广播消息的代码,请各位高手赐教。 最好是有源代码,或者告诉我到那里找比较详细的参考,谢谢了。…

查看全部问答∨

怎么从开发板读出程序

麻烦问一下,我现在可以用JLINK把程序烧进板子里,但是有什么方法能将板子里的程序读出来? 就是对已经有程序的板子怎么把板子里的原程序读出来? 知道的给指导一下吧!   谢谢各位了! [ 本帖最后由 jianshengdk 于 2011-11-30 10:34 编 ...…

查看全部问答∨

DIY发报机

  这种小发报机是很好的一个科技小制作,原理非常简单。2节干电池与一个按键开关、一个电磁铁串联在一起。按下按键,电路接通,电磁铁里有电流通过,产生磁场,就会把上面的铁片吸引下来。贴片与磁铁碰撞,发出“啪”的一声响。松开按键, ...…

查看全部问答∨

CKFA

请问谁有基于28335的CKFA CCS4工程?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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