stm32f103c8t6,温度传感器MLX90614,OLED
时间: 2025-05-27 19:32:01 浏览: 37
### STM32F103C8T6配合MLX90614温度传感器及OLED显示屏的使用
#### 一、硬件连接说明
STM32F103C8T6微控制器可以通过I²C接口与MLX90614红外温度传感器以及OLED屏幕进行通信。以下是典型的硬件连接方式:
| **设备** | **引脚名称** | **STM32F103C8T6 引脚** |
|-----------------|--------------|-------------------------|
| MLX90614 | SDA | PB7 |
| | SCL | PB6 |
| OLED | SDA | PB7 |
| | SCL | PB6 |
注意:由于两者都支持I²C协议,可以共用同一组SDA/SCL线。
---
#### 二、软件实现流程
##### 初始化配置
在程序初始化阶段,需完成以下操作:
1. 配置GPIO端口PB6和PB7作为I²C外设的输入/输出功能。
2. 启动并初始化I²C外设(SMBus模式)。
3. 初始化OLED屏幕以便显示数据。
```c
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
// I²C初始化函数
void SMBus_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
I2C_InitTypeDef I2C_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
// 配置PB6/PB7为AF_OD模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStruct);
// 配置I²C参数
I2C_InitStruct.I2C_ClockSpeed = 100000; // 设置时钟频率为100kHz
I2C_InitStruct.I2C_Mode = I2C_Mode_SMBusDevice;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 = 0x00;
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C1, &I2C_InitStruct);
I2C_Cmd(I2C1, ENABLE);
}
// 主循环中调用此函数获取温度值
float SMBus_ReadTemp(void) {
uint16_t raw_data = 0;
float temperature = 0.0;
// 发送启动信号
I2C_Start(I2C1, MLX90614_ADDR << 1 | I2C_Direction_Transmitter);
I2C_SendData(I2C1, MLX90614_REG_TEMP); // 请求环境温度寄存器地址
I2C_WaitEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED);
// 切换到接收模式
I2C_GenerateSTOP(I2C1, DISABLE);
I2C_Start(I2C1, MLX90614_ADDR << 1 | I2C_Direction_Receiver);
raw_data |= I2C_ReceiveData(I2C1) << 8; // 接收高字节
I2C_AcknowledgeConfig(I2C1, DISABLE);
raw_data |= I2C_ReceiveData(I2C1); // 接收低字节
I2C_GenerateSTOP(I2C1, ENABLE);
// 转换原始数据至摄氏度
temperature = (raw_data * 0.02) - 273.15;
return temperature;
}
```
以上代码实现了基于ST标准库的I²C驱动逻辑[^2]。
---
##### 数据处理与显示
通过`SMBus_ReadTemp()`函数读取当前环境温度,并将其转换为浮点数值后传递给OLED屏幕用于实时更新显示内容。
```c
int main(void) {
float temper;
OLED_Init(); // 初始化OLED屏幕
SMBus_Init(); // 初始化I²C总线
OLED_ShowString(1, 1, "T:");
while (1) {
temper = SMBus_ReadTemp();
OLED_ClearLine(1); // 清除旧数据显示区域
OLED_SetCursor(1, 3); // 定位光标位置
OLED_Printf("%d.", (int)temper);// 输出整数部分
OLED_SetCursor(1, 6); // 移动光标到小数点后两位
OLED_Printf("%02d", ((uint16_t)(temper * 100)) % 100); // 小数部分
Delay_ms(500); // 延迟刷新时间间隔
}
}
```
上述代码片段展示了如何利用OLED屏幕动态展示由MLX90614采集得到的实际测量结果[^2]。
---
#### 三、注意事项
1. 确认所使用的开发板供电电压是否满足各组件需求;
2. 如果遇到通讯失败的情况,请检查拉电阻大小设置是否合理,默认推荐范围为4.7kΩ~10kΩ之间;
3. 对于不同版本的数据手册可能存在的差异性解读务必仔细核验其适用条件[^1]。
---
阅读全文
相关推荐



















