STM32驱动dht11温湿度传感器

发布者:gamma14最新更新时间:2021-10-14 来源: 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温湿度传感器

推荐阅读最新更新时间:2024-11-08 12:09

四方TS1000施工升降机驱动一体机应用方案
一、引言 施工升降机是一种用吊笼载人、载物沿导轨做上下运输的施工机械,是现代高层施工中必不可少的重要垂直运输设备,在高层建筑施中扮演了极其重要的角色,对于保证施工期与安全,降低施工成本,减轻劳动强度起着不可替代的作用。 二、施工升降机的发展 国内目前最常见的施工升降机机型是SC齿轮齿条式、人货两用的施工升降机,其中90%以上是1~2吨级的。 普通升降机一般采用的是接触器-继电器控制方式,直接启动和机械抱闸强制制动,启制动冲击大,对机械结构和机构的损坏大,电气元件也易损坏,同时容易造成升降机里的物料跌落,既影响了施工速度也影响了施工企业的效益,特别是在人货两用施工升降机上,存在着极大的安全隐患。 随着我国建筑业的不断发展,建
[嵌入式]
stm32 驱动 触摸屏
由于智能手机的发展和大屏幕的兴起,触摸屏已经得到了广泛的应用。触摸屏分为两种:电阻触屏 俗称“软屏”;电容触屏俗称“硬屏”。 电阻触摸屏的屏体部分是一块多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的阻性材料组成的导电层(ITO膜),上面再盖有一层外表面经过硬化处理、光滑防刮的塑料层。它的内表面也涂有一层ITO,在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开。当手指接触屏幕时,两层 ITO发生接触,电阻发生变化,控制器根据检测到的电阻变化来计算接触点的坐标,再依照这个坐标来进行相应的操作,因此这种技术必须是要施力到屏幕上,才能获得触摸效果。 所有的电阻式触摸屏都采用分压器原
[单片机]
<font color='red'>stm32</font> <font color='red'>驱动</font> 触摸屏
Stm32使用Usart代码例子轮询、中断、DMA
/* 转载请注明出处:tedeum.iteye.com / 首先是不使用中断的方法使用usart1,管脚pa9,pa10,此方法已在f3discovery上验证通过,来源:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2Fusart%20code&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E1
[单片机]
<font color='red'>Stm32</font>使用Usart代码例子轮询、中断、DMA
半导体产业专家柳滨:六大因素驱动我国集成电路设备发展
“我国集成电路年进口额近年来一直保持在2000亿美元以上,严重依赖进口,市场供需关系严重失衡。”中国电子科技集团公司第四十五研究所集团首席专家柳滨说。 从制造技术来看,我国集成电路与国际先进工艺相差2~3代,设备严重依赖进口,国产化面临考验。 目前,国际集成电路制造先进制造技术是14—10nm工艺节点,前端制造到达7nm工艺节点,2018年下半年将量产,5—3nm节点技术正在研发中。而国内方面,14nm制造技术预计2019年实现量产,与国际先进工艺存在代差。 柳滨指出,我国集成电路制造装备与世界先进水平的差距,主要是由我国集成电路制造装备现状和固有发展特点所决定的。 半导体装备具有技术门槛高、研发周期长、工艺线需要反复验证的固有特
[半导体设计/制造]
探讨LED照明驱动电源的相关问题
  为了节能省电,LED得到了很大的推广,但LED都需要有个电源驱动,其好坏会直接影响LED的寿命,因此如何做好一个LED驱动电源是LED电源设计者的重中之重。本文介绍了一些LED驱动电源的问题,希望能够对工程师提供一点帮助。   1、驱动电路直接影响LED寿命   我们所说的LED驱动包括数码驱动和类比驱动两类,数码驱动指数字电路驱动,包括数字调光控制,RGB全彩变幻等。类比驱动指类比电路驱动,包括AC恒流开关电源,DC恒流控制电路。驱动电路由电子元件组成,包括半导体元件,电阻,电容,电感等,这些元件都有使用寿命,任何一个器件失效都会导致整个电路的失效或者部分功能失效。 LED的使用寿命是5-10万小时,按5万小时算,连续点
[电源管理]
用微控制器单端口线驱动多个LED显示器
许多仪器设计中都需要七段显示器。在基于微控制器的常规设计中,一个七段显示器使用四输出端线。图1为常规四位七段LED显示器示意图。在该例中,四位七段LED需要两个8位输出口。图2为另一个通用显示器多路设计,1.5个8位端线驱动四个七段显示器。因为有视觉暂留,必须对显示器进行不断刷新,使其看起来稳定。 图3的电路不需要多个端口线,用一个端口线驱动四个显示器。(理论上,用这种方法,一个端口线可以驱动任意多个显示器)。一旦需要更新显示,端口线应输出软件产生的脉冲链。第一个脉冲应为长脉冲,后续脉冲为数量等于显示器个数的多个短脉冲。 IC1单稳态和与门用作长脉冲探测器。IC2到IC5(CD40110)为十进制升降计数/锁存/显示器驱动器。微
[应用]
STM32定时器介绍
STM32定时器介绍 本文将介绍STM32定时器的一些基本概念性的东西,方便后面内容的理解学习。 接下来将从以下几个方面介绍:STM32定时器介绍 ①STM32定时器介绍 STM32F4共有14个定时器,按照定时器所具备的功能多少可分为3类:基本定时器、通用定时器、高级定时器; 高级定时器具有通用、基本定时器的所有功能; 从图中可以看出: 定时器的计数最大值为2^16-1; 计数类型有:向上计数模式、向下计数模式、中央对齐模式; 定时器的最大分频系数可以达到65536; DMA请求生成、捕获/比较通道、最大接口时钟视具体定时器; 下面就定时器的计数类型进行具体的介绍: “向上计数模式”:计数器从0计数到自动加载值、然后产生
[单片机]
<font color='red'>STM32</font>定时器介绍
深度解析链表在STM32中的应用
1、为何引入链表 在程序中经常面临一个问题,我们需要保存一定数量的对象,但是对象数目是不确定的,或者说是随时增加或减少的。这时候最简单的方法是创建一个足够大的数组,用来存储这些对象。我最近开发一个项目就遇到类似的问题,下面我把问题简化一下。 需求:通过PC下发一些矩形的坐标和宽高信息,每个区域有个ID编号,并在这些矩形内填充一定的数据。 通常情况下,最简单易懂的做法是,限制最多5个区域,每个区域存储1K数据。因此设置了这样的一个结构体(类似于面向对象语言里说的成员属性)。 typedef struct Area_Inf{ uint8_t ID; uint8_t X; uint8_t Y; uint8_t Width; uint
[单片机]
深度解析链表在<font color='red'>STM32</font>中的应用

推荐帖子

CAN总线的包ID与设备的关系
和朋友聊起来CAN总线,我一直以为设备和包ID是绑定关系,也就是一个设备的功能和包ID是固定地,一个设备可以有多个功能,每个功能就绑定一个ID,例如:温湿度计有两个参数,温度,湿度,露点。那么参数就可以分配三个ID。但是朋友说:can总的ID是包的特性,所以没有限制ID和设备是必须绑定地,所以任何设备都可以发送其它设备的ID。不知道各位如何理解,请各位科普一下。CAN总线的包ID与设备的关系简单理解,两点:(1)CAN的ID是协议的一部分。-表示你可以随便定义。(2)
bigbat 汽车电子
【R7F0C809】初识瑞萨开发套件
收到EZ-CUBE&R7F0C809有一段时间了,由于近段时间工作较忙,一直没有仔细研究。这次收到的瑞萨开发板,感觉做工精致,不愧是大厂作风,先来个全家福吧。【R7F0C809】初识瑞萨开发套件
zjbwxl 瑞萨电子MCU
直播FAQ:与英飞凌一同探寻智能门锁背后的黑科技
直播主题:与英飞凌一同探寻智能门锁背后的黑科技内容简介:区别于传统门锁,智能门锁是近几年在国内市场推出的在用户安全性、识别、管理性方面更加智能化简便化的锁具。随着智能家居的不断推广,智能门锁的解锁方式,无线连接、安全性能等一直是人们持续关注的问题。针对上述问题,英飞凌为智能门锁研发设计了一套完整的IoT解决方案,包括MCU,TOF,安全芯片,Wifi和双模蓝牙,实现了从识别,运算,连接到安全的一站式服务。英飞凌和合作伙伴贝能国际共同举办的技术直播为您献上了关于上述产品的详细
EEWORLD社区 安防电子
代做单片机小项目
本人代做单片机小项目,谁有单片机小项目需要做的,需要的可以加我QQ425670259,本人有单片机经验 代做单片机小项目
425670259 51单片机
北京盛源达SYD8801高性价比BLE芯片datasheet
北京盛源达SYD8801高性价比BLE芯片datasheet:替换nRF51822,赚积分特向版友推荐北京盛源达SYD8801高性价比BLE芯片datasheet
willysansen RF/无线
Buck电路输入电容放置有讲究-MPS文档
Buck电路输入电容放置有讲究-MPS文档Buck电源芯片在layout过程中,输入电容应当如何放置以及放置不好对芯片工作有何影响?来谈一谈Buck电路输入电容位置放置的问题。众所周知,Buck变换器在使用过程中,欲使输入端以最小的纹波代价,快速提供Buck变换器每个开关周期所需要的能量,输入端的MLCC是必不可少的;图1:Buck变换器开关周期图那么在实际layout的过程中,输入端的MLCC摆放到底有什么讲究呢?带着这个疑问,我们查阅MPS的
qwqwqw2088 电源技术
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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