stm32f103c8t6 主芯片使用ds18b20温度传感器将数据显示到 0.96oled屏
时间: 2025-04-04 13:03:28 浏览: 123
### STM32F103C8T6 DS18B20 温度读取并显示在 0.96 寸 OLED 屏幕上的实现
#### 硬件连接说明
STM32F103C8T6 主控芯片通过 IIC 协议与 0.96 寸 OLED 显示屏通信,而 DS18B20 数字温度传感器则通过单总线接口与 STM32 进行数据交互。具体硬件连接如下:
- **DS18B20**: 将其 DQ 引脚连接至 STM32 的任意 GPIO 口(需配置为开漏模式),并通过一个 4.7kΩ 上拉电阻连接到 VCC。
- **OLED 屏幕**: 使用 SDA 和 SCL 接口分别对应 STM32 的 PB6 和 PB7(默认 IIC 引脚)。VCC 和 GND 分别接电源正负极。
---
#### 软件环境准备
本项目基于 HAL 库开发,以下是必要的初始化步骤:
1. 配置 `RCC` 时钟树以确保外设正常工作。
2. 初始化 GPIO 引脚用于 DS18B20 数据传输以及 OLED 控制。
3. 利用 HAL 提供的 IIC 函数完成 OLED 显示驱动程序编写。
---
#### 示例代码
##### 1. DS18B20 温度读取模块
```c
#include "stm32f1xx_hal.h"
#define ONE_WIRE_PIN GPIO_Pin_13 // 假设使用 PA13 作为 DS18B20 总线引脚
#define ONE_WIRE_PORT GPIOA // 对应端口 A
void OneWire_Reset(void);
uint8_t OneWire_ReadBit(void);
void OneWire_WriteByte(uint8_t data);
uint8_t OneWire_ReadByte(void);
float Read_DS18B20_Temperature() {
float temperature;
uint8_t scratchpad[9]; // 存储寄存器数据缓冲区
OneWire_Reset(); // 复位总线
OneWire_WriteByte(0xCC); // 跳过 ROM 指令
OneWire_WriteByte(0x44); // 启动转换命令
delay_ms(750); // 等待转换完成
OneWire_Reset();
OneWire_WriteByte(0xCC); // 再次跳过 ROM
OneWire_WriteByte(0xBE); // 发送读取存储器指令
for(int i = 0; i < 9; i++) { // 读取全部寄存器内容
scratchpad[i] = OneWire_ReadByte();
}
int16_t raw_temp = (scratchpad[1] << 8) | scratchpad[0];
temperature = ((float)(raw_temp)) * 0.0625;
return temperature;
}
```
上述代码实现了 DS18B20 的基本操作流程[^1],包括复位、发送命令、等待转换结束以及解析温度值。
---
##### 2. OLED 显示驱动模块
为了简化汉字显示逻辑,可采用预处理好的字体表形式加载字符图案:
```c
#include "ssd1306.h"
// 定义汉字数组索引位置
const unsigned char chinese_char[][20] PROGMEM = {
{ /* 中 */ ... },
{ /* 文 */ ... }
};
void ShowChineseCharacter(uint8_t line, uint8_t column, const unsigned char* font_data){
SSD1306_SetCursor(line, column);
for(int i=0;i<20;i++){
SSD1306_WriteData(pgm_read_byte(&font_data[i])); // 输出上半部分像素点
}
SSD1306_SetCursor(line+1,column);
for(int j=20;j<40;j++){
SSD1306_WriteData(pgm_read_byte(&font_data[j])); // 继续输出下半部分像素点
}
}
void DisplayTemperature(float temp_value){
char buffer[16];
sprintf(buffer,"Temp:%.2f C",temp_value);
SSD1306_ClearScreen();
SSD1306_GotoXY(0,0);
SSD1306_Puts(buffer,&Font_11x18,SSD1306_COLOR_WHITE);
ShowChineseCharacter(2,0,chinese_char[0]); // 打印第一个汉字“中”
ShowChineseCharacter(2,2,chinese_char[1]); // 打印第二个汉字“文”
SSD1306_UpdateScreen();
}
```
此段代码展示了如何利用自定义函数将浮点型变量格式化成字符串,并将其打印到屏幕上;同时也支持调用预先生成的汉字 HEX 数据来渲染中文文字[^3]。
---
##### 3. 主循环结构
最后,在主函数里周期性执行温感采集任务并将结果显示出来即可:
```c
int main(){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init(); // 初始化 IIC 设备
SSD1306_Init(); // 初始化 OLED 显示屏
while(1){
float current_temperature = Read_DS18B20_Temperature();
DisplayTemperature(current_temperature);
HAL_Delay(1000); // 每隔一秒刷新一次界面
}
}
```
以上为主程序框架设计思路[^2],它综合考虑了实时性和用户体验两方面因素。
---
###
阅读全文
相关推荐

















