DHT11温度检测系统

DHT11温湿度传感器

  1. 产品概述

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

    在这里插入图片描述

  2. 特点

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

    在这里插入图片描述

  4. 数据传送逻辑

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

  5. 数据格式

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

    在这里插入图片描述

检测模块是否存在

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

在这里插入图片描述

时序逻辑分析:

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

代码实现

#include "reg52.h"
#include "intrins.h"

sbit led1 = P3^7;
sbit dht = P3^3;//温度传感器


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 check()
{
	//a : dht = 1
	dht = 1;
	//b :dht = 0
	dht = 0;
	//延时30ms
	Delay30ms();
	//c: dht = 1
	dht = 1;
	//在60us后读d点,如果d点是低电平(被模块拉低),说明模块存在!
	Delay60us();
	if(dht == 0){
		led1 = 0;//小灯亮
	}
}
void main()
{
	led1 = 1;
	Delay1000ms();
	Delay1000ms();
	check();
	while(1);
}

DHT11模块检测温湿度

在这里插入图片描述

DHT11传输0的时序分析

在这里插入图片描述

DHT11传输1的时序分析

在这里插入图片描述

代码实现

#include "reg52.h"
#include "intrins.h"

#define BUFF P0

sfr AUXR = 0x8E;
sbit led1 = P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
sbit dht = P3^3;//温度传感器
/*
控制线接口:
RS -- P1.0
RW -- P1.1
E -- P1.4
*/
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;

char datas[5] = 0;
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 Delay40us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 15;
	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 Delay15ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 27;
	j = 226;
	do
	{
		while (--j);
	} while (--i);
}
void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 9;
	j = 244;
	do
	{
		while (--j);
	} while (--i);
}
void DHT11_start()//启动DHT11模块开始检测
{
	dht = 1;
	dht = 0;
	//延时30ms
	Delay30ms();
	dht = 1;
	//卡d点;while(dht); 卡e点 while(!dht) 卡f点:while(dht) 
	while(dht);
	while(!dht);
	while(dht);
}
void get_Data()
{
	int i;
	int j;
	char tmp;
	char flag;
	DHT11_start();//每次检测得到40bit数据后都要再启动一次
	for(i=0;i<5;i++){
		for(j=0;j<8;j++){
			//卡g点:while(!dht) 
			while(!dht);
			//有效数据都是高电平,持续时间不一样,40us读,低电平数据为0 高电平数据为1
			Delay40us();
			if(dht == 1){
				flag = 1;
				while(dht);
			}else{
				flag = 0;
			}
			tmp <<= 1;
			tmp |= flag;
		}
		datas[i] = tmp;
	}
}
void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;//提升系统EMI性能
	PCON = 0x00;//SMOD0 = 0时SCON中的SM0,和SM1一起指定串行口的工作方式
	SCON = 0x40;//串口工作方式1,且REN=0,禁止串口接收
	
	TMOD &= 0x0F;
	TMOD |= 0x20;//定时器1的工作方式8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;//9600bps的TH1初值
	TR1 = 1;//启动定时器
}
void send_byte(char data_msg)
{
	SBUF = data_msg;
	while(!TI);
	TI = 0;
}
void send_str(char* data_msg)
{
	while(*data_msg != '\0'){
		send_byte(*data_msg);
		data_msg++;
	}
}
void check_busy()//每次写指令,读/写数据操作均需要检测忙信号
{
	char tmp = 0x80;
	BUFF = 0x80;
	while(tmp & 0x80){
		RS = 0;
		RW = 1;
		EN = 0;
		_nop_();
		EN = 1;
		_nop_();
		tmp = BUFF;
		_nop_();
		_nop_();
		EN = 0;
		_nop_();
	}
}
void Write_cmd(char cmd)//写指令
{
	check_busy();
	RS = 0;
	RW = 0;
	
	EN = 0;
	_nop_();
	BUFF = cmd;
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;
	_nop_();
}
void Write_data(char _data)//写数据
{
	check_busy();
	RS = 1;
	RW = 0;
	
	EN = 0;
	_nop_();
	BUFF = _data;
	_nop_();
	EN = 1;
	_nop_();
	_nop_();
	EN = 0;
	_nop_();
}
void LCD1602_init()//模块初始化
{
	//(1)延时 15ms
	Delay15ms();
	//(2)写指令 38H(不检测忙信号)
	Write_cmd(0x38);
	//(3)延时 5ms
	Delay5ms();
	//(4)以后每次写指令,读/写数据操作均需要检测忙信号
	//(5)写指令 38H:显示模式设置
	Write_cmd(0x38);
	//(6)写指令 08H:显示关闭
	Write_cmd(0x08);
	//(7)写指令 01H:显示清屏
	Write_cmd(0x01);
	//(8)写指令 06H:显示光标移动设置
	Write_cmd(0x06);
	//(9)写指令 0CH:显示开及光标设置
	Write_cmd(0x0c);

}
void LCD1602_print_line(char line,char col,char *string)//写入一行数据
{
	switch(line){//switch选择那一行
		case 1:
			Write_cmd(0x80+col);//col 决定从哪个地方开始
			while(*string){
				Write_data(*string);
				string++;
			}
			break;
		case 2:
			Write_cmd(0x80+0x40+col);
			while(*string){
				Write_data(*string);
				string++;
			}
			break;
	}
}
void main()
{
	led1 = 1;
	UartInit();
	Delay1000ms();
	Delay1000ms();

	while(1){
		Delay1000ms();
		get_Data();
		send_str("Wet:");
		//数字加上0x30,装变成对应的字符
		send_byte(datas[0]/10 + 0x30);//湿度十位
		send_byte(datas[0]%10 + 0x30);//湿度个位
		send_byte('.');
		send_byte(datas[1]/10 + 0x30);//小数位
		send_byte(datas[1]%10 + 0x30);
		send_str("\r\n");
		send_str("Tem:");
		send_byte(datas[2]/10 + 0x30);//温度十位
		send_byte(datas[2]%10 + 0x30);//温度个位
		send_byte('.');
		send_byte(datas[3]/10 + 0x30);//小数位
		send_byte(datas[3]%10 + 0x30);
		send_str("\r\n");
		
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/527176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

好物推荐:六款让人眼前一亮的个人博客

1.前言 总是有人在问零基础如何搭建个人博客、有哪些好用的博客系统推荐、个人博客和国内技术社区怎么选择&#xff1f;诸如此类的很多问题。对于最后一个问题&#xff0c;我个人的看法很简单&#xff0c;看需求&#xff01; 目前国内做的还不错的技术类社区/论坛其实还是比较…

stack和queue的使用

前言 前面我们对string、vector、list做了介绍并对底层进行了实现&#xff01;本期我们继续来介绍STL容器&#xff0c;stack和queue&#xff01; 本期内容介绍 stack 常用接口的介绍 queue 常用接口的介绍 什么是stack? 这里的栈和我们C语言实现的数据结构的那个栈功能是一样…

RabbitMQ-死信队列常见用法

目录 一、什么是死信 二、什么是死信队列 ​编辑 三、第一种情景&#xff1a;消息被拒绝时 四、第二种场景&#xff1a;. 消费者发生异常&#xff0c;超过重试次数 。 其实spring框架调用的就是 basicNack 五、第三种场景&#xff1a; 消息的Expiration 过期时长或队列TTL…

neo4j使用详解(十一、cypher自定义函数语法——最全参考)

Neo4j系列导航&#xff1a; neo4j安装及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 neo4j索引及调优 10.自定义函数 用户定义函数用Java编写&#xff0c;部署到数据库中&#xff0c;并以与任何其他Cypher函数相同的…

Java变量详解

​ 这里写目录标题 第一章、Java中的变量分类1.1&#xff09;变量分类1.2&#xff09;成员变量分类1.3&#xff09;成员变量和局部变量的区别 第二章、成员变量详解2.1&#xff09;成员变量作用域/权限修饰符2.2&#xff09;成员变量和成员属性的区别2.3&#xff09;成员变量初…

网络通信流程

建立完tcp请求再发起http请求 开启系统代理之后&#xff0c;以clash verge为例 127.0.0.1:7897&#xff0c;假设hci.baidu.com的IP为153.37.235.50 发起对hci.baidu.com的HTTP请求&#xff0c;由于开启了系统代理不进行DNS解析&#xff0c;浏览器调用socket()获得一个socket&a…

GlusterFS(GFS)分布式文件系统

一、GlusterFS的概述&#xff1a; GlusterFS 是一个开源的分布式文件系统。 只在扩展存储容器&#xff0c;提高性能 并且通过多个互联网络的存储节点的进行几余&#xff0c;以确保数据的可用性和一致性 由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c…

软考中级之软件设计师---知识点汇总总结

软考中级之软件设计师---知识点汇总总结 软考介绍资格设置证书样本 计算机组成原理操作系统1. 进程的三态模型2. 磁盘调度算法 计算机网络1. 网络的分类2. 各层的互连设备3. 网络模型&#xff0c;协议簇4. 传输层协议TCP、UDP4.1 TCP (Transmission Control Protocol,传输控制协…

零代码与低代码开发平台

1、什么是低代码开发平台&#xff1f;什么是零代码开发平台&#xff1f; 零代码开发平台&#xff1a; 指的是不需要写代码就能够快速开发出业务应用/系统的平台。我们在工作中使用的业务应用&#xff0c;主要提供数据收集、数据处理、数据流转和展示等功能。零代码开发平台能够…

【超重磅牛市信号】减半倒计时12天!首波抛售潮接近尾声,大暴涨将如期而至!

3月&#xff0c;美国CPI环比出现小幅反弹由3.1%升至3.2%&#xff0c;美国制造业指数PMI反弹至50.3%呈现进入扩张期的态势&#xff0c;日本结束长达8年的负利率时代首次加息。这导致美国4月降息概率大幅下降&#xff0c;5月降息概率也跌至50%以下。 尽管如此&#xff0c;全球金融…

C#操作MySQL从入门到精通(8)——对查询数据进行高级过滤

前言 我们在查询数据库中数据的时候,有时候需要剔除一些我们不想要的数据,这时候就需要对数据进行过滤,比如学生信息中,我只需要年龄等于18的,同时又要家乡地址是安徽的,类似这种操作专栏第7篇的C#操作MySQL从入门到精通(7)——对查询数据进行简单过滤简单过滤方法就无法…

STL优先队列比较器

有两个比较器&#xff0c;在std里面&#xff0c;一个是greater&#xff0c;一个是less&#xff0c;他们都有一个可以指定的模板类型。 #include <bits/stdc.h> using namespace std; struct node {bool operator ()(const string& a, const string& b){return a…

蓝桥杯刷题-特殊年份

特殊年份 代码&#xff1a; def f(x)->bool:s list(x)if s[0]s[2] and int(s[1])1int(s[3]):return Trueelse:return False cnt 0 for _ in range(5):if f(input()):cnt1 print(cnt)

PC端音乐神器-解锁全网限制

打软件后就能发现&#xff0c;软件不需要我们登录&#xff0c;就可以使用,下载地址&#xff1a;PC端音乐神器.zip

什么是sso?

SSO&#xff08;Single Sign-On&#xff09;&#xff0c;即单点登录&#xff0c;是一种安全协议&#xff0c;它允许用户在多个应用程序之间使用同一组登录凭据进行身份验证。这意味着用户只需要登录一次&#xff0c;就可以访问多个需要身份验证的应用程序。 SSO的工作原理如下…

[C++][算法基础]合并集合(并查集)

一共有 n 个数&#xff0c;编号是 1∼n&#xff0c;最开始每个数各自在一个集合中。 现在要进行 m 个操作&#xff0c;操作共有两种&#xff1a; M a b&#xff0c;将编号为 a 和 b 的两个数所在的集合合并&#xff0c;如果两个数已经在同一个集合中&#xff0c;则忽略这个操…

【JavaEE】_Spring MVC项目获取Header

目录 1. 使用Servlet原生方法获取Header 2. 使用Spring注解获取Header 1. 使用Servlet原生方法获取Header .java文件内容如下&#xff1a; package com.example.demo.controller;import com.example.demo.Person; import org.springframework.web.bind.annotation.*; impor…

【C++进阶】用哈希实现unordered_set和unordered_map的模拟

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 前言&#xff1a; 之前我…

网络安全 | 什么是区块链?

关注WX&#xff1a;CodingTechWork 概述 定义 区块链是一个共享的、不可篡改的账本&#xff0c;旨在促进业务网络中的交易记录和资产跟踪流程。资产可以是有形的&#xff08;如房屋、汽车、现金、土地&#xff09;&#xff0c;也可以是无形的&#xff08;如知识产权、专利、…

leetcode代码记录(最长连续递增序列

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定…