stm32f103c8t6 主芯片使用ds18b20温度传感器(PA4引脚)将数据显示到 0.96oled屏(PB8\PB9)
时间: 2025-04-03 10:04:29 浏览: 93
### 实现 STM32F103C8T6 主控通过 PA4 读取 DS18B20 数据并显示在 PB8/PB9 连接的 OLED 屏幕上的示例代码
以下是基于 STM32F103C8T6 的实现方案,其中 PA4 被配置为 DS18B20 接口,PB8 和 PB9 配置为 I2C 总线用于驱动 0.96 寸 OLED 显示屏。
#### 示例代码
```c
#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
// 定义I2C地址和OLED控制命令
#define OLED_I2C_ADDR 0x3C
#define SET_CONTRAST 0x81
#define DISPLAY_ALL_ON_RESUME 0xA4
#define NORMAL_DISPLAY 0xA6
#define DISPLAY_ON 0xAF
void GPIO_Config(void);
void I2C_Init(void);
void Delay_us(uint32_t us);
void Write_I2C_Data(unsigned char addr, unsigned char reg, unsigned char data[]);
void Read_DS18B20_Temperature(float *temperature);
int main(void) {
float temperature;
uint8_t buffer[16];
// 初始化GPIO和I2C
GPIO_Config();
I2C_Init();
while (1) {
// 读取DS18B20温度值
Read_DS12B20_Temperature(&temperature);
// 将浮点型转换为字符串形式
sprintf((char *)buffer, "%.2f C", temperature);
// 发送数据到OLED屏幕
Write_I2C_Data(OLED_I2C_ADDR, 0x40, buffer);
// 延迟一段时间刷新
for(int i=0;i<10000;i++);
}
}
/**
* @brief 配置GPIO引脚
*/
void GPIO_Config() {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 配置PA4作为DS18B20输入输出端口
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PB8(Pin_SCL), PB9(Pin_SDA)作为I2C接口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**
* @brief 初始化I2C通信协议
*/
void I2C_Init() {
I2C_DeInit(I2C1);
I2C_InitTypeDef I2C_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
I2C_InitStruct.I2C_ClockSpeed = 100000;
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);
}
/**
* @brief 微秒级延时函数
* @param us 延时时长(微秒)
*/
void Delay_us(uint32_t us){
SysTick->LOAD = us * 9;
SysTick->VAL = 0x00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;
while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk ;
}
/**
* @brief 向指定设备发送数据
* @param addr 设备地址
* @param reg 注册表地址
* @param data[] 数据缓冲区
*/
void Write_I2C_Data(unsigned char addr, unsigned char reg, unsigned char data[]) {
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, reg);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
int length = strlen((const char*)data);
for(int i=0;i<length;i++) {
I2C_SendData(I2C1, *(data+i));
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
I2C_GenerateSTOP(I2C1, ENABLE);
}
/**
* @brief 读取DS18B20传感器的数据
* @param temperature 存储温度变量指针
*/
void Read_DS18B20_Temperature(float *temperature) {
// DS18B20初始化过程省略...
// 此处应加入具体的一线制通讯逻辑来获取温度数值
// 模拟返回固定温度值以便测试程序运行效果
*temperature = 25.5; // 测试用模拟值[^1]
}
```
以上代码实现了基本的功能框架。需要注意的是,`Read_DS18B20_Temperature()` 函数中的实际一线制通信部分未完全展开,建议参考官方文档或现有库文件补充完整。
---
###
阅读全文
相关推荐















