STM32F103:二.(3)DHT11温湿度

模块介绍

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装,连接方便。

DHT11的总体通信流程。
第一步:主机先发送开始信号,从机会返回一个相应信号进行应答。
第二步:主机信号线拉高准备接收数据。
第三部:开始接收数据(一次接收40位)。

步骤一:DHT11 上电后(DHT11 上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令),测试环境温湿度数据,幵记录数据,同时 DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平;此时 DHT11 的DATA 引脚处于输入状态,时刻检测外部信号。

步骤二:微处理器的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,在发送信号发送完成后,有20~40us高电平;然后微处理器的 I/O设置为输入状态,由于上拉电阻,微处理器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作出回答信号,发送信号如图所示:

步骤三:DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接收数据,微处理器的 I/O 此时处于输入状态,发送信号如图所示:

步骤四:由 DHT11 的 DATA 引脚输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据,位数据“0”的格式为: 50 微秒的低电平和 26-28 微秒的高电平,位数据“1”的格式为: 50 微秒的低电平加 70微秒的高电平。位数据“0”、“1”格式信号如图所示:

(我们可以把这一段的时序理解为,我们主机先把数据线拉低50us,然后延时等待40us,然后再去读取信号线的电平,如果为低电平,则为位“0”;如果为高电平,则为位“1”,这时还要在延时30us)。
结束信号:DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 50 微秒后转为输入状态,由于上拉电阻随之变为高电平。但 DHT11 内部重测环境温湿度数据,幵记录数据,等待外部信号的到来。

一. 单片机上电后1s内不读取
二. 主机(单片机)发送起始信号:
1.主机先拉高data。
2.拉低data延迟>18ms。
3.拉高data(单片机引脚设置为输入)。
三. 从机(DHT11)收到起始信号后进行应答:
从机拉低data,主机读取到data线被拉低持续80us后从机拉高data线,持续80us,直到高电平结束,意味着主机可以开始接受数据。
四. 主机开始接收数据:
1.主机先把data线拉高(io设置为输入)。
2.从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。
3.继续重复上述1,2步骤累计40次。
五. data线拉低50us代表读取结束

代码实现

dht11.h 声明

#ifndef __DHT11_H_
#define __DHT11_H_
#include "sys.h"
#include "delay.h"
#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=8<<4;}//上拉下拉输入
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=3<<4;}//输出,50MHz
#define DHT11_DQ_OUT PAout(1) //数据端口    PA1
#define DHT11_DQ_IN  PAin(1)  //数据端口    PA1 extern unsigned char RH,RL,TH,TL;  // 测得数据
u8 DHT11_Init(void);                     //初始化DHT11
void DHT11_Read_Data(void);   //读取温湿度
u8 DHT11_Read_Byte(void);                //读出一个字节
u8 DHT11_Read_Bit(void);                 //读出一个位
u8 DHT11_Check(void);                    //检测是否存在DHT11
void DHT11_Rst(void);                    //复位DHT11#endif

一、初始化连接DHT11端口

u8 DHT11_Init(void)
{    GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能P端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //P端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);              //初始化IO口GPIO_SetBits(GPIOA,GPIO_Pin_1);                         //P 输出高DHT11_Rst();          //复位DHT11return DHT11_Check(); //等待DHT11的回应
}

二、复位DHT11

/*******************复位DHT11*********************/
void DHT11_Rst(void)
{                 DHT11_IO_OUT(); //SET OUTPUTDHT11_DQ_OUT=0;  //拉低DQdelay_ms(20);     //拉低至少18msDHT11_DQ_OUT=1;  //DQ=1 delay_us(30);    //主机拉高20~40us
}

三、等待DHT11的回应

u8 DHT11_Check(void)
{   u8 retry=0;DHT11_IO_IN();//SET INPUT    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us{retry++;delay_us(1);}  if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us{retry++;delay_us(1);}if(retry>=100)return 1;    //返回1:未检测到DHT11的存在return 0;                //返回0:存在
}

四、从DHT11读取一个位

u8 DHT11_Read_Bit(void)
{u8 retry=0;while(DHT11_DQ_IN&&retry<100)//等待变为低电平{retry++;delay_us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100)//等待变高电平{retry++;delay_us(1);}delay_us(40);//等待40usif(DHT11_DQ_IN)return 1; //返回值:1else return 0;           //返回值:0
}

五、从DHT11读取一个字节

u8 DHT11_Read_Byte(void)
{        u8 i,dat;dat=0;for (i=0;i<8;i++) {dat<<=1; dat|=DHT11_Read_Bit();}                          return dat;//返回值:读到的数据
}

从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)

void DHT11_Read_Data(void)
{        u8 buf[5];u8 i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//读取40位数据{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){RH = buf[0];RL = buf[1];TH = buf[2];TL = buf[3];}}
}

main.c代码

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "oled.h"
#include "dht11.h"
u16 temperature;
u16 humidity;
int main(void)
{delay_init();           //延时函数初始化    uart_init(115200);        //串口初始化为115200LED_Init();               //初始化与LED连接的硬件接口DHT11_Init();   //DHT11初始化OLED_Init();OLED_ShowString(0,0,"Welcome To STM32",16);OLED_ShowString(0,2,"Temp:",16);OLED_ShowString(0,4,"Humi:",16);while(1){DHT11_Read_Data(); //读取温湿度值 OLED_ShowNum(48,2,TH,2,16);OLED_ShowChar(64,2,'.',16);//温度OLED_ShowNum(72,2,TL,2,16);OLED_ShowChar(98,2,'C',16);OLED_ShowNum(48,4,RH,2,16);OLED_ShowChar(64,4,'.',16);//湿度OLED_ShowNum(72,4,RL,2,16);OLED_ShowChar(98,4,'%',16);LED0=!LED0;delay_ms(200);}
}

效果图片:

STM32F103:二.(3)DHT11温湿度相关推荐

  1. 《Arduino实验》实验二:DHT11温湿度传感器检测当前环境温湿度

    更完整.更全面的Arduino实验存放在我的github上,有需要的可以到github上查看和下载. 当然如果你觉得有帮助,给一个小小的star和fork就谢谢您了. gtihub网址:https:/ ...

  2. LCD1602与DHT11温湿度的使用

    LCD1602与DHT11温湿度的使用 在下面编写过程中,学了模块化的编程思想,在后面的学习过程中更应该多使用模块化编写,不仅仅书写代码规范 效率执行也高. 一.理解LCD1602原理 1602液晶也 ...

  3. 51单片机控制DHT11温湿度传感器,并使用OLED屏幕显示

    目录 前言 一.MCU主控选型 二.DHT11温湿度传感器 1.模块介绍 2.软件实现 DHT11.c DHT11.h 三.OLED显示屏 1.模块介绍 2.软件实现 OLED.c OLED.h OL ...

  4. 外设驱动库开发笔记15:DHT11温湿度传感器驱动

    与DS18B20一样DHT11也是采用单总线,但所不同的是DHT11可同时实现温度和湿度的检测.在我们的产品中经常使用它来检测环境的温湿度信息.这一篇我们将设计并封装DHT11的驱动程序,以方便重复使 ...

  5. 基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统

    基于STM32F1单片机.ESP8266WIFI模块.DHT11温湿度传感的WIFI网络温湿度传输系统 功能说明 温湿度采集端 温湿度监控端 硬件材料 硬件连接 主要代码 温湿度采集端 温湿度监控端 ...

  6. Esp8266 进阶之路19 【外设篇①】esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  7. ESP32 开发笔记(三)源码示例 8_DHT11_RMT 使用RMT实现读取DHT11温湿度传感器

    开发板购买链接 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=62636 ...

  8. 传感器自学笔记第八章——DHT11温湿度传感器(附带自己写的很好用的51单片机DHT11代码模板,参数列表只有一个字符数组指针)

    作者:GWD 时间:2019.06.26 DHT11温湿度传感器(单总线类) 一. 学习要点: 1.(重要)单总线类传感器检测高电平while(DHT11 == 1) temp |=0x01;出错,因 ...

  9. 基于STM32的DHT11温湿度传感器设计

    文章目录 前言 一.DHT11温湿度传感器是什么? 二.DHT11驱动程序详解 1.相关宏定义 2.输入输出GPIO配置 2.GPIO初始化设计 3.检测DHT11是否正常工作 4.读取DHT11数据 ...

最新文章

  1. css新闻列表优化-突破思维新方法更利于搜索引擎
  2. 由浅入深CIL系列:6.For和Foreach的CIL结构组成以及运行效率
  3. 怎么做网络推广浅析有关404页面优化的技巧
  4. 非科班通过几个月的培训入行人工智能现实吗?
  5. 如何将csv包含的数据导入SAP Cloud Platform HANA MDC里
  6. 一、node.js搭建最简单的服务器
  7. KVM虚拟机安装使用教程(Ubantu)
  8. 如何将poi数据导入arcgis
  9. 万年历插件软件测试,万年历软件测试方案.docx
  10. 微信公众平台教程,注册申请、认证、开发、推广营销,教你怎么用微信公众号...
  11. y的花式写法_26字母的花式写法可复制 也叫圆体字写法如下一基本规则
  12. 圣诞素材网站推荐 这几个网站超多免费可商用素材
  13. python 子域名爆破工具
  14. Idea中发布JAR包到中央仓库报错问题处理 unable to find valid certification path to requested target
  15. 蓝奏云软件库源码分享下载
  16. 从技术到应用实践 揭秘京东区块链布局全景
  17. Proximal Policy Optimization (PPO) 算法理解:从策略梯度开始
  18. js写一个开心消消乐
  19. 一键免费部署看板管理应用——Wekan
  20. [日推荐] 『无忧育儿说』养育孩子就是这么简单!

热门文章

  1. keil复制代码乱码_成都控制器开发:容易忽略!用KEIL编码汉字也会有BUG
  2. winform 中show()函数和showdialog()函数区别
  3. Arcgis Engine矢量裁剪栅格,调用Mask工具相关代码
  4. 同事操作两个数据源保持事务一致_微服务分布式事务4种解决方案实战
  5. Java 并发编程之 CopyOnWriteArrayList
  6. 向服务器上传文件的命令,上传文件到远程服务器的命令
  7. wordpress php 链接,WordPress中获取页面链接和标题的相关PHP函数用法解析
  8. oracle 客户端连接数_转载:查看Oracle连接数
  9. python手绘效果图_2020高校邦《马克笔手绘效果图》判断题答案2020高校邦《网络数据采集与Python爬虫(山东大学定制班级)》见面课测试答案...
  10. python 识别登陆验证码图片(完整代码)_python 识别登录验证码图片功能的实现代码(完整代码)...