stm32f103c8t6读取DS18B20并显示在0.96串口屏上的代码
时间: 2024-10-17 17:01:16 浏览: 30
STM32F103C8T6——DS18B20_OLED,stm32f103c8t7,C,C++
5星 · 资源好评率100%
要使用STM32F103C8T6微控制器(基于ARM Cortex-M3)读取DS18B20温度传感器的数据并在0.96寸LCD显示屏上显示,你需要遵循以下步骤:
1. **硬件连接**:
- 连接DS18B20传感器到GPIO引脚,通常使用数字输出(例如PA8或PB7)进行数据线(DQ)和电源(VCC、GND)。
- 连接0.96寸LCD屏到STM32,根据屏的具体规格配置I2C通信,一般使用I2C1接口。
2. **软件配置**:
- 配置STM32的GPIO和I2C模块。
- 初始化I2C通信。
3. **DS18B20操作**:
- 发送开始信号和寻址命令以选择温度传感器。
- 发送读取单次测量值(ROM 操作)命令。
- 接收返回的16位温度数据。
4. **处理和转换温度值**:
- 将接收到的16位二进制数转换为摄氏度。
5. **显示温度**:
- 使用I2C驱动LCD屏显示温度。
以下是一个简化的示例代码片段,展示了基本概念,实际应用中可能需要根据具体库文件调整:
```c
#include "stm32f1xx_hal.h"
#include "stmhal_lcd.h"
#include <stdio.h>
// DS18B20寄存器地址和偏移量
#define DIO_OFFSET 0x40
#define TEMP_CONV_ADDR 0x41
void I2C_Init(void);
int read_DS18B20();
float convertTemp(int raw);
int main(void)
{
// ...其他初始化代码...
I2C_Init();
while (1) {
int temp = read_DS18B20(); // 获取温度值
float celsius = convertTemp(temp); // 转换为摄氏度
display_LCD(celsius, 10, 1); // 显示温度在LCD上
HAL_Delay(2000); // 每隔2秒更新一次
}
return 0;
}
// I2C 初始化函数
void I2C_Init()
{
... // 实现具体的I2C初始化,包括时钟速度设置等
}
// 从DS18B20读取温度值
int read_DS18B20()
{
int data[2];
uint8_t address = 0x48; // DS18B20默认地址
HAL_I2C_Master_Transmit(&hi2c1, address, (uint8_t*)&DIO_OFFSET, 1, NULL);
HAL_Delay(1); // 等待数据传输完成
HAL_I2C_Master_Transmit(&hi2c1, address, &TEMP_CONV_ADDR, 1, &data[0]);
HAL_Delay(1); // 再次等待数据传输完成
return data[0] << 8 | data[1]; // 返回温度数据
}
// 温度转换函数
float convertTemp(int raw)
{
// 假设原始值范围是从9到9999,这里简化计算
return ((raw / 100.0) * 10); // 浮点温度,保留一位小数
}
// LCD 显示函数
void display_LCD(float value, int x, int y)
{
lcd_goto(x, y);
lcd_putstr("$%.1f°C", value);
}
```
阅读全文