【 DHT11 温湿度传感器】使用STC89C51读取发送到串口、通过时序图编写C语言

news2024/11/25 13:20:44

文章目录

  • DHT11 温湿度传感器
    • 概述
    • 接线
    • 数据传送
      • 通讯过程时序图
      • 检测模块是否存在
    • 代码实现
    • 总结
      • 对tmp = tmp << 1;的理解
      • 对sendByte(datas[0]/10 + 0x30);的理解

DHT11 温湿度传感器

使用80C51单片机通过读取HDT11温湿度传感的数据,发送到串口。
通过时序图编写相应的C语言代码。
总结

概述

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

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,内部由一个 8 位单片机控制一个电阻式感湿元件和一个 NTC 测温元件。DHT11 虽然也是采用单总线协议,但是该协议与 DS18B20 的单总线协议稍微有些不同之处。
相比于 DS18B20 只能测量温度,DHT11 既能检测温度又能检测湿度,不过 DHT11 的精度和测量范围都要低于 DS18B20,其温度测量范围为 0~50℃,误差在±2℃;湿度的测量范围为 20%~90%RH(Relative Humidity 相对湿度—指空气中水汽压与饱和水汽压的百分比),误差在±5%RH。DHT11 电路很简单,只需要将 DATA 引脚连接单片机的一个 I/O 即可,不过该引脚需要上拉一个 5K 的电阻,DHT11 的供电电压为 3~5.5V

在这里插入图片描述

接线

在这里插入图片描述

数据传送

只有一根数据线DATA,单片机发送序列指令给DHT11模块,模块一次完整的数据传输为40bit,高位先
数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验

通讯过程时序图

在这里插入图片描述

因为只有一根数据线DATA,所以传输数据“0”、“1”是根据高电平的时间长短得出

检测模块是否存在

根据如下时序图,做通信初始化,并检测模块是否存在,功能是否正常
在这里插入图片描述

代码实现

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

sbit ledOne = P3^7;
sbit dht = P3^3;//模块的data插在p3.3

char 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;
	//延时30ms
	Delay30ms();
	dht = 1;
	
	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++){
		//: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");		
	}
}

总结

对tmp = tmp << 1;的理解

对这两句代码的理解

			tmp = tmp << 1;
			tmp |= flag;

这两句代码用于将读取到的每一位数据拼接成一个字节(8位)的数据

  • tmp 是一个字节变量,用于存储一个完整的8位数据。
  • tmp << 1 表示将 tmp 中的所有位向左移动一位。
  • 左移一位相当于将 tmp 的二进制数乘以2,并在最右边的位填充0。例如,如果 tmp 当前值是 00101100,左移一位后变成
    01011000。
    这一步的作用是为即将读取的下一位数据腾出位置。
  • flag 是一个位变量,用于存储当前读取到的1位数据(值为0或1)
  • tmp |= flag 表示将 flag 的值合并到 tmp 的最右边的位。
  • | 是按位或操作符,如果对应位置上有一个1,结果就是1。

例如,如果 tmp 当前值是 01011000,而 flag 是 1,那么 tmp |= flag 后的值是 01011001。如果 flag 是 0,那么 tmp 仍然是 01011000
假设 tmp 初始为 00000000,我们依次读取8位数据 1, 0, 1, 1, 0, 0, 1, 0。每次读取位后进行左移和按位或操作:
读取第1位(flag = 1):tmp = tmp << 1 -> tmp = 00000000,tmp |= 1 -> tmp = 00000001
读取第2位(flag = 0):tmp = tmp << 1 -> tmp = 00000010,tmp |= 0 -> tmp = 00000010
读取第3位(flag = 1):tmp = tmp << 1 -> tmp = 00000100,tmp |= 1 -> tmp = 00000101

对sendByte(datas[0]/10 + 0x30);的理解

  • datas[0]/10:

这是一个整数除法操作,将 datas[0] 的十位数提取出来。例如,假设 datas[0] = 43,则 43 / 10 = 4。

  • 0x30:

在ASCII编码中,数字字符是从 0x30(‘0’)开始的。‘0’ 的ASCII码是 0x30,‘1’ 的ASCII码是 0x31,以此类推。
因此,通过加上 0x30,我们将数值4转换为字符’4’。具体地,4 + 0x30 = 0x34,对应的ASCII字符是’4’。

这种写法 sendByte(datas[0]/10 + 0x30); 的目的是将数值转换为对应的ASCII字符,以便通过串口发送并在终端显示。具体地,通过除以10和取模10操作分别提取十位和个位,并加上 0x30 将数值转换为字符'0'到'9'的ASCII码,

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下lapack的编译

文章目录 LAPACK库LAPACK库的地址LAPACK库的安装和编译 LAPACK库 LAPACK&#xff08;Linear Algebra PACKage&#xff09;库&#xff0c;是用Fortran语言编写的线性代数计算库&#xff0c;包含线性方程组求解&#xff08;AXb&#xff09;、矩阵分解、矩阵求逆、求矩阵特征值、…

javac详解 idea maven内部编译原理 自制编译器

起因 不知道大家在开发中&#xff0c;有没有过下面这些疑问。有的话&#xff0c;今天就一次解答清楚。 如何使用javac命令编译一个项目&#xff1f;java或者javac的一些参数到底有什么用&#xff1f;idea或者maven是如何编译java项目的&#xff1f;&#xff08;你可能猜测底层…

4核16G服务器支持多少人?4C16G服务器性能测评

租赁4核16G服务器费用&#xff0c;目前4核16G服务器10M带宽配置70元1个月、210元3个月&#xff0c;那么能如何呢&#xff1f;配置为ECS经济型e实例4核16G、按固定带宽10Mbs、100GB ESSD Entry系统盘。 那么问题来了&#xff0c;4C16G10M带宽的云服务器可以支持多少人同时在线&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日派对座位安排(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

原神运行闪退报错怎么办解决办法 crossover24运行exe游戏程序错误没反应

对于Mac用户来说&#xff0c;能够在Mac上体验Windows游戏是一种极大的便利。然而&#xff0c;当尝试运行热门游戏《原神》时&#xff0c;一些用户可能会遇到闪退或报错的问题。这不仅影响了游戏体验&#xff0c;也让人倍感挫败。幸运的是&#xff0c;有多种方法可以帮助解决这些…

优化德育评估流程:智慧职校的考核类型设置功能

智慧职校德育管理系统的引入标志着教育领域向着更加智能化、高效化方向迈进的重要一步。其中&#xff0c;考核类型设置功能作为系统的核心模块之一&#xff0c;扮演着不可或缺的角色。这一功能的创新之处在于它赋予了学校前所未有的灵活性和自主权&#xff0c;让教育者能够根据…

PyTorch的自动微分模块【含梯度基本数学原理详解】

文章目录 1、简介1.1、基本概念1.2、基本原理1.2.1、自动微分1.2.2、梯度1.2.3、梯度求导1.2.4、梯度下降法1.2.5、张量梯度举例 1.3、Autograd的高级功能 2、梯度基本计算2.1、单标量梯度2.2、单向量梯度的计算2.3、多标量梯度计算2.4、多向量梯度计算 3、控制梯度计算4、累计…

【香橙派开发板测试】:在黑科技Orange Pi AIpro部署YOLOv8深度学习纤维分割检测模型

文章目录 &#x1f680;&#x1f680;&#x1f680;前言一、1️⃣ Orange Pi AIpro开发板相关介绍1.1 &#x1f393; 核心配置1.2 ✨开发板接口详情图1.3 ⭐️开箱展示 二、2️⃣配置开发板详细教程2.1 &#x1f393; 烧录镜像系统2.2 ✨配置网络2.3 ⭐️使用SSH连接主板 三、…

KAFKA搭建教程

KAFKA搭建教程 期待您的关注 KAFKA学习笔记 帮助更多人 目录 KAFKA搭建教程 1.下载Kafka并解压 2.添加环境变量 3.修改 server.properties 文件 4.将kafka复制到其它节点 5.修改node1、node2节点的broker.id 6.将master的环境变量同步到node1、 node2 7.启动zookeeper…

网络需求实验报告

拓扑图 需求 1、通过DHCP服务&#xff0c;给PC4和PC5分配IP地址、网关、掩码、DNS服务器IP地址 2、Client-1要求手工配置IP地址&#xff0c;为192.168.1.1, c 3、telnet客户端可以远程登录telnet服务器进行设备管理&#xff0c;并成功修改telnet服务器的名字为123 &#xff0c…

Dev—c++小熊猫6.7.5免费下载攻略

点击蓝字 关注我们 今天我来给大家分享一个Dev—c小熊猫6.7.5免费下载攻略&#xff0c;内容如下 1. https://gitee.com/royqh1979/Dev-CPP/releases/tag/v6.7.5 点进这一个官网&#xff0c;一直往下滑&#xff0c;找到第三个选项&#xff0c;把它下载下来。 2. 安装时一些选择…

phpstorm无法实现代码反向追踪 字体变黄(Ctrl+鼠标左键向上一级追踪)问题解决

方法一、.将项目里面的.idea文件删除掉&#xff0c;重新进入phpstorm&#xff0c;这个时候会重新对项目进行编制索引等操作&#xff0c;就会神奇的发现&#xff0c;可以正常追踪了。 当方法一不行时&#xff0c;可以使用方法二 方法二、File->invalidate Caches 去除缓存

Android中Activity生命周期详解

目录 一 典型情况二 异常情况2.1 系统配置改变2.2 系统资源不足kill掉低优先级activity Activity是四大组件之一&#xff0c;也是接触的最多的&#xff0c;一般来说Activity经常是与用户交互的界面。 一 典型情况 先看下google官网&#xff0c;其实已经很清楚了 再来个总结 …

分享一个好用的AI 动漫图片工具 - AI Anime Generator,输入文字,1分钟生成动漫图片_AI绘画工具

使用AI绘画工具&#xff0c;1分钟生成动漫图片-AI Anime Generator 分享一个AI生成动漫图片的网站。输入prompt&#xff0c;即可一键自动生成AI动漫图片。 网站名称&#xff1a;AI Anime Generator 工具地址&#xff1a;https://aianimegenerator.top 网站界面比较简洁&…

AQS和ReentrantLock源码剖析

AbstratQuenedSynchronizer抽象队列同步器 一. 简单理解 源码讲解视频 博客 核心参数 变量state &#xff1a;没加锁state0&#xff0c;加锁state1加锁线程&#xff1a;CAS 设置state1 加锁过程 尝试state的值由0变为1&#xff0c;如果发现state的值已经不为0了而是1&am…

C语言图书馆管理系统

以下是系统部分页面 以下是部分源码&#xff0c;需要源码的私信 #include<stdio.h> #include<stdlib.h> #include <string.h> #include<malloc.h>typedef struct {char student_name[100];char student_number[100];char password[100];int total_bor…

【一刷《剑指Offer》】面试题 46:求 1+2+...+n

力扣对应题目链接&#xff1a;LCR 189. 设计机械累加器 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;求123...n_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》对应内容 二、分析题目 通常实现递归的时候我们都会利用条件判断语句来决定递归的出…

计算机体系结构||Cache性能分析(4)

实验4 Cache性能分析 4.1实验目的 &#xff08;1&#xff09;加深对Cache基本概念、基本组织结构以及工作原理的理解。 &#xff08;2&#xff09;掌握Cache容量、相关度、块大小对Cache性能的影响 &#xff08;3&#xff09;掌握降低Cache不命中率的各种方法以及它们对提高…

初识网络基础知识

关于网络的一些核心概念 局域网 局域网&#xff08;Local Area Network&#xff0c;简称LAN&#xff09;是一种计算机网络&#xff0c;覆盖的范围通常是相对较小的地理区域&#xff0c;比如一个办公室、一栋大楼或一个校园。 局域网的组成通常包括以下部分&#xff1a; 网络…

Docker Desktop Windows 目录介绍

D:\docker\DockerDesktopWSL\main\ext4.vhdx 和 D:\docker\DockerDesktopWSL\data\ext4.vhdx 是 Docker Desktop 在 Windows Subsystem for Linux&#xff08;WSL&#xff09;中使用的虚拟硬盘文件&#xff0c;它们有不同的用途和作用。 虚拟硬盘文件&#xff08;VHDX&#xf…