当前位置: 首页 > news >正文

DHT11 温湿度传感器

目录

1.DHT11 温湿度传感器概述

2.检测DHT11温湿度传感器模块是否存在

3.通过编写代码读取温湿度数据​编辑

4.将读取到的温湿度数据通过串口上传


1.DHT11 温湿度传感器概述

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制

特点:

  • 相对湿度和温度测量
  • 全部校准,数字输出
  • 长期稳定性
  • 超长的信号传输距离:20米
  • 超低能耗:休眠
  • 4 引脚安装:可以买封装好的
  • 完全互换 : 直接出结果,不用转化

接线:

  • VCC接5V
  • GND接GND
  • DATA接P3^3口

数据传送逻辑:

只有一根数据线DATA,上官一号发送序列指令给DHT11模块,模块一次完整的数据传输为40bit,高位先出

数据格式:

8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和 通讯过程时序图

2.检测DHT11温湿度传感器模块是否存在

根据如下时序图,做通信初始化,并检测模块是否存在,功能是否正常

时序逻辑分析:

  • a : dht = 1
  • b :dht = 0
  • 延时30ms
  • c: dht = 1
  • 在60us后读d点,如果d点是低电平(被模块拉低),说明模块存在!

代码示例:

#include "reg52.h"
#include "intrins.h"sbit ledOne = P3^7;
sbit dht = P3^3;//模块的data插在p3.3void Delay30ms()		//@11.0592MHz
{unsigned char i, j;i = 54;j = 199;do{while (--j);} while (--i);
}void Delay60us()		//@11.0592MHz
{unsigned char i;i = 25;while (--i);
}void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void check_DHT()
{//a :  dht = 1 dht = 1;//b :dht = 0dht = 0;//延时30msDelay30ms();//c: dht = 1dht = 1;//在60us后读d点,如果d点是低电平(被模块拉低),说明模块存在!Delay60us();if(dht == 0){ledOne = 0;//亮灯,说明模块存在}
}void main()
{ledOne = 1;Delay1000ms();Delay1000ms();check_DHT();while(1);
}

3.通过编写代码读取温湿度数据

  • a : dht = 1
  • b :dht = 0
  • 延时30ms
  • c: dht = 1
  • 卡d点;while(dht1);
  • 卡e点 while(!dht)
  • 卡f点:while(dht)
  • 卡g点:while(!dht)
  • 有效数据都是高电平,持续时间不一样,50us读,低电平0 高电平

DHT11传输0的时序分析:

DHT11传输1的时序分析:

代码示例:

#include "reg52.h"
#include "intrins.h"sbit ledOne = P3^7;
sbit dht = P3^3;//模块的data插在p3.3char datas[5];void Delay30ms()		//@11.0592MHz
{unsigned char i, j;i = 54;j = 199;do{while (--j);} while (--i);
}void Delay60us()		//@11.0592MHz
{unsigned char i;i = 25;while (--i);
}void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void DHT11_Start()
{dht = 1;dht = 0;//延时30msDelay30ms();dht = 1;//卡d点;while(dht1); 卡e点 while(!dht) 卡f点:while(dht)while(dht);while(!dht);while(dht);
}void Read_Data_From_DHT()
{int i;//轮int j;//每一轮读多少次char tmp;char flag;DHT11_Start();for(i= 0;i < 5;i++){//卡g点:while(!dht)       有效数据都是高电平,持续时间不一样,50us读,低电平0 高电平for(j=0;j<8;j++){while(!dht);//等待卡g点Delay60us();if(dht == 1){flag = 1;while(dht);}else{flag = 0;} tmp = tmp << 1;tmp |= flag;}datas[i] = tmp;}}void main()
{ledOne = 1;Delay1000ms();Delay1000ms();while(1){Delay1000ms();Read_Data_From_DHT();	}
}

4.将读取到的温湿度数据通过串口上传

代码示例:

#include "reg52.h"
#include "intrins.h"sbit ledOne = P3^7;
sbit dht = P3^3;//模块的data插在p3.3char datas[5];sfr AUXR = 0x8E;void UartInit(void)		//9600bps@11.0592MHz
{AUXR = 0x01;SCON = 0x40; //配置串口工作方式1,REN不使能接收TMOD &= 0xF0;TMOD |= 0x20;//定时器1工作方式位8位自动重装TH1 = 0xFD;TL1 = 0xFD;//9600波特率的初值TR1 = 1;//启动定时器
}
void sendByte(char data_msg)
{SBUF = data_msg;while(!TI);TI = 0;
}void sendString(char* str)
{while( *str != '\0'){sendByte(*str);str++;}
}void Delay30ms()		//@11.0592MHz
{unsigned char i, j;i = 54;j = 199;do{while (--j);} while (--i);
}void Delay60us()		//@11.0592MHz
{unsigned char i;i = 25;while (--i);
}void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void DHT11_Start()
{dht = 1;dht = 0;//延时30msDelay30ms();dht = 1;//卡d点;while(dht1); 卡e点 while(!dht) 卡f点:while(dht)while(dht);while(!dht);while(dht);
}
void Delay40us()		//@11.0592MHz
{unsigned char i;_nop_();i = 15;while (--i);
}void Read_Data_From_DHT()
{int i;//轮int j;//每一轮读多少次char tmp;char flag;DHT11_Start();for(i= 0;i < 5;i++){//卡g点:while(!dht)       有效数据都是高电平,持续时间不一样,50us读,低电平0 高电平for(j=0;j<8;j++){while(!dht);//等待卡g点Delay40us();if(dht == 1){flag = 1;while(dht);}else{flag = 0;} tmp = tmp << 1;tmp |= flag;}datas[i] = tmp;}}void main()
{ledOne = 1;UartInit();Delay1000ms();Delay1000ms();while(1){Delay1000ms();Read_Data_From_DHT();	sendString("H:");sendByte(datas[0]/10 + 0x30);//43 a sendByte(datas[0]%10 + 0x30);sendByte('.');sendByte(datas[1]/10 + 0x30);//43 a sendByte(datas[1]%10 + 0x30);	sendString("\r\n");	sendString("T:");sendByte(datas[2]/10 + 0x30);//43 a sendByte(datas[2]%10 + 0x30);	sendByte('.');sendByte(datas[3]/10 + 0x30);//43 a sendByte(datas[3]%10 + 0x30);			sendString("\r\n");		}
}

打开串口助手收到温湿度数据:

http://www.lryc.cn/news/165918.html

相关文章:

  • vue3 自定义Hooks
  • 计算机组成与设计硬件软件接口学习1
  • 点云从入门到精通技术详解100篇-基于光谱共焦系统的三维点云数据处理
  • 2023年五一杯数学建模B题快递需求分析问题求解全过程论文及程序
  • 华为云征文|华为云云耀云服务器L实例使用教学(一)
  • 编写算法对输入的一个整数,判断它能否被 3,5,7 整除
  • Linux CentOS7设置时区
  • HBase 记录
  • Fiddler抓http数据
  • 【MySQL】redo log 、 undo log、脏页这些概念是什么?
  • 05ShardingSphere-JDBC水平分片
  • Java多线程并发面试题
  • ELK学习笔记1:简介及安装
  • uniapp——实现电子签名功能——基础积累
  • 【Flink实战系列】Hash collision on user-specified ID “Kafka Source”
  • 面对 HR 的空窗期提问,你会如何回答?
  • 性能测试、负载测试、压力测试、稳定性测试简单区分
  • 如何理解恒流源的阻抗为无穷大
  • 彻底掌握Protobuf编码原理与实战
  • 移动测试之语音识别功能如何测试?
  • Python 图形化界面基础篇:使用网格布局( Grid Layout )排列元素
  • MongoDB副本集搭建
  • 【面试】Redis的热key问题如何发现和解决?
  • LeetCode-热题100-笔记-day21
  • Spring框架中的@Conditional系列注解
  • spring boot + minio 8.5.4 遇到 okhttp3包冲突
  • springboot整合actuator、admin对应用程序进行监控
  • 文举论金:黄金原油全面走势分析策略指导。
  • Fedora CoreOS 安装部署详解
  • Web应用开发 - 实训三 B Servlet基础