DHT11温湿度传感器开发
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温湿度传感器开发相关推荐
- ESP32 开发笔记(三)源码示例 8_DHT11_RMT 使用RMT实现读取DHT11温湿度传感器
开发板购买链接 https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=62636 ...
- 嵌入式设计与开发项目-DHT11温湿度传感器程序设计
嵌入式设计与开发项目-DHT11温湿度传感器程序设计 一.实现的功能 二.根据功能实现代码 1.主文件main.c 2.DHT11温湿度的头文件"dht11.h" 3.DHT11温 ...
- Arduino开发板使用DHT11温湿度传感器的方法
在本篇文章中,我们将DHT11温湿度传感器与Arduino开发板和LCD显示屏连接,设计一种能够测量室温和环境湿度的设备.简单地说,我们将使用Arduino和DHT11传感器设计数字湿度和温度计,并将 ...
- ⑦ ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 DHT11 温湿度传感器】
目录 一.准备材料 二.硬件连接 三.软件编程 1.修改工程名 2.添加组件 3.编程 4.反馈结果 5.核心代码 四.总结 ⑦ ESP8266 开发学习笔记_By_GYC [ESP8266 驱动 D ...
- 【STM32 Net MF开发板学习-19】DHT11温湿度传感器通信(上)
前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...
- 【STM32 .Net MF开发板学习-19】DHT11温湿度传感器通信(上)
前段时间开发远程医疗系统(Dr.Cloud)就曾用到过温湿度传感器,不过当时考虑到集成难度,选了一个RS485接口的传感器,该传感器实现了Modbus Rtu Slave的功能,只要客户程序实现Mod ...
- Esp8266 进阶之路19 【外设篇①】esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。(附带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- 《Arduino实验》实验二:DHT11温湿度传感器检测当前环境温湿度
更完整.更全面的Arduino实验存放在我的github上,有需要的可以到github上查看和下载. 当然如果你觉得有帮助,给一个小小的star和fork就谢谢您了. gtihub网址:https:/ ...
- Arduino+DHT11温湿度传感器+12864oled显示温湿度
本文利用arduino uno时时读取DHT11温湿度传感器的温度和湿度值,并将读取到的数值显示在OLED12864上. 元器件: arduino板 OLED12864显示屏 DHT1 ...
最新文章
- ffmpeg java linux水印,Linux环境用FFmpeg给视频加水印详细步骤
- 皮一皮:这是传说盖浇饭中的天花板~白粥盖浇饭...
- c++ 打印 torch tensor
- 何时会调用拷贝构造函数
- 设计模式五:外观模式
- 【Silverlight】汉诺塔游戏,带AI
- php两数相乘,php – 如何将数字相乘,直到达到一位数字并计算数字?
- 新增字段赋值_微服务】155:商品新增业务(完)
- ThreadLocal的两种用法
- Lotus Domino服务器及其应用系统的高级管理(2)
- 【英语】Flying By Dream---English
- 七年前的电脑可以用python_1年前的小五都用 Python 来做什么?
- java线程main异常,‘java.lang.NoSuchMethodError:main的原因’线程中的异常“main”’...
- 新手入门-花生壳内网版做端口映射
- kt条件例题运筹学_运筹学讲解习题
- 彻底格式化系统启动U盘(基于win10)
- 扫一扫二维码隐私权政策
- 微信公众平台开发(六) 翻译功能开发
- APP推广案例之星巴克APP营销方式
- android英文文献翻译,安卓 英文 外文 文献翻译 android api级别.doc