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
#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 failed\r\n");
}
else
{
printf("温度 %d 湿度 %d \r\n",temp,humi);
}
}

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

  1. DHT11温湿度传感器编程思路以及代码的实现(转载)

    源自:https://blog.csdn.net/qq_34952376/article/details/81193938 在我们刚开始进入单片机的学习中,练习写传感器的时序是必不可少的,其实我比较推 ...

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

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

  3. STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载

    //为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 ​ //************************** //程序说明:stc ...

  4. 在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  5. STM32—驱动DHT11数字温湿度传感器

    文章目录 DHT11模块简介 DHT11数据传输 DHT11通信时序 代码实现 相关引脚初始化 复位模块 判断响应模块 读取数据包模块 DHT11模块简介 DHT11数字温湿度传感器,用来测量环境的温 ...

  6. DHT11温湿度传感器模块使用方法和驱动代码实现

    DHT11模块简介 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器.它具有超小体积.极低功耗的特点.它使用单根总线与单片机进行双向的串行数据传输,信号传输距离可达20米以上.非常适用于对 ...

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

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

  8. 树莓派使用DHT11温湿度传感器

    一.相关介绍 DHT11介绍: DHT11是一款比较便宜的温湿度传感器模块.读取数据只需要占用一个IO口.能够同时测量温度和相对湿度. DHT11的数据手册可以看这里:http://wenku.bai ...

  9. 【雕爷学编程】Arduino动手做(55)--DHT11温湿度传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

随机推荐

  1. AI 人工智能 探索 (七)

    我简单画了一幅图,来讲下 ai 中的设计模式.图形中的这些人物,我想大家都能看的明白. 当 盗贼出现,人们发现了他们,就 呼叫 主类,然后主类再  通知 下面对应的管理局,然后管理局再 分配人手过去 ...

  2. VC与ADO数据库操作

    VC与ADO数据库操作 学研部的同志们,大家好! 想开一次学习会,实习时间冲突了,只好把文档发给大家看了.重点推荐李振龙的BMP读图教程! 尤其是大三GIS班的同志,注意了,可能实习用得上的! 一.A ...

  3. Android手机fastboot刷机命令

    先进入fastboot文件所在目录 连接硬件命令 fastboot devices 删除recover.boot,system同理 Fastboot erase recovery 重刷,boot,sy ...

  4. jstat undocumented

    jstat -J-Djstat.showUnsupported=true -name btrace.com.sun.btrace.samples.ThreadCounter.count 11674 h ...

  5. Android内存性能优化(内部资料总结) 转

    刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有指针的概念,但是指针的使用方式依然存在,一味的依赖系统 ...

  6. do{...}while(0)的妙用(转)

    源:http://www.cnblogs.com/lizhenghn/p/3674430.html 在学习第一门编程语言时,就已经介绍了顺序分支.条件分支.循环分支.比如循环分支有for.while. ...

  7. 关于sqlserver还原不了数据库的原因

    因为备份文件需要在服务器上打成压缩包,才能进行传输,不然会丢失数据..

  8. listView上拉刷新下拉加载

    xlistview_header.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLa ...

  9. ptrace

    http://zhangwenxin82.blog.163.com/blog/static/114595956201171510512459/

  10. Swift 项目中常用的第三方框架

    Swift 项目中可能用到的第三方框架 字数1004 阅读4091 评论17 喜欢93 这里记录下swift开发中可能用的框架 , 最近浏览了不少,积累在这里,以后用的时候方便查阅.顺便推荐给大家! ...