这篇内容详细记录了使用STM32微控制器驱动DS18B20数字温度传感器的全过程。从硬件连接到完整的驱动代码实现,提供了可直接复用的解决方案,对于需要在项目中集成温度监测功能的开发者而言,具有较高的实践参考价值。
智能速览
DS18B20是一款测温范围-55°C至+125°C的数字传感器。
其硬件电路仅需一个4.7K上拉电阻即可完成连接。
驱动代码实现了完整的单总线通信协议,包含严格的时序控制。
提供的代码已实测通过,可直接读取温度值。
需注意12位分辨率下温度转换时间长达750ms,不适用于高实时性场景。
精华内容
驱动DS18B20的关键在于精确实现其单总线协议,包括严格的时序控制。下面的代码解析将展示如何通过GPIO模拟这一过程,从而稳定地读取温度数据。
硬件连接
DS18B20的外围电路设计非常简洁。在标准供电模式下,仅需将传感器的VCC引脚接3.0V-5.5V电源,GND引脚接地,数据线DQ引脚连接到STM32的一个GPIO口,并在DQ线上并联一个4.7KΩ的上拉电阻至VCC即可。虽然该传感器支持寄生供电模式,但从稳定性角度考虑,推荐采用外部直接供电的方式。
代码核心
驱动代码的核心在于通过GPIO模拟单总线时序。首先需要配置GPIO为推挽输出模式,用于发送复位脉冲和数据。在读取传感器响应和数据时,则必须将GPIO动态切换为上拉输入模式。代码中封装了`DS18B20_Set_Output`和`DS18B20_Set_Input`两个函数来实现GPIO模式的快速切换,这是保证通信成功的关键。
温度读取
读取温度的流程是固定的:首先发送复位脉冲并检测传感器存在,然后发送跳过ROM指令(0xCC)和启动温度转换指令(0x44)。在12位分辨率下,此过程需等待至少750ms。转换完成后,再次复位并发送跳过ROM指令和读暂存器指令(0xBE),随后连续读取两个字节,分别代表温度的LSB和MSB。
将这两个字节组合成16位原始数据。若最高位为1,表示负温,需将其补码转换为原码。最后,将16位原始数据乘以0.0625(即1/16),即可得到实际的摄氏温度值。
移植要点
将此驱动代码移植到其他STM32芯片或其他MCU时,主要需要修改与硬件相关的宏定义。这些包括指定GPIO端口、引脚号和对应时钟的宏,如`DS18B20_GPIO_PORT`、`DS18B20_GPIO_PIN`。此外,还需要根据目标平台实现底层的`delay_us`、`delay_ms`延时函数以及用于调试输出的`printf`函数。
这份方案为STM32驱动DS18B20提供了经过验证的代码和清晰的移植指南,有效解决了温度采集的入门问题。虽然其实时性有待优化,但对于大多数应用场景已足够,是开发者工具箱中一份实用的参考资料。