当前位置:实例文章 » 其他实例» [文章]STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)

STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)

发布人:shili8 发布时间:2025-01-18 08:58 阅读次数:0

**STM32实现MLX90614非接触测温串口显示**

**前言**

在实际应用中,温度检测是一个非常重要的功能。MLX90614是一款常用的数字温度传感器,可以通过I2C总线进行通信。在本文中,我们将使用STM32微控制器实现MLX90614非接触测温串口显示。

**硬件配置**

* STM32F103ZET6微控制器* MLX90614数字温度传感器* USB-UART模块(用于串口通信)
* LED灯和电阻(用于示例)

**软件配置**

* Keil MDK-ARM IDE* STM32CubeMX5.4.0* HAL库v1.25.0**标准库实现**

###1. MLX90614的I2C通信首先,我们需要在STM32上初始化I2C总线,并配置MLX90614的地址。

c#include "stm32f10x.h"
#include "i2c.h"

// I2C总线初始化void i2c_init(void) {
 // 配置I2C时钟频率为400kHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
 I2C_InitTypeDef i2c_InitStruct;
 i2c_InitStruct.I2C_ClockSpeed =400000; //400kHz i2c_InitStruct.I2C_DutyCycle = I2C_DUTYCYCLE_16_9;
 i2c_InitStruct.I2C_Mode = I2C_Mode_I2C;
 i2c_InitStruct.I2C_NumbOfModes =1;
 i2c_InitStruct.I2C_OwnAddressMask =0x00; // 不使用自定义地址 i2c_InitStruct.I2C_Datasize = I2C_Datasize_8Bit;
 i2c_InitStruct.I2C_ClockSpeed =400000; //400kHz i2c_InitStruct.I2C_Acknowledge = ENABLE;
 I2C_Init(I2C1, &i2c_InitStruct);
}

// MLX90614的地址配置void mlx_init(void) {
 // 配置MLX90614的I2C地址为0x5A I2C_GenerateStartCondition(I2C1);
 I2C_Send7bitAddress(I2C1,0x5A, ENABLE);
}


###2. MLX90614的温度读取接下来,我们需要在STM32上读取MLX90614的温度数据。

c//读取MLX90614的温度数据uint16_t mlx_read(void) {
 uint8_t data[2];
 I2C_GenerateStartCondition(I2C1);
 I2C_Send7bitAddress(I2C1,0x5A, ENABLE);
 I2C_AcknowledgeConfig(I2C1, DISABLE);
 I2C_SendData(I2C1,0x00, ENABLE);
 I2C_GenerateStopCondition(I2C1);
 I2C_Delay(10); // 等待数据准备好 I2C_GenerateStartCondition(I2C1);
 I2C_Send7bitAddress(I2C1,0x5A, ENABLE);
 I2C_AcknowledgeConfig(I2C1, DISABLE);
 I2C_ReceiveData(I2C1, data,2, ENABLE);
 uint16_t temperature = (data[0] << 8) | data[1];
 return temperature;
}


###3. MLX90614的温度显示最后,我们需要在STM32上显示MLX90614的温度数据。

c// 显示MLX90614的温度数据void mlx_display(void) {
 uint16_t temperature = mlx_read();
 // 将温度数据转换为字符串 char str[10];
 sprintf(str, "%d°C", temperature);
 // 显示温度数据 printf("%s
", str);
}


**HAL库实现**

###1. MLX90614的I2C通信首先,我们需要在STM32上初始化I2C总线,并配置MLX90614的地址。

c#include "stm32f10x.h"
#include "i2c.h"

// I2C总线初始化void i2c_init(void) {
 // 配置I2C时钟频率为400kHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
 I2C_InitTypeDef i2c_InitStruct;
 i2c_InitStruct.I2C_ClockSpeed =400000; //400kHz i2c_InitStruct.I2C_DutyCycle = I2C_DUTYCYCLE_16_9;
 i2c_InitStruct.I2C_Mode = I2C_Mode_I2C;
 i2c_InitStruct.I2C_NumbOfModes =1;
 i2c_InitStruct.I2C_OwnAddressMask =0x00; // 不使用自定义地址 i2c_InitStruct.I2C_Datasize = I2C_Datasize_8Bit;
 i2c_InitStruct.I2C_ClockSpeed =400000; //400kHz i2c_InitStruct.I2C_Acknowledge = ENABLE;
 I2C_Init(I2C1, &i2c_InitStruct);
}

// MLX90614的地址配置void mlx_init(void) {
 // 配置MLX90614的I2C地址为0x5A I2C_GenerateStartCondition(I2C1);
 I2C_Send7bitAddress(I2C1,0x5A, ENABLE);
}


###2. MLX90614的温度读取接下来,我们需要在STM32上读取MLX90614的温度数据。

c//读取MLX90614的温度数据uint16_t mlx_read(void) {
 uint8_t data[2];
 I2C_GenerateStartCondition(I2C1);
 I2C_Send7bitAddress(I2C1,0x5A, ENABLE);
 I2C_AcknowledgeConfig(I2C1, DISABLE);
 I2C_SendData(I2C1,0x00, ENABLE);
 I2C_GenerateStopCondition(I2C1);
 I2C_Delay(10); // 等待数据准备好 I2C_GenerateStartCondition(I2C1);
 I2C_Send7bitAddress(I2C1,0x5A, ENABLE);
 I2C_AcknowledgeConfig(I2C1, DISABLE);
 I2C_ReceiveData(I2C1, data,2, ENABLE);
 uint16_t temperature = (data[0] << 8) | data[1];
 return temperature;
}


###3. MLX90614的温度显示最后,我们需要在STM32上显示MLX90614的温度数据。

c// 显示MLX90614的温度数据void mlx_display(void) {
 uint16_t temperature = mlx_read();
 // 将温度数据转换为字符串 char str[10];
 sprintf(str, "%d°C", temperature);
 // 显示温度数据 printf("%s
", str);
}


**总结**

在本文中,我们使用STM32微控制器实现了MLX90614非接触测温串口显示。首先,我们初始化了I2C总线,并配置了MLX90614的地址。然后,我们读取了MLX90614的温度数据,并将其转换为字符串。最后,我们在STM32上显示了MLX90614的温度数据。

**参考**

* STM32CubeMX5.4.0* HAL库v1.25.0* Keil MDK-ARM IDE

其他信息

其他资源

Top