stm32之DHT11

news2024/11/17 14:39:15

        今天,记录一下DHT11,涉及到了单总线协议,所以先花点时间谈论一下单总线协议(DS18B20也是用的单总线)。

单总线协议

 在这里插入图片描述

 单总线技术的通信协议

可能这时序图就是个例子,ds18b20的时序图与DHT11的时序图也是不一样的。

 

 DHT11

#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"                  // Device header

#define DHT11_PORT 			GPIOC   
#define DHT11_PIN 			GPIO_Pin_10
#define DHT11_PORT_RCC		RCC_APB2Periph_GPIOC

#define dht11_high GPIO_SetBits(GPIOC, GPIO_Pin_10)
#define dht11_low GPIO_ResetBits(GPIOC, GPIO_Pin_10)
#define Read_Data GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_10)

void DHT11_GPIO_Init_OUT(void);
void DHT11_GPIO_Init_IN(void);
void DHT11_Start(void);
unsigned char DHT11_REC_Byte(void);
void DHT11_REC_Data(void);


#endif
#include "stm32f10x.h"                  // Device header
#include  "dht11.h"
#include  "SysTick.h"
//数据
unsigned int rec_data[4];


//对于stm32来说,是输出
void DH11_GPIO_Init_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOC, &GPIO_InitStructure);

}

//对于stm32来说,是输入
void DH11_GPIO_Init_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING; //浮空输入
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOC, &GPIO_InitStructure);

}


//主机发送开始信号
void DHT11_Start(void)
{
	DH11_GPIO_Init_OUT(); //输出模式
	
	dht11_high; //先拉高
	delay_us(30);
	
	dht11_low; //拉低电平至少18us
	delay_ms(20);
	
	dht11_high; //拉高电平20~40us
	delay_us(30);
	
	DH11_GPIO_Init_IN(); //输入模式,可以说是释放总线
}


//获取一个字节
char DHT11_Rec_Byte(void)
{
	unsigned char i = 0;
	unsigned char data;
	
	for(i=0;i<8;i++) //1个数据就是1个字节byte,1个字节byte有8位bit
	{
		while( Read_Data == 0); //从1bit开始,低电平变高电平,等待低电平结束
		delay_us(30); //延迟30us是为了区别数据0和数据1,0只有26~28us
		
		data <<= 1; //左移
		
		if( Read_Data == 1 ) //如果过了30us还是高电平的话就是数据1
		{
			data |= 1; //数据+1
		}
		
		while( Read_Data == 1 ); //高电平变低电平,等待高电平结束
	}
	
	return data;
}

//获取数据

void DHT11_REC_Data(void)
{
	unsigned int R_H,R_L,T_H,T_L;
	unsigned char RH,RL,TH,TL,CHECK;
	
	DHT11_Start(); //主机发送信号
	dht11_high; //拉高电平
	
	if( Read_Data == 0 ) //判断DHT11是否响应
	{
		while( Read_Data == 0); //低电平变高电平,等待低电平结束
		while( Read_Data == 1); //高电平变低电平,等待高电平结束,耗费掉DHT11的响应输出
		
		R_H = DHT11_Rec_Byte();
		R_L = DHT11_Rec_Byte();
		T_H = DHT11_Rec_Byte();
		T_L = DHT11_Rec_Byte();
		CHECK = DHT11_Rec_Byte(); //接收5个数据
		
		dht11_low; //当最后一bit数据传送完毕后,DHT11拉低总线 50us
		delay_us(55); //这里延时55us
		dht11_high; //随后总线由上拉电阻拉高进入空闲状态。
		
		if(R_H + R_L + T_H + T_L == CHECK) //和检验位对比,判断校验接收到的数据是否正确
		{
			RH = R_H;
			RL = R_L;
			TH = T_H;
			TL = T_L;
		}
	}
	rec_data[0] = RH;
	rec_data[1] = RL;
	rec_data[2] = TH;
	rec_data[3] = TL;
}
像DHT11响应输出,以及DHT11输出的0和1,这些是DHT11内部的控制器发出来的,我们不需要写时序去描述,只需要对DHT11输出的数据进行读取,判断即可
附录:
DHT11详细介绍(内含51和STM32代码)_安赫'的博客-CSDN博客
七、【中级篇】传感器DHT11、DHT22、DS18B20_dht22和dht11比较_十七阿哥的春天的博客-CSDN博客
16 STM32基础学习 DS18B20 温度与DHT11温湿度模块 - 古月居 (guyuehome.com)
【通信协议】1-Wire 单总线_淹死的大白鲨的博客-CSDN博客
DHT11 温湿度传感器_比特冬哥的博客-CSDN博客

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

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

相关文章

服务器中了mkp勒索病毒该怎么办?勒索病毒解密,数据恢复

mkp勒索病毒算的上是一种比较常见的勒索病毒类型了。它的感染数量上也常年排在前几名的位置。所以接下来就由云天数据恢复中心的技术工程师来对mkp勒索病毒做一个分析&#xff0c;以及中招以后应该怎么办。 一&#xff0c;中了mkp勒索病毒的表现 桌面以及多个文件夹当中都有一封…

mysql基础——认识索引

一、介绍 “索引”是为了能够更快地查询数据。比如一本书的目录&#xff0c;就是这本书的内容的索引&#xff0c;读者可以通过在目录中快速查找自己想要的内容&#xff0c;然后根据页码去找到具体的章节。 二、优缺点 优势&#xff1a;以快速检索&#xff0c;减少I/O次数&am…

TMP: 利用std::tuple完成运行期的if...else替换

code client code 参考链接&#xff1a; std::tuple std::tuple_size std::tuple_element

接口测试-快问快答你能做对几道【含答案】

1、做接口测试当请求参数多时tps下降明显&#xff0c;此接口根据参数从redis中获取数据&#xff0c;每个参数与redis交互一次&#xff0c;当一组参数是tps5133&#xff0c;五组参数是tps1169&#xff0c;多次交互影响了处理性能&#xff0c;请详细阐述如何改进增进效果的方案。…

AD(第二部分---绘制原理图库及编译检查)

设计电路-----器件选型----绘制原理图----->先有"BOOM"&#xff0c;后更改AD封装 10.元件的放置&#xff1a; 当有多个元件库&#xff0c;选择某一个时&#xff0c;需要点击右下角"Panels"&#xff0c;之后点击Components。如下图&#xff1a; 之后双击…

基于机器视觉的旋转编码器缺陷检测

基于机器视觉的旋转编码器缺陷检测 1 背景及意义 旋转编码器是用来测量转速并配合PWM技术可以实现快速调速的装置,基本上每一个伺服电机都有一个旋转编码器。旋转编码器的质量将直接影响到伺服电机的好坏,所以每一个旋转编码器出厂前都要经过严格的质检。 传统的检测方法是…

价值30K的硬核性能测试面试题

如何判断java应用程序内存泄漏&#xff1f; Java应用程序内存泄漏是指程序中的某些对象在不再需要时仍然占用内存&#xff0c;导致内存消耗不断增加并最终导致程序崩溃或性能下降。以下是一些判断Java应用程序内存泄漏的方法&#xff1a; 监控内存使用情况&#xff1a;使用Jav…

机器学习笔记 - 基于OpenMMLab在自定义数据集上训练RTMDet网络

一、什么是 RTMDet? RTMDet是一种高效的实时目标检测器,其自报告指标优于YOLO 系列。它在COCO上实现了52.8% 的 AP ,在 NVIDIA 3090 GPU 上实现了300+ FPS,使其成为当前号称最快、最准确的目标检测器之一。 RTMDet 与其他实时物体检测器的对比。 RTMDet 采用了一种…

云安全攻防(十三)之 使用minikube安装搭建 K8s 集群

使用minikube安装搭建 K8s 集群 Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化,一般来说K8s安装有三种方式&#xff0c;分别是Minikube装搭建 K8s 集群&#xff0c;特点是只有一个节点的集群&…

解锁时尚潮流,畅享短视频商城新体验

近年来&#xff0c;随着短视频媒体的兴起和时尚潮流的盛行&#xff0c;人们对于探索潮流趋势和购物方式的需求也不断增长。为满足用户的需求&#xff0c;越来越多的短视频商城应运而生。这些商城不仅为用户提供了一站式的购物平台&#xff0c;还提供了独特的时尚潮流推荐和体验…

隧道车辆定位

针对隧道车辆定位&#xff0c;使用超宽带&#xff08;UWB&#xff09;技术是一个可行的方案。以下是一个可能的隧道UWB车辆定位方案&#xff1a; UWB基站布置&#xff1a;在隧道内部或隧道入口/出口布置UWB基站。这些基站通过发送和接收UWB信号来实现车辆的定位。 车载UWB设备…

分布式事务篇-2.1 阿里云轻量服务器--Docker--部署Seata

文章目录 前言一、Seata 介绍二、Docker 部署&#xff1a;2.1.拉取镜像&#xff1a;2.2.运行镜像&#xff1a;2.3.拷贝配置文件&#xff1a;2.4.部署&#xff1a;2.5.参数解释&#xff1a;2.5.1 端口&#xff1a;2.5.2 SEATA_IP&#xff1a;2.5.3 SEATA_PORT&#xff1a;2.5.4 …

怎么做用二维码收集数据?问卷码在线生成技巧

在收集用户信息时&#xff0c;一般会通过制作表单的方式&#xff0c;将问题整理处理&#xff0c;让用户选择或者填写&#xff0c;那么现在比较流行的一种方式就是将表单生成二维码&#xff0c;让他人可以通过扫码来填写表单数据。那么使用二维码生成器来制作表单二维码的方法相…

word文档中输入“打钩”的4种方法

我们利用Word来制作一些填写单、待办表、计划表类的文档时&#xff0c;都会输入一些特殊符号&#xff0c;比如方框内“打钩”的勾选符号&#xff0c;那么这个符号应该怎么输入呢&#xff1f; 接下来&#xff0c;我就给你们介绍几种简单实用的方法&#xff0c;其中第三种是小编…

数据库的增量备份与差异备份

在当今数字时代&#xff0c;数据已经成为公司的主要资产。为了维护这些珍贵的数据&#xff0c;公司通常会采取各种数据保护措施&#xff0c;其中增量备份是一种很有效的方法。本文将详细介绍什么是数据库的增量备份&#xff0c;以及如何帮助企业更有效地维护数据。  我们需要…

双指针算法总结

双指针算法大致有以下几个类型 对撞指针&#xff1a;一般用来处理两数和问题快慢指针&#xff1a; 一般在链表中用的比较多&#xff0c;如求链表中间结点&#xff0c;链表是否有环等&#xff0c;当然一些非链表题也会用到相关的思想区间划分&#xff1a; 将数组分成两个不同性质…

生产作业标准化是什么?生产车间作业流程标准化的步骤

生产作业标准化是以精益化为目标&#xff0c;对现行作业方法进行量化细化的分析改善&#xff0c;最终形成优化后的更好的作业程序。标准化的作用主要是以文件的方式保存企业成员积累的技术和经验&#xff0c;而不是因为人员的流动而失去整个技术和经验。 生产作业标准化的实施非…

聚观早报|微博Q2营收31.4亿元;新能源车新一轮价格战再打响

【聚观365】8月25日消息 微博Q2营收31.4亿元 新能源车新一轮价格战再打响 网易云音乐上半年净利润3.32亿元 万物云上半年盈利10.5亿元 有道2023年Q2净收入12.1亿元 微博Q2营收31.4亿元 微博发布2023年第二季度财报。二季度微博总营收4.402亿美元&#xff0c;约合31.4亿元…

RabbitMQ集群搭建和测试总结_亲测

RabbiMQ简介 RabbitMQ是用Erlang开发的&#xff0c;集群非常方便&#xff0c;因为Erlang天生就是一门分布式语言&#xff0c;但其本身并不支持负载均衡。 RabbitMQ模式 RabbitMQ模式大概分为以下三种: (1)单一模式。 (2)普通模式(默认的集群模式)。 (3)镜像模式(把需要的队列…

python scrapy框架

scrapy概述 Scrapy&#xff0c;Python开发的一个快速、高层次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛&#xff0c;可以用于数据挖掘、监测和自动化测试 scrapy安装 pip install scrapy -i https://pypi.tuna.tsinghua…