主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
温度传感器 | 电路原理,手册分析,驱动程序,读出温度值。 | 读出温度值即可。 |
师从洋桃电子,杜洋老师
📑文章目录
▲ 回顾上期🔍STM32 I2C驱动开发全解析:从理论到实战 | 零基础入门STM32第五十步
一、LM75A驱动设计整体架构
二、LM75A核心寄存器解析
2.1 关键寄存器地址表
寄存器名称 | 地址 | 功能描述 |
---|---|---|
温度寄存器 | 0x00 | 存储当前温度值(只读) |
配置寄存器 | 0x01 | 控制器件工作模式 |
过温阈值 | 0x02 | 设置温度报警上限 |
滞后温度 | 0x03 | 设置温度报警下限 |
2.2 配置寄存器详解(0x01)
// 配置寄存器位定义
#define CONF_SHUTDOWN 0x01 // 掉电模式使能位
#define CONF_OS_POL 0x04 // OS输出极性
#define CONF_OS_F_QUE0 0x08 // 故障队列位0
#define CONF_OS_F_QUE1 0x10 // 故障队列位1
三、温度采集与数据处理
3.1 温度数据格式
根据LM75A数据手册,温度数据采用11位有效位存储,具体结构如下:

3.2 数据处理流程
//读出LM75A的温度值(-55~125摄氏度)
//温度正负号(0正1负),温度整数,温度小数(点后2位)依次放入*Tempbuffer(十进制)
void LM75A_GetTemp(u8 *Tempbuffer){
u8 buf[2]; //温度值储存
u8 t=0,a=0;
I2C_READ_BUFFER(LM75A_ADD,0x00,buf,2); //读出温度值(器件地址,子地址,数据储存器,字节数)
t = buf[0]; //处理温度整数部分,0~125度
*Tempbuffer = 0; //温度值为正值
if(t & 0x80){ //判断温度是否是负(MSB表示温度符号)
*Tempbuffer = 1; //温度值为负值
t = ~t; t++; //计算补码(原码取反后加1)
}
if(t & 0x01){ a=a+1; } //从高到低按位加入温度积加值(0~125)
if(t & 0x02){ a=a+2; }
if(t & 0x04){ a=a+4; }
if(t & 0x08){ a=a+8; }
if(t & 0x10){ a=a+16; }
if(t & 0x20){ a=a+32; }
if(t & 0x40){ a=a+64; }
Tempbuffer++;
*Tempbuffer = a;
a = 0;
t = buf[1]; //处理小数部分,取0.125精度的前2位(12、25、37、50、62、75、87)
if(t & 0x20){ a=a+12; }
if(t & 0x40){ a=a+25; }
if(t & 0x80){ a=a+50; }
Tempbuffer++;
*Tempbuffer = a;
}
四、驱动程序代码精析
4.1 器件地址定义
#define LM75A_ADD 0x9E // 7位地址:1001110 + R/W位
- 地址计算:
根据数据手册,LM75A的7位地址为1001xxx
(xxx由A2-A0引脚决定)
4.2 温度读取函数
void LM75A_GetTemp(u8 *Tempbuffer) {
u8 buf[2];
I2C_READ_BUFFER(LM75A_ADD, 0x00, buf, 2); // 关键调用
// 符号处理(代码详见3.2节)
// 小数精度处理(代码详见3.2节)
}
4.3 掉电模式设置
void LM75A_POWERDOWN(void){//
I2C_SAND_BYTE(LM75A_ADD,0x01,1); //
}
- 实现原理:向配置寄存器(0x01)写入0x01,开启低功耗模式
五、主程序调用示例
5.1 显示驱动集成
int main(void) {
u8 buffer[3]; // 存储符号、整数、小数
I2C_Configuration();
TM1640_Init(); // 数码管显示初始化
while(1) {
LM75A_GetTemp(buffer); //读取LM75A的温度数据
// 显示处理(示例)
TM1640_display(0, tempData[1]/10); // 十位数
TM1640_display(1, tempData[1]%10); // 个位数
TM1640_display(2, tempData[2]/10); // 小数第一位
TM1640_display(3, tempData[2]%10); // 小数第二位
delay_ms(200);
}
}
六、常见问题排查表
现象 | 可能原因 | 解决方案 |
---|---|---|
温度显示异常 | 数据补码转换错误 | 检查符号位处理逻辑 |
无法进入掉电模式 | 配置寄存器地址错误 | 确认写入地址是否为0x01 |
小数部分不准确 | 分辨率计算错误 | 验证LSB的位权计算 |
I2C通信失败 | 器件地址配置错误 | 使用逻辑分析仪抓取地址波形 |
七、关键调试技巧
-
补码验证工具
使用在线二进制补码计算器验证转换逻辑:// 示例:原始数据0xFFF0的转换 int16_t raw = 0xFFF0; // 补码表示-16
-
温度数据可视化
通过串口打印原始数据:printf("Raw Data: %02X %02X\n", buf[0], buf[1]);
-
I2C总线监控
使用Saleae逻辑分析仪解析通信时序:
八、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32F103xx官方数据手册
[3] STM32F103X8-B数据手册(中文)
[4] STM32F103固件函数库用户手册(中文)
[5] I2C总线规范(中文)
[6] LM75(温度传感器)数据手册+编程说明+应用
[7] 温度传感器数码管显示程序
[8] LM75A驱动程序分析.pptx
总结
本文详细解析了LM75A温度传感器的驱动开发,重点阐述了:
- 寄存器配置:掌握配置寄存器的位定义
- 数据解析:二进制补码转换与小数处理
- 驱动集成:从底层I2C到上层应用的完整调用链
通过实际代码分析与结构图解,可快速实现精准的温度采集系统。建议配合逻辑分析仪进行波形验证,确保通信可靠性。
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨OLED显示屏原理与驱动程序
重点课程
,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-07)