作品功能
本项目设计并实现了一个基于MSP430单片机的智能温控系统。系统可以实时显示当前温度,并且可以根据设置的临界值对环境进行加热或降温。主要功能如下:
- 实时显示当前温度。
- 显示并调整温度临界值,临界值可在20~35摄氏度之间调节。
- 当前温度高于(临界值+1)摄氏度时,绿灯亮,表示降温状态。
- 当前温度低于(临界值-1)摄氏度时,加热片工作,表示加热状态。
- 当前温度高于35摄氏度时,蜂鸣器报警。
- 设置温度临界值高于30摄氏度时,红灯亮,提醒避免设置温度过高。
作品的硬件材料
- MSP430F5529 单片机
- DS18B20温度传感器
- OLED显示屏(IIC接口)
- 绿灯(LED) 板子上有
- 红灯(LED) 板子上有
- 无源蜂鸣器
- 加热片
电子元器件连接
各元器件的连接如下:
- DS18B20:VCC - VCC, DS - P15, GND - GND
- OLED:GND - GND, VCC - VCC, SCL - P20, SDA - P22
- 蜂鸣器:VCC - VCC, GND - GND, IN - P36
- 加热片:VCC - VCC, GND - GND, IN - P23
- 按键:P21, P11
- 绿灯:P47
- 红灯:P10
部分代码
int main(void)
{
unsigned char dis[10];
unsigned char time_cyc = 0;
WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */
/* 初始化显示 */
OLED_Init(); /* OLED初始化 */
OLED_ShowString(0, 0, "DS18B20:");
OLED_ShowString(0, 4, "SET:");
display_set_temp();
/*按键端口 */
P1DIR &= ~BIT1;
P1SEL &= ~BIT1;
P1REN |= BIT1;
P1OUT |= BIT1;
P2DIR &= ~BIT1;
P2SEL &= ~BIT1;
P2REN |= BIT1;
P2OUT |= BIT1;
/* 绿灯端口 */
P4DIR |= BIT7;
/* 红灯端口 */
P1DIR |= BIT0;
/* 蜂鸣器端口 P3.6*/
P3SEL |= BIT6; // P3.5-7.6 option select
P3DIR |= BIT6; // P3.5-7.6 outputs
/* 加热片端口 */
P2DIR |= BIT3;
while (1)
{
delay_ms(10);
time_cyc = (time_cyc + 1) % 30;
if (time_cyc == 1) /* 30 个10ms执行一次 */
{
temp_value = get_one_temperature(); /* 读取温度 */
dis[0] = temp_value % 1000 / 100 + '0';
dis[1] = temp_value % 100 / 10 + '0';
dis[2] = '.';
dis[3] = temp_value % 10 + '0';
dis[4] = 'C';
dis[5] = 0;
OLED_ShowString(0, 2, dis);
}
/* 以下是根据温度控制 */
if (temp_value > (set_temp + 10)) /* 3 实际温度高于(临界值+1)后绿灯亮表示降温。 */
{
P4OUT |= BIT7; /* 高电平 绿灯点亮 */
P2OUT |= BIT3; /* 加热片不工作 */
OLED_ShowString(0, 6, "cooling");
}
else if (temp_value < (set_temp - 10)) /* 4 实际温度低于(临界值-1)后加热片工作表示加热。 */
{
P4OUT &= ~BIT7; /* 绿灯不亮 */
P2OUT &= ~BIT3; /* 低电平 加热片工作 */
OLED_ShowString(0, 6, "heating");
}
else
{
P4OUT &= ~BIT7; /* 绿灯不亮 */
P2OUT |= BIT3; /* 加热片不工作 */
OLED_ShowString(0, 6, " ");
}
/* 5 实际温度高于35摄氏度无源蜂鸣器报警。 */
if (temp_value > 350)
{
TBCCR6 = 500; //打开蜂鸣器 /* PWM占空比 500/1000 蜂鸣器响 */
}
else
{
TBCCR6 = 0; //关闭打开蜂鸣器
}
/* 6 设置温度时候,临界值高于30摄氏度,红灯亮,提醒避免设置温度过高。 */
if (set_temp > 300)
{
P1OUT |= BIT0; /* 高电平 红灯点亮 */
}
else
{
P1OUT &= ~BIT0;
}
/* 以下是按键处理 2 显示临界值,按键可以加减临界值,临界值在20~35之间可调。 */
//按键1检测处理
if (!(P1IN & BIT1))
{
while (!(P1IN & BIT1))
;
if (set_temp < 350)
{
set_temp += 10;
}
display_set_temp();
}
//按键2检测处理
if (!(P2IN & BIT1))
{
while (!(P2IN & BIT1))
;
if (set_temp > 200)
{
set_temp -= 10;
}
display_set_temp();
}
}
}
全部代码
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2