STM32 HAL DHT11驱动程序

DHT11驱动程序会占用TIM3定时器,进行高精度延时。程序共包含4个文件 

DHT11.c DHT11.h delay.c delay.h

DHT11.c

#include "stm32f1xx_hal.h"
#include "dht11.h"
#include "delay.h"  // 添加延时头文件
#define DHT_PORT  GPIOB
#define DHT_PIN  GPIO_PIN_10
//配置A9为输出模式
void DHT11_Output_Mode(void)
{GPIO_InitTypeDef GPIO_InitStructure;__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStructure.Pin   = DHT_PIN; 	GPIO_InitStructure.Mode  = GPIO_MODE_OUTPUT_PP;	//推挽输出GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStructure.Pull  = GPIO_NOPULL;HAL_GPIO_Init(DHT_PORT, &GPIO_InitStructure);
}
//配置A9为输入模式
void DHT11_Input_Mode(void)
{GPIO_InitTypeDef GPIO_InitStructure;__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStructure.Pin   = DHT_PIN; 	//9号引脚GPIO_InitStructure.Mode  = GPIO_MODE_INPUT;  //浮空输入GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStructure.Pull  = GPIO_NOPULL;HAL_GPIO_Init(DHT_PORT, &GPIO_InitStructure);
}//A9输出电平0/1
void DHT11_DQ_OUT(uint8_t BitValue)
{HAL_GPIO_WritePin(DHT_PORT, DHT_PIN, (GPIO_PinState)BitValue);
}//A9读取输入电平0/1
uint8_t DHT11_DQ_IN(void)
{return HAL_GPIO_ReadPin(DHT_PORT, DHT_PIN);
}//DHT11复位信号
void DHT11_Reset(void)
{DHT11_Output_Mode();DHT11_DQ_OUT(0);//拉低DQ,复位信号的开始delay_ms(20);//拉低至少18msDHT11_DQ_OUT(1);// 将DHT11的DQ引脚拉高,结束复位信号delay_us(25); //在拉高DQ之后,DHT11会开始其内部复位过程,拉高20-40us
}//检测是否有DHT11存在,0存在,1不存在
uint8_t DHT11_Check(void)
{uint8_t retry = 0;//初始为0,用来重复计次DHT11_Input_Mode();//设置PA9为输入模式,接收DHT11信号// 等待DHT11拉低DQ引脚,这通常发生在复位信号之后的40-80微秒内while(DHT11_DQ_IN() && retry < 100)//DHT拉低40-80us{retry++;//每次循环计次加一delay_us(1);}//如果在计次100次内没有被拉低,返回1则认为DHT11没有响应,否则重置计次变量为0,//为下一次等待阶段做准备if(retry >= 100) return 1; else {retry = 0;}// 等待DHT11拉高DQ引脚,在拉低之后的40-80微秒内// 如果DQ在100次重试内没有被拉高,同样认为DHT11没有正确响应while(!DHT11_DQ_IN() && retry < 100)//DHT会再拉高40-80us{retry++;delay_us(1);}if(retry >= 100) return 1;return 0;}
//检测DHT11是否响应,1无,0有
uint8_t DHT11_Init(void)
{DHT11_Output_Mode();//DHT11_Rst函数中也执行,但为了确保在复位之前引脚状态正确,再次设置DHT11_Reset();//重置DHT11return DHT11_Check();//检测是否DHT11响应
}//读取一个位1/0
uint8_t DHT11_Read_Bit(void)
{uint8_t retry = 0;while(DHT11_DQ_IN() && retry < 100)//DHT会拉低40-80us{retry++;delay_us(1);}retry = 0;while(!DHT11_DQ_IN() && retry < 100)//DHT会拉低40-80us{retry++;delay_us(1);}// 根据DHT11的通信协议,拉高DQ引脚后会保持一段时间// 对于数据位1,DQ引脚会在50微秒内保持高电平;对于数据位0,DQ引脚会在30微秒内拉低// 取中间值等待40微秒delay_us(40);if(DHT11_DQ_IN()) return 1;else return 0;
}
//读取一个字节
uint8_t DHT11_ReadByte(void)
{uint8_t i,Dat = 0;for(i = 0; i < 8; i++){Dat <<= 1;Dat |= DHT11_Read_Bit();//Dat某一位或运算上1必定为1,或上0位不变}return Dat;
}
//temp温度数据范围0-50度
//humi湿度数据范围20-90%
//指向存储温度数据的uint8_t变量的指针temp,
//指向存储湿度数据的uint8_t变量的指针humi
//返回值0表示读取成功,1读取失败
uint8_t DHT11_ReadData(uint8_t * temp,uint8_t *humi)
{uint8_t DHT11_Buff[5];//用来存读取DHT11得到的5个字节数据uint8_t i;DHT11_Reset();//复位DHT11if(DHT11_Check() == 0)//如果存在DHT11,读取温湿度数据{for(i = 0;i < 5;i++){DHT11_Buff[i] = DHT11_ReadByte();}//验证数据的完整性,计算前4个字节的和与第5个字节校验和进行比较if(DHT11_Buff[0] + DHT11_Buff[1] + DHT11_Buff[2] + DHT11_Buff[3] ==         DHT11_Buff[4]){*temp = DHT11_Buff[2];//温度整数数据*humi = DHT11_Buff[0];//湿度整数数据//小数部分为0不用读取}}else{return 1;//读取失败}return 0;//存在DHT11
}

DHT11.h

#ifndef  __DHT11_H__
#define	 __DHT11_H__
#include<stdint.h>
#include "delay.h"// DHT11初始化函数,检测传感器是否存在
// 返回0表示存在,返回1表示不存在
uint8_t DHT11_Init(void);// 配置DHT11数据引脚为输入模式
// 用于读取DHT11发送的数据
void DHT11_Input_Mode(void);// 配置DHT11数据引脚为输出模式
// 用于向DHT11发送命令信号
void DHT11_Output_Mode(void);// 控制DHT11数据引脚输出高低电平
// 参数BitValue: 0表示输出低电平,1表示输出高电平
void DHT11_DQ_OUT(uint8_t BitValue);// 读取DHT11数据引脚的电平状态
// 返回值: 0表示低电平,1表示高电平
uint8_t DHT11_DQ_IN(void);// 发送复位信号给DHT11
// 拉低数据线至少18ms,然后拉高20-40us,启动DHT11
void DHT11_Reset(void);// 检测DHT11是否响应复位信号
// 返回0表示DHT11响应正常,返回1表示无响应
uint8_t DHT11_Check(void);// 从DHT11读取一个位的数据
// 返回值: 读取到的位值(0或1)
uint8_t DHT11_Read_Bit(void);// 从DHT11读取一个字节的数据
// 返回值: 读取到的字节值
uint8_t DHT11_ReadByte(void);// 读取DHT11的温湿度数据
// 参数temp: 指向存储温度数据的变量的指针(范围0-50℃)
// 参数humi: 指向存储湿度数据的变量的指针(范围20-90%)
// 返回值: 0表示读取成功,1表示读取失败
uint8_t DHT11_ReadData(uint8_t *temp, uint8_t *humi);#endif

 delay.c

#include "delay.h"
#include "stm32f1xx_hal.h"TIM_HandleTypeDef htim3;/*** @brief  初始化定时器3用于延时* @param  无* @retval 无*/
void Delay_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig = {0};/* 使能TIM3时钟 */__HAL_RCC_TIM3_CLK_ENABLE();/* 基础配置 */htim3.Instance = TIM3;htim3.Init.Prescaler = 72-1;  // 72MHz / 72 = 1MHz,即计数频率为1MHz,计数周期为1ushtim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 0xFFFF;  // 最大计数值htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim3) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){Error_Handler();}/* 启动定时器 */HAL_TIM_Base_Start(&htim3);
}/*** @brief  微秒级延时* @param  nus: 延时的微秒数,范围:0~65535* @retval 无*/
void delay_us(uint16_t nus)
{uint16_t differ;uint16_t ticks = nus;uint16_t start = __HAL_TIM_GET_COUNTER(&htim3);while(1){uint16_t now = __HAL_TIM_GET_COUNTER(&htim3);if(now < start)differ = now + 65536 - start;  // 处理计数器溢出elsediffer = now - start;if(differ >= ticks)break;}
}/*** @brief  毫秒级延时* @param  nms: 延时的毫秒数* @retval 无*/
void delay_ms(uint16_t nms)
{uint32_t i;for(i = 0; i < nms; i++){delay_us(1000);  // 1ms = 1000us}
}

delay.h

#ifndef __DELAY_H
#define __DELAY_H#include "stm32f1xx_hal.h"void Delay_Init(void);
void delay_us(uint16_t nus);
void delay_ms(uint16_t nms);#endif /* __DELAY_H */

使用步骤:

1、在主函数文件添加包含

#include "dht11.h"
#include "delay.h"

2、初始化dht11和定时器延时,注意要先初始化    Delay_Init();

	Delay_Init();DHT11_Init();

3、通过函数读取问湿度值

uint8_t temp,humidity ;
DHT11_ReadData(&temp,&humidity);

代码结束

ai编程提示词

DHT11使用以下函数获取温度和湿度。
//temp温度数据范围0-50度
//humi湿度数据范围20-90%
//指向存储温度数据的uint8_t变量的指针temp,
//指向存储湿度数据的uint8_t变量的指针humi
//返回值0表示读取成功,1读取失败
uint8_t DHT11_ReadData(uint8_t * temp,uint8_t *humi)

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

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

相关文章

网页防篡改与盗链防护:实时监控与自动化修复实践

摘要&#xff1a;针对网页内容篡改与盗链问题&#xff0c;本文基于群联AI云防护系统&#xff0c;详解如何通过哈希校验、实时监控与CDN联动实现秒级修复&#xff0c;并提供Python与AWS S3集成代码。 一、网页安全的核心需求 防篡改&#xff1a;保障页面内容完整性&#xff0c;…

【4】k8s集群管理系列--harbor镜像仓库本地化搭建

一、harbor基本概念 ‌Harbor是一个由VMware开源的企业级Docker镜像仓库解决方案‌&#xff0c;旨在解决企业在容器化应用部署中的痛点&#xff0c;提供镜像存储、管理、安全和分发的全生命周期管理‌。Harbor扩展了Docker Registry&#xff0c;增加了企业级功能&#xff0c;如…

Docker 安装 Elasticsearch 8.x

Docker 安装 Elasticsearch 8.x 前言一、准备工作二、设置容器的目录结构三、启动一个临时的容器来复制配置文件四、复制配置文件到本地目录五、删除临时容器六、创建并运行容器&#xff0c;挂载本地目录七、修改文件配置监听端口八、端口配置&#xff1a;Host 网络模式 vs Por…

C#: 用Libreoffice实现Word文件转PDF

现实场景中要实现Word格式转PDF格式还是比较常见的。 如果要用开源的组件&#xff0c;只有用Libreoffice了。 一、下载安装Libreoffice 先进入如下链接&#xff0c;找到最新版本和匹配的操作系统来安装。 官网试过&#xff0c;下载是能下载&#xff0c;但安装了用不了&…

MoogDB数据库日常维护技巧与常见问题解析

在当今的数据驱动世界中&#xff0c;数据库作为信息存储与管理的核心组件&#xff0c;扮演着举足轻重的角色。MoogDB作为一款高性能、易扩展的数据库解决方案&#xff0c;越来越受到开发者和企业的青睐。为了确保MoogDB的稳定性与高性能&#xff0c;定期的日常维护及对常见问题…

JAVA多线程的几种实现方式

‌1. 继承 Thread 类‌ ‌原理‌&#xff1a;通过继承 Thread 类并重写 run() 方法定义线程任务&#xff0c;调用 start() 启动线程‌。‌代码示例‌&#xff1a; public class MyThread extends Thread {Overridepublic void run() {System.out.println("线程 " g…

爬虫(基本知识介绍,urllib库的说明)

爬虫 爬虫基础&#xff08;一些基本原理的梳理&#xff09; scheme://[username:password]hostname[:port][/path][;parameters][?query][#fragment] 注&#xff1a; parameters 和 query 混用&#xff0c;并且现在 query 用的多 ?query 查询 &#xff0c;用来查询某类资源…

探秘串口服务器厂家:背后的故事与应用

在科技飞速发展的今天&#xff0c;串口服务器作为连接串口设备与网络的桥梁&#xff0c;在工业自动化、智能交通、智能家居等众多领域发挥着关键作用。你是否好奇&#xff0c;那些生产串口服务器的厂家究竟有着怎样的故事&#xff1f;它们的产品背后又蕴含着怎样的原理呢&#…

工厂能耗系统智能化解决方案 —— 安科瑞企业能源管控平台

安科瑞顾强 政策背景与“双碳”战略驱动 2025年《政府工作报告》明确提出“单位国内生产总值能耗降低3%左右”的目标&#xff0c;要求通过产业结构升级&#xff08;如高耗能行业技术革新或转型&#xff09;、能源结构优化&#xff08;提高非化石能源占比&#xff09;及数字化…

BI面向模型开发和面向报表开发,有什么区别?

在数字化时代&#xff0c;商业智能&#xff08;BI&#xff09;已成为企业决策不可或缺的工具。BI项目实施时&#xff0c;通常有两种开发模式&#xff1a;面向模型开发和面向报表开发。虽然两者都旨在通过数据驱动决策&#xff0c;但在开发逻辑、目标价值和技术路径上存在显著差…

OpenHarmony人才认证证书

OpenHarmony人才认证体系目前支持初级工程师认证&#xff0c;要求了解OpenHarmony开源项目、生态进展及系统移植等基础知识&#xff0c;熟练掌握OpenHarmony的ArkUI、分布式软总线、分布式硬件、分布式数据管理等基础能力使用&#xff0c;具备基础的开发能力。 考试流程可参考O…

映射网络路路径和ftp路径原理是什么,如何使用,有什么区别

文章目录 一、原理1. 映射网络路径2. FTP路径 二、使用方法1. 映射网络路径2. FTP路径 三、主要区别1. 协议与功能2. 安全性与权限3. 适用场景 四、如何选择&#xff1f;五、注意事项 映射网络路径&#xff08;如SMB/CIFS或NFS&#xff09;和FTP路径&#xff08;FTP/FTPS/SFTP&…

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(一)

Windows 8包括 Microsoft DirectX 功能改进&#xff0c;使开发人员、最终用户和系统制造商受益。 功能改进在以下几个方面&#xff1a; 像素格式 (5551、565、4444) &#xff1a;在低功耗硬件配置下&#xff0c;DirectX 应用程序的性能更高。双精度着色器功能&#xff1a;高级…

GitHub 趋势日报 (2025年04月15日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1yeongpin/cursor-free-vip[Support 0.48.x]&#xff08;Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher…

2025年推荐使用的开源大语言模型top20:核心特性、选择指标和开源优势

李升伟 编译 随着人工智能技术的持续发展&#xff0c;开源大型语言模型&#xff08;LLMs&#xff09;正变得愈发强大&#xff0c;使最先进的AI能力得以普及。到2025年&#xff0c;开源生态系统中涌现出多个关键模型&#xff0c;它们在各类应用场景中展现出独特优势。 大型语言…

回收镀锡废水的必要性(笔记)

镀锡废水若直接排放&#xff0c;将对环境、经济和社会造成多重危害&#xff0c;其回收处理具有迫切性和深远意义。以下从环境、资源、法规、技术与实践、可持续发展五大维度展开分析&#xff1a; 一、环境危害的紧迫性&#xff1a;重金属与污染物的致命威胁 成分复杂&#xf…

14.2 - VDMA彩条显示实验之动态时钟

文章目录 1 实验任务2 系统框图3 硬件设计4 软件设计4.1 dynclk_api.h文件4.2 math_compat.h文件4.3 dynclk_api.c文件4.4 main.c文件 1 实验任务 参见14.1。 2 系统框图 参见14.1。 3 硬件设计 注意事项&#xff1a;基于14.1做如下改动 使能Clocking Wizard IP核的Dynam…

在边缘端进行tensorflow模型的部署(小白初探)

1.配置tensorflow的环境 &#xff08;我是安装GPU版本的&#xff09; 建议参考这个博主的文章&#xff0c;确实非常快速&#xff01; 十分钟安装Tensorflow-gpu2.6.0本机CUDA12 以及numpymatplotlib各包版本协调问题_tensorflow cuda12-CSDN博客 2.学习自制数据集 &#xf…

windows下使用nginx + waitress 部署django

架构介绍 linux一般采用nginx uwsgi部署django&#xff0c;在Windows下&#xff0c;可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django&#xff0c;,他们的关系如下 django是WEB应用…

利用pnpm patch命令实现依赖包热更新:精准打补丁指南

需求场景 在Element Plus的el-table组件二次开发中&#xff0c;需新增列显示/隐藏控件功能。直接修改node_modules源码存在两大痛点&#xff1a; 团队协作时修改无法同步 依赖更新导致自定义代码丢失 解决方案选型 通过patch-package工具实现&#xff1a; &#x1f4e6; 非…