DHT11温湿度传感器开发

  • 单总线说明
  • 单总线传送数据位定义
  • 数据格式
  • 数据时序图
  • 外设读取步骤

单总线说明

  DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏枀开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约 5.1kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结极,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。

单总线传送数据位定义

DATA引脚用于微处理器与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位数据,高位先出。

数据格式

8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据+8bit 校验位。 注:其中温湿度小数部分为 0。

校验位数据定义 “8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据”8bit 校验位等于所 得结果的末 8 位。

数据时序图

用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束 后,DHT11 发送响应信号,送出 40bit 的数据,并触发一次信采集。信号发送如图所示。

外设读取步骤

主机和从机之间的通信可通过如下几个步骤完成(外设(如微处理器)读取 DHT11 的数据的步骤)。

步骤一:

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

步骤二:

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

步骤三:

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

步骤四:

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

结束信号:

DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 50 微秒后转为输入状态,由于上拉电阻随 之变为高电平。但 DHT11 内部重测环境温湿度数据,并记录数据,等待外部信号的到来。

例程(cc2530):

#include <ioCC2530.h>
#include "OnBoard.h"typedef unsigned char uchar;
typedef unsigned int  uint;#define DATA_PIN P0_7void Delay_us(void);
void Delay_10us(void);
void Delay_ms(uint Time);
void COM(void);
void DHT11(void);//温湿度定义
uchar ucharFLAG,uchartemp;
uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4;
uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata;
uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;
uchar ucharcomdata;//延时函数
void Delay_us(void) //1 us延时
{MicroWait(1);
}void Delay_10us(void) //10 us延时
{MicroWait(10);
}void Delay_ms(uint Time)//n ms延时
{unsigned char i;while(Time--){for(i=0;i<100;i++)Delay_10us();}
}//温湿度传感
void COM(void)    // 温湿写入
{     uchar i;         for(i=0;i<8;i++)    {ucharFLAG=2; while((!DATA_PIN)&&ucharFLAG++);//DHT11发送的数据0为50us低电平和26-28us高电平;数据1为50us低电平和70us高电平Delay_10us();                   Delay_10us();Delay_10us();uchartemp=0;                    if(DATA_PIN)uchartemp=1;    //等30us后,判断引脚是否还为高电平,如果是则发送的是数据1,否则是数据0ucharFLAG=2;while((DATA_PIN)&&ucharFLAG++);   //等发送的第一位数据的时序走完,io会变成0if(ucharFLAG==1)break;    ucharcomdata<<=1;         //一位位送入ucharcomdata,一共八位,即为一个湿度高八位数据,以此内推ucharcomdata|=uchartemp; }
}void DHT11(void)   //温湿传感启动
{DATA_PIN=0;    //给DHT11发送起始信号Delay_ms(19);  //>18MSDATA_PIN=1;    //输出高,并设置io口为输入P0DIR &= ~0x80; //重新配置IO口方向为输入Delay_10us();   //延时一下,时长小于80us,因为当dht11收到起始信号会发出80us的响应信号Delay_10us();                        Delay_10us();Delay_10us();  if(!DATA_PIN) //此时由于DHT11仍在发出响应信号0,读取引脚为0,进入if{ucharFLAG=2; while((!DATA_PIN)&&ucharFLAG++);//一直while等待DHT11发送响应信号0的80us走完ucharFLAG=2;while((DATA_PIN)&&ucharFLAG++); //此时DHT11会发出80us高电平提示准备接受数据,等80us走完,开始发送温湿度数据COM();                          //接受湿度高八位数据ucharRH_data_H_temp=ucharcomdata;COM();                          //接受湿度低八位数据ucharRH_data_L_temp=ucharcomdata;COM();                          //接受温度高八位数据ucharT_data_H_temp=ucharcomdata;COM();                          //接受温度低八位数据ucharT_data_L_temp=ucharcomdata;COM();                          //接受校验位数据ucharcheckdata_temp=ucharcomdata;DATA_PIN=1; uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);if(uchartemp==ucharcheckdata_temp)  //正确的校验位为前面接受的四次数据相加{ucharRH_data_H=ucharRH_data_H_temp;ucharRH_data_L=ucharRH_data_L_temp;ucharT_data_H=ucharT_data_H_temp;ucharT_data_L=ucharT_data_L_temp;ucharcheckdata=ucharcheckdata_temp;}wendu_shi=ucharT_data_H/10; wendu_ge=ucharT_data_H%10;shidu_shi=ucharRH_data_H/10; shidu_ge=ucharRH_data_H%10;        } else //没用成功读取,返回0{wendu_shi=0; wendu_ge=0;shidu_shi=0; shidu_ge=0;  } P0DIR |= 0x80; //IO口需要重新配置
}

DHT11温湿度传感器开发相关推荐

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

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

  2. 嵌入式设计与开发项目-DHT11温湿度传感器程序设计

    嵌入式设计与开发项目-DHT11温湿度传感器程序设计 一.实现的功能 二.根据功能实现代码 1.主文件main.c 2.DHT11温湿度的头文件"dht11.h" 3.DHT11温 ...

  3. Arduino开发板使用DHT11温湿度传感器的方法

    在本篇文章中,我们将DHT11温湿度传感器与Arduino开发板和LCD显示屏连接,设计一种能够测量室温和环境湿度的设备.简单地说,我们将使用Arduino和DHT11传感器设计数字湿度和温度计,并将 ...

  4. ⑦ ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 DHT11 温湿度传感器】

    目录 一.准备材料 二.硬件连接 三.软件编程 1.修改工程名 2.添加组件 3.编程 4.反馈结果 5.核心代码 四.总结 ⑦ ESP8266 开发学习笔记_By_GYC [ESP8266 驱动 D ...

  5. 【STM32 Net MF开发板学习-19】DHT11温湿度传感器通信(上)

    前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...

  6. 【STM32 .Net MF开发板学习-19】DHT11温湿度传感器通信(上)

    前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...

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

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

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

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

  9. Arduino+DHT11温湿度传感器+12864oled显示温湿度

            本文利用arduino uno时时读取DHT11温湿度传感器的温度和湿度值,并将读取到的数值显示在OLED12864上. 元器件: arduino板 OLED12864显示屏 DHT1 ...

最新文章

  1. ffmpeg java linux水印,Linux环境用FFmpeg给视频加水印详细步骤
  2. 皮一皮:这是传说盖浇饭中的天花板~白粥盖浇饭...
  3. c++ 打印 torch tensor
  4. 何时会调用拷贝构造函数
  5. 设计模式五:外观模式
  6. 【Silverlight】汉诺塔游戏,带AI
  7. php两数相乘,php – 如何将数字相乘,直到达到一位数字并计算数字?
  8. 新增字段赋值_微服务】155:商品新增业务(完)
  9. ThreadLocal的两种用法
  10. Lotus Domino服务器及其应用系统的高级管理(2)
  11. 【英语】Flying By Dream---English
  12. 七年前的电脑可以用python_1年前的小五都用 Python 来做什么?
  13. java线程main异常,‘java.lang.NoSuchMethodError:main的原因’线程中的异常“main”’...
  14. 新手入门-花生壳内网版做端口映射
  15. kt条件例题运筹学_运筹学讲解习题
  16. 彻底格式化系统启动U盘(基于win10)
  17. 扫一扫二维码隐私权政策
  18. 微信公众平台开发(六) 翻译功能开发
  19. APP推广案例之星巴克APP营销方式
  20. android英文文献翻译,安卓 英文 外文 文献翻译 android api级别.doc

热门文章

  1. Linux load average负载量分析与解决思路
  2. AOP的自动代理(基于AspectJ框架)
  3. WinMount 2008 鼠年新春版发布
  4. 2022.10.EEP開發筆記-1
  5. 微机计算机原理及应用ppt,微机原理及应用-第一章 计算机基础知识课件.ppt
  6. ospf重要内容整理
  7. 供应链管理系统--(6)供应商商品管理
  8. 【学习笔记】AGC008
  9. Live555编译过程
  10. 恒玄BES调试笔记-BES2500低延迟