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

DHT11 STM32 HAL驱动库 整数

dht11.h

#ifndef __DHT11_H
#define __DHT11_H#include "stm32f1xx_hal.h"  // 根据实际芯片型号调整(如stm32f4xx_hal.h)// DHT11数据结构
typedef struct {GPIO_TypeDef *GPIOx;    // GPIO端口(如GPIOA)uint16_t GPIO_Pin;      // GPIO引脚(如GPIO_PIN_0)uint8_t Temperature;    // 温度(整数部分,°C)uint8_t Humidity;       // 湿度(整数部分,%)
} DHT11_TypeDef;// 函数声明
void DHT11_Init(DHT11_TypeDef *DHT11, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
uint8_t DHT11_ReadData(DHT11_TypeDef *DHT11);// 微秒级延时函数(需用户实现,或使用下方dht11.c中的模板)
void delay_us(uint16_t us);#endif /* __DHT11_H */

dht11.c

#include "dht11.h"
#include <stdint.h>// 私有函数声明
static uint8_t DHT11_Start(DHT11_TypeDef *DHT11);
static uint8_t DHT11_ReadByte(DHT11_TypeDef *DHT11);
static void Set_Pin_Output(DHT11_TypeDef *DHT11);
static void Set_Pin_Input(DHT11_TypeDef *DHT11);// 初始化DHT11
void DHT11_Init(DHT11_TypeDef *DHT11, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) {DHT11->GPIOx = GPIOx;DHT11->GPIO_Pin = GPIO_Pin;DHT11->Temperature = 0;DHT11->Humidity = 0;
}// 读取温湿度数据(返回0成功,1失败)
uint8_t DHT11_ReadData(DHT11_TypeDef *DHT11) {uint8_t data[5] = {0};if (DHT11_Start(DHT11) != 0) return 1; // 启动失败// 读取40位数据(5字节)for (int i = 0; i < 5; i++) {data[i] = DHT11_ReadByte(DHT11);}// 校验和验证if ((data[0] + data[1] + data[2] + data[3]) != data[4]) {return 1; // 校验失败}DHT11->Humidity = data[0];DHT11->Temperature = data[2];return 0;
}// 启动DHT11(发送开始信号)
static uint8_t DHT11_Start(DHT11_TypeDef *DHT11) {Set_Pin_Output(DHT11);// 主机拉低至少18msHAL_GPIO_WritePin(DHT11->GPIOx, DHT11->GPIO_Pin, GPIO_PIN_RESET);delay_us(18000);// 主机拉高20-40μsHAL_GPIO_WritePin(DHT11->GPIOx, DHT11->GPIO_Pin, GPIO_PIN_SET);delay_us(30);// 切换为输入模式,等待DHT11响应Set_Pin_Input(DHT11);// 检测DHT11的低电平响应信号(超时检测)uint32_t timeout = 10000; // 10ms超时while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_RESET) {if (--timeout == 0) return 1;delay_us(1);}// 检测DHT11的高电平信号(超时检测)timeout = 10000;while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET) {if (--timeout == 0) return 1;delay_us(1);}return 0; // 启动成功
}// 读取一个字节的数据
static uint8_t DHT11_ReadByte(DHT11_TypeDef *DHT11) {uint8_t byte = 0;for (int i = 0; i < 8; i++) {// 等待低电平结束(数据位开始)while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_RESET);// 延时40μs判断高低电平(0: 26-28μs, 1: 70μs)delay_us(40);if (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET) {byte |= (1 << (7 - i)); // 高位在前}// 等待高电平结束while (HAL_GPIO_ReadPin(DHT11->GPIOx, DHT11->GPIO_Pin) == GPIO_PIN_SET);}return byte;
}// 设置引脚为输出模式
static void Set_Pin_Output(DHT11_TypeDef *DHT11) {GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11->GPIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DHT11->GPIOx, &GPIO_InitStruct);
}// 设置引脚为输入模式
static void Set_Pin_Input(DHT11_TypeDef *DHT11) {GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11->GPIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DHT11->GPIOx, &GPIO_InitStruct);
}// 微秒级延时函数(需用户根据实际定时器实现)
__weak void delay_us(uint16_t us) {/* 默认实现(需替换为您的实际延时函数) */for (uint16_t i = 0; i < us; i++) {for (uint16_t j = 0; j < 10; j++) { // 粗略延时(需校准)__NOP();}}
}

使用教程

#include "dht11.h"DHT11_TypeDef myDHT11;DHT11_Init(&myDHT11, GPIOA, GPIO_PIN_1);if (DHT11_ReadData(&myDHT11) == 0){//温度处理 + LED1控制if(myDHT11.Temperature>TT){HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//LED1motorIndex=3;//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);OLED_ShowString(112, 16, "H", OLED_8X16);//温度过高显示"H"}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);//LED1motorIndex=0;//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);OLED_ShowString(112, 16, "L", OLED_8X16);//温度正常显示"L"}sprintf(str, "温度:%d.0℃", myDHT11.Temperature);OLED_ShowString(1, 16, str, OLED_8X16);//湿度处理if(myDHT11.Humidity>HT){HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);//LED2OLED_ShowString(112, 32, "H", OLED_8X16);//湿度过高显示"H"}else{HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);OLED_ShowString(112, 32, "L", OLED_8X16);//湿度正常显示"L"}sprintf(str, "湿度:%dRH%%", myDHT11.Humidity);OLED_ShowString(1, 32, str, OLED_8X16);}

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

相关文章:

  • .NetCore+Vue快速生产框架开发详细方案
  • Chrome浏览器访问https提示“您的连接不是私密连接”问题解决方案
  • 已对接Shopee、Lazada、亚马逊等知名海外电商平台!商派DigiOS-OMS业务中台助力品牌扩展全球业务
  • 《Opto-Electronic Advances》热点论文速览(2025)
  • linux中python虚拟环境和版本的选择
  • 【Linux手册】进程终止:进程退出和信号的响应机制
  • VB.NET,C#字典对象来保存用户数据,支持大小写
  • Selenium 多窗口截图(窗口切换)二次封装方法详解 —— Python 实践
  • 【Python】实现对LGBT+ rights worldwide (2025)数据集的可视化展示
  • MySQL在C中常用的API接口
  • TiDB AUTO_RANDOM 超大主键前端精度丢失排查:JavaScript Number 限制与解决方案
  • 玩转Linux CAN/CAN FD—SocketCAN的使用
  • opensuse安装rabbitmq
  • 【编译原理】期末复习知识总结
  • 【大数据】大数据产品基础篇
  • 【开源项目】「安卓原生3D开源渲染引擎」:Sceneform‑EQR
  • ArcGIS Pro利用擦除工具,矢量要素消除另一矢量部分区域
  • 【网络安全】密码学知识普及
  • 高可用与低成本兼得:全面解析 TDengine 时序数据库双活与双副本
  • OkHttp 简单配置
  • pandas---使用教程
  • 解构SAP RISE与Cloud ERP授权新政:从许可模式到迁移策略的深度指南
  • (一)miniconda安装配置
  • Dubbo服务调用超时问题解决方案
  • Hyperledger Fabric 入门笔记(二十)Fabric V2.5 测试网络进阶之Tape性能测试
  • Linux tcp_info:监控TCP连接的秘密武器
  • 【RAG面试题】如何获取准确的语义表示
  • MCP-安全(代码实例)
  • ubuntu安装达梦数据库
  • Java8方法引用:简洁高效的编程利器