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

简单理解:DS18B20 驱动的宏定义(部分)

// 宏定义 #define DS18B20_IO_OUT() GPIO_DirectionConfig(DS18B20_PORT, DS18B20_PIN, GPIO_DIR_OUT) #define DS18B20_IO_IN() GPIO_DirectionConfig(DS18B20_PORT, DS18B20_PIN, GPIO_DIR_IN) #define DS18B20_DQ_OUT GPIO_ClearOutBits(DS18B20_PORT, DS18B20_PIN) #define DS18B20_DQ_OUT_1 GPIO_SetOutBits(DS18B20_PORT, DS18B20_PIN) #define DS18B20_DQ_IN GPIO_ReadInBit(DS18B20_PORT, DS18B20_PIN)

逐行解释这段单片机(STM32 / 国产 MCU 通用)DS18B20 驱动的宏定义,讲清楚每个宏是干嘛的、怎么用。

整体作用

这是DS18B20 温度传感器单总线(1-Wire)驱动里最常见的 GPIO 操作封装,用宏把引脚方向、输出高低、读取电平藏起来,让主代码更干净、易移植。

逐行解释

1. 设置引脚为输出模式

#define DS18B20_IO_OUT() GPIO_DirectionConfig(DS18B20_PORT, DS18B20_PIN, GPIO_DIR_OUT)
  • 功能:把 DS18B20 的 DQ 引脚设为推挽输出
  • 使用:DS18B20_IO_OUT();

2. 设置引脚为输入模式

#define DS18B20_IO_IN() GPIO_DirectionConfig(DS18B20_PORT, DS18B20_PIN, GPIO_DIR_IN)
  • 功能:把 DQ 引脚设为输入(上拉 / 浮空)
  • 使用:DS18B20_IO_IN();

3. 输出低电平(拉低 DQ)

#define DS18B20_DQ_OUT GPIO_ClearOutBits(DS18B20_PORT, DS18B20_PIN)
  • 功能:DQ =0
  • 使用:DS18B20_DQ_OUT;

4. 输出高电平(拉高 DQ)

#define DS18B20_DQ_OUT_1 GPIO_SetOutBits(DS18B20_PORT, DS18B20_PIN)
  • 功能:DQ =1
  • 使用:DS18B20_DQ_OUT_1;

5. 读取引脚电平

#define DS18B20_DQ_IN GPIO_ReadInBit(DS18B20_PORT, DS18B20_PIN)
  • 功能:读取当前 DQ 是高还是低
  • 返回值:01
  • 使用:level = DS18B20_DQ_IN;

典型使用片段(你能直接对照)

// 复位时序示例 DS18B20_IO_OUT(); // 设置DS18B20的DQ引脚为输出模式(准备发送复位脉冲) DS18B20_DQ_OUT = 0; // 将DQ引脚拉低(发送复位脉冲,协议要求低电平至少480us,这里用1ms满足要求) delay_ms(1); // 保持拉低状态1ms(远大于协议最小480us要求,确保DS18B20能检测到复位) DS18B20_DQ_OUT = 1; // 释放总线(拉高DQ引脚,结束复位脉冲) delay_us(40); // 等待40us(协议要求主机释放总线后,等待15~60us检测从机应答) DS18B20_IO_IN(); // 将DQ引脚切换为输入模式(释放总线,准备检测DS18B20的应答脉冲) if(DS18B20_DQ_IN == 0) // 检测DQ引脚电平:若为低,说明DS18B20发送了应答脉冲 { // 存在应答 }

// DS18B20状态机状态枚举 typedef enum { DS18B20_STATE_IDLE = 0, // 空闲状态 DS18B20_STATE_RESET_START, // 开始复位 DS18B20_STATE_RESET_WAIT, // 等待复位完成 DS18B20_STATE_CHECK_PRESENCE, // 检查存在脉冲 DS18B20_STATE_SEND_SKIP_ROM, // 发送跳过ROM命令 DS18B20_STATE_SEND_CONVERT, // 发送温度转换命令 DS18B20_STATE_CONVERT_WAIT, // 等待转换完成 DS18B20_STATE_READ_SCRATCHPAD, // 发送读取暂存器命令 DS18B20_STATE_READ_TEMP_LSB, // 读取温度低8位 DS18B20_STATE_READ_TEMP_MSB, // 读取温度高8位 DS18B20_STATE_COMPLETE, // 温度读取完成 DS18B20_STATE_ERROR // 错误状态 } DS18B20_State; // DS18B20状态机结构体 typedef struct { DS18B20_State state; // 当前状态 uint32_t timestamp; // 时间戳 short temperature; // 温度值 uint8_t temp_lsb; // 温度低8位 uint8_t temp_msb; // 温度高8位 uint8_t error; // 错误标志 } DS18B20_HandleTypeDef;

这段代码是针对 DS18B20 温度传感器设计的状态机相关定义,核心目的是通过枚举和结构体来规范化、模块化地管理 DS18B20 的工作流程和状态数据。下面我会详细拆解每一部分的含义和作用。

1. DS18B20 状态机状态枚举(DS18B20_State)

这个枚举定义了 DS18B20 传感器从空闲到完成温度读取的完整工作流程中的所有状态,每个状态对应传感器操作的一个具体步骤,是状态机的核心 “状态标识”。

枚举值中文含义作用说明
DS18B20_STATE_IDLE空闲状态传感器初始状态,未执行任何操作,等待触发读取流程
DS18B20_STATE_RESET_START开始复位触发 DS18B20 的复位操作(1-Wire 总线复位)
DS18B20_STATE_RESET_WAIT等待复位完成等待复位时序完成(DS18B20 复位需要固定的时序等待)
DS18B20_STATE_CHECK_PRESENCE检查存在脉冲检测 DS18B20 是否返回存在脉冲(确认传感器在线)
DS18B20_STATE_SEND_SKIP_ROM发送跳过 ROM 命令发送 0xCC 命令(跳过 ROM 匹配,适用于单传感器场景)
DS18B20_STATE_SEND_CONVERT发送温度转换命令发送 0x44 命令(触发传感器进行温度转换)
DS18B20_STATE_CONVERT_WAIT等待转换完成等待温度转换结束(转换需要约 750ms,可通过时序或延时等待)
DS18B20_STATE_READ_SCRATCHPAD发送读取暂存器命令发送 0xBE 命令(读取传感器的暂存器数据)
DS18B20_STATE_READ_TEMP_LSB读取温度低 8 位读取暂存器中温度值的低 8 位数据
DS18B20_STATE_READ_TEMP_MSB读取温度高 8 位读取暂存器中温度值的高 8 位数据
DS18B20_STATE_COMPLETE温度读取完成温度值解析完成,状态机结束流程
DS18B20_STATE_ERROR错误状态任意步骤出错(如无存在脉冲、读取数据异常)时进入此状态

2. DS18B20 状态机结构体(DS18B20_HandleTypeDef)

这个结构体是管理单个 DS18B20 传感器的 “数据容器”,整合了状态机的状态、时间戳、温度数据和错误信息,方便在程序中统一管理。

成员变量类型作用说明
stateDS18B20_State记录传感器当前所处的状态(对应上面的枚举值),是状态机的核心变量
timestampuint32_t时间戳(通常记录进入当前状态的系统时间),用于时序等待(如复位等待、转换等待时判断是否超时)
temperatureshort最终解析后的温度值(DS18B20 的温度是 16 位有符号数,short 刚好适配,单位通常是 0.0625℃,需换算)
temp_lsbuint8_t暂存读取到的温度低 8 位数据(未解析的原始数据)
temp_msbuint8_t暂存读取到的温度高 8 位数据(未解析的原始数据)
erroruint8_t错误标志(如 0 表示无错,非 0 表示对应错误类型,比如 1 = 复位失败、2 = 无存在脉冲等)

3. 实际使用逻辑示例(帮助理解)

状态机的执行流程通常是 “状态切换 + 时序判断”,比如:

// 初始化状态机 DS18B20_HandleTypeDef ds18b20 = { .state = DS18B20_STATE_IDLE, .timestamp = 0, .temperature = 0, .temp_lsb = 0, .temp_msb = 0, .error = 0 }; // 状态机处理函数(通常在定时器中断或主循环中调用) void DS18B20_StateMachine(DS18B20_HandleTypeDef *hdts) { switch(hdts->state) { case DS18B20_STATE_IDLE: // 触发读取,切换到复位开始状态 hdts->state = DS18B20_STATE_RESET_START; break; case DS18B20_STATE_RESET_START: // 执行复位操作(拉低总线) DS18B20_Reset(); hdts->timestamp = HAL_GetTick(); // 记录进入此状态的时间 hdts->state = DS18B20_STATE_RESET_WAIT; break; case DS18B20_STATE_RESET_WAIT: // 判断是否等待足够时间(如480us) if(HAL_GetTick() - hdts->timestamp > 1) { // 示例:简化的延时判断 hdts->state = DS18B20_STATE_CHECK_PRESENCE; } break; // 其他状态的处理逻辑... case DS18B20_STATE_ERROR: // 错误处理,比如重置状态机 hdts->state = DS18B20_STATE_IDLE; hdts->error = 0; break; } }

总结

  1. 枚举DS18B20_State把 DS18B20 的读取流程拆分成多个独立状态,符合 “状态机” 设计思想,便于分步处理和故障定位;
  2. 结构体DS18B20_HandleTypeDef整合了状态、时间、数据、错误信息,是管理单个传感器的核心数据结构;
  3. 这种设计适用于嵌入式系统(如 STM32),能避免阻塞式延时,提高程序的实时性和可靠性。
http://www.jsqmd.com/news/368320/

相关文章:

  • 2026年苗木基地厂家推荐:紫薇花瓶基地批发/紫薇花瓶花卉苗木种植基地/绿化工程苗木基地/苗木花卉基地批发/选择指南 - 优质品牌商家
  • 2026年文本数据标注厂家权威推荐榜:数据标注的企业、数据标注管理平台、智能驾驶数据标注服务、自动驾驶数据标注选择指南 - 优质品牌商家
  • pyMOE 项目架构分析与微服务设计方案
  • 1.97亿,湖北交投大数智AI模型及应用项目
  • 2026年花卉苗木种植基地厂家权威推荐榜:工程花卉苗木种植基地/工程苗木批发基地/朴树种植基地/选择指南 - 优质品牌商家
  • 小白程序员2025年转行大模型必看:实战落地不空谈,0基础能不能转大模型?到底怎么转?
  • AI分析瑞波币ETF市场的能力与局限性
  • AI能否兑现承诺?行业面临巨大交付压力
  • 不可逆信息的单点修改与全局查询
  • 欧洲数据中心市场面临电网瓶颈,2031年前投资或达1760亿欧元
  • 掌握智能体记忆:小白程序员轻松入门大模型核心技术(收藏版)
  • 投资者对AI冲击SaaS公司感到恐慌,基础设施支出持续上升
  • 小白程序员必看:杨立昆能量模型Kona 1.0发布,AI或将迎来逻辑优化新纪元!
  • OFP欲以全新存储架构颠覆数据服务器
  • 3个问题帮你找到心仪的AI工作(收藏+学习)|我两周拿offer的经验
  • OpenGL ES ->图片纹理不变形显示:两层宽高比校正详解
  • AI大模型学习路线(2026最新)神仙级AGI大模型教程分享
  • 2026年直线滑台厂家最新推荐:直线导轨的选用、直线导轨精度如何确定、直线模组怎么用、行星滚柱丝杠、齿轮齿条选择指南 - 优质品牌商家
  • docker 下部署 纯CPU的Nway ASR TTS
  • 2026年eMMC5.1芯片加工厂优质存储芯片推荐指南 - 优质品牌商家
  • 2026中小容量存储芯片推荐榜 重技术服务适配多场景 - 优质品牌商家
  • 2026合肥环保地毯趋势:如何挑选优质手工地毯品牌? - 2026年企业推荐榜
  • 【开题答辩全过程】以 莲花劳动市场人员管理系统设计与实现为例,包含答辩的问题和答案
  • 【开题答辩全过程】以 基于微信小程序的大学生安全素质综合培养平台设计与实现为例,包含答辩的问题和答案
  • XiyouLinux Group 周报(NO.3)
  • 【开题答辩全过程】以 离散制造企业生产管理系统为例,包含答辩的问题和答案
  • 2026定制化存储芯片优质供应商推荐榜 - 优质品牌商家
  • (2026年最新)AI大模型应用开发学习路线,字字珠玑,一篇收藏,少走弯路!新人转行大模型避坑指南
  • Linux内核驱动——中断子系统与 I2C 子系统
  • 深度探秘.NET中的IAsyncEnumerable:异步迭代的底层奥秘与高效实践