作品功能
这个智能温度控制系统基于MSP430单片机设计,能够实时监测环境温度并根据预设的温度报警值自动调节风扇和加热片的工作状态。主要功能包括:
- 实时显示当前温度。
- 通过OLED屏幕显示温度报警值。
- 通过按键设置温度报警值。
- 实际温度超过报警值时,自动开启风扇。
- 实际温度低于报警值时,自动开启加热片。
硬件材料
- MSP430 单片机
- DS18B20 温度传感器
- OLED 显示屏
- 风扇
- 加热片
- 按键
电子元器件如何连接
-
DS18B20 温度传感器
- VCC 接 3.3V
- GND 接 GND
- DATA 接 P1.5
-
OLED 显示屏
- VCC 接 3.3V
- GND 接 GND
- SCL 接 P2.0
- SDA 接 P2.2
-
加热片
- VCC 接 3.3V
- GND 接 GND
- DATA 接 P2.3
-
风扇
- VCC 接 3.3V
- GND 接 GND
- DATA 接 P2.6
-
按键
- 按键1 接 P1.1 (板子上有)
- 按键2 接 P2.1 (板子上有)
代码讲解
初始化部分
初始化了OLED显示屏并在屏幕上设置了温度控制相关的汉字显示位置,同时配置了按键和传感器的端口。
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
OLED_Init(); // OLED初始化
// 第一排显示 "温度检测控制"
OLED_ShowCHinese(16 * 1, 0, 0);
OLED_ShowCHinese(16 * 2, 0, 1);
OLED_ShowCHinese(16 * 3, 0, 2);
OLED_ShowCHinese(16 * 4, 0, 3);
OLED_ShowCHinese(16 * 5, 0, 4);
OLED_ShowCHinese(16 * 6, 0, 5);
// 第二排显示 "温度:"
OLED_ShowCHinese(16 * 0, 2, 6);
OLED_ShowCHinese(16 * 1, 2, 7);
OLED_ShowCHinese(16 * 2, 2, 8);
// 第三排显示 "临界:"
OLED_ShowCHinese(16 * 0, 4, 9);
OLED_ShowCHinese(16 * 1, 4, 10);
OLED_ShowCHinese(16 * 2, 4, 11);
// 显示临界值
display_num_oled(16 * 3, 4, Temp_critical_value);
主循环部分
在主循环中,系统会不断读取温度传感器的值并更新显示。如果按下按键1,增加临界值;按下按键2,减少临界值。根据当前温度和临界值的比较,自动控制风扇和加热片的开关。
while (1) {
delay_ms(10);
t = (t + 1) % 20;
if (t == 1) {
temperature = get_one_temperature(); // 读取温度
display_num_oled(16 * 3, 2, temperature); // 显示温度
}
// 按键1:增加临界值
if (!(P1IN & BIT1)) {
while (!(P1IN & BIT1));
if (Temp_critical_value < 400) {
Temp_critical_value += 10;
}
display_num_oled(16 * 3, 4, Temp_critical_value); // 显示临界值
}
// 按键2:减少临界值
if (!(P2IN & BIT1)) {
while (!(P2IN & BIT1));
if (Temp_critical_value > 20) {
Temp_critical_value -= 10;
}
display_num_oled(16 * 3, 4, Temp_critical_value); // 显示临界值
}
// 温度控制逻辑
if (temperature > (Temp_critical_value + 10)) {
P2OUT |= BIT3; // 关闭加热片
P2OUT &= ~BIT6; // 打开风扇
OLED_ShowCHinese(16 * 0, 6, 14); // 显示"制冷"
OLED_ShowCHinese(16 * 1, 6, 15); // 显示"制冷"
} else if (temperature < (Temp_critical_value - 10)) {
P2OUT &= ~BIT3; // 打开加热片
P2OUT |= BIT6; // 关闭风扇
OLED_ShowCHinese(16 * 0, 6, 12); // 显示"加热"
OLED_ShowCHinese(16 * 1, 6, 13); // 显示"加热"
} else {
P2OUT |= BIT3; // 关闭加热片
P2OUT |= BIT6; // 关闭风扇
OLED_ShowString(0, 6, " ");
}
}
全部代码
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2