最近设计了一个项目基于单片机的智能水杯控制系统,与大家分享一下:
一、基本介绍
项目名:智能水杯
单片机:STC89C52
项目编号:mcuclub-dz-058
功能简介:
1、通过防水式DS18B20测水温,当水温低于设置最小值,进行加热直到温度大于等于100摄氏度,则蜂鸣器报警1s提醒加热完成
2、通过按键可设置定时提醒喝水时间(时分秒),当倒计时到达后,开始蜂鸣器提醒3s喝水,并通过GSM发送喝水短信“喝水时间到,请喝水”
3、通过重量传感器检测水量是否减少,如果减少,则为喝水,然后重新倒计时
4、通过按键可设置温度最小值
5、通过LCD1602显示温度、重量、倒计时时间
二、51实物图
单片机型号:STC89C52
板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。
供电接口:TYPE-C
三、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
四、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
五、系统框图
本设计以单片机为核心控制器,加上其他模块一起组成此次设计的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。输入由四部分组成,第一部分是温度检测模块,通过该模块检测当前水杯中的水温;第二部分是称重模块,检测当前水杯中的水量;第三部分是按键模块,通过该模块设置喝水的时间和设置水温的阈值等;第四部分是供电模块,给整个系统进行供电;输出由四部分组成,第一部分是显示模块,显示当前的水温、水量、倒计时时间;第二部分是继电器模块,通过该模块控制加热片进行工作;第三部分是报警模块,检测到用户定时喝水时间到达,进行蜂鸣器鸣响3s提醒;第四部分是GSM模块,定时喝水时间到达,通过GSM发送喝水短信“喝水时间到,请喝水”。具体系统框图如图3.1所示。
六、软件设计流程
系统的主流程图如图4-2所示。在主程序中:首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先进入第一个函数按键函数,该函数主要分为两部分,第一部分为调用按键扫描函数获取按键键值,第二部分通过键值进行相应的处理操作,包括切换界面、设置阈值等;紧接着进入第二个函数监测函数,该函数主要通过调用相应的驱动函数获取测量值;紧接着进入第三个函数显示函数,该函数显示监测值及阈值;最后进入第四个函数处理函数,如果温度小于温度最小值,开启加热,如果温度大于或者等于100度,停止加热,蜂鸣器报警1秒提醒,温度在正常值时取消声光报警,倒计时结束,蜂鸣器报警三秒提醒喝水,同时发送短信“喝水时间到,请喝水”,如果喝水,重新赋值倒计时时间,如果没有喝水,开启十秒定时,十秒中蜂鸣器报警一次,提醒喝水,如果水喝完时关闭定时器,倒计时显示0,同时关闭蜂鸣器和加热。
七、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
*******处理函数
*****/
void Manage_function(void)
{
if(flag_display == 0) //测量界面
{
if(weight_value >= weight_value_old) //检测重量是否发生变化,变化后重新赋值当前重量
weight_value_old = weight_value;
if(weight_value/100 > 0) //如果重量大于0
{
if(flag_end == 1) //如果结束标志位为1
{
if(weight_value >= weight_value_old) //如果重量大于之前重量
{
countdown_hour = countdown_hour_old; //重新赋值倒计时时间
countdown_minute = countdown_minute_old;
countdown_second = countdown_second_old;
}
flag_end = 0;
}
if(temp_value < temp_min*10) //如果温度小于温度最小值,开启加热
{
JR = 0;
flag_temp_beep = 1;
}
else if(temp_value >= temp_max*10) //如果温度大于或者等于100度,停止加热,蜂鸣器报警1秒提醒
{
JR = 1;
if(flag_temp_beep == 1)
{
BEEP = 0;
Delay_function(1000);
BEEP = 1;
flag_temp_beep = 0;
}
}
else //温度在正常值时温度报警标志位置1
{
flag_temp_beep = 1;
}
if(countdown_hour != 0 || countdown_minute != 0 || countdown_second != 0) //设置时间不为0
{ //打开定时器
flag_timer_begin = 1;
}
if(flag_1s == 1) //1s到达
{
flag_1s = 0;
if(countdown_second > 0) //倒计时秒>0
countdown_second--; //倒计时秒-1
else //倒计时秒=0
{
if(countdown_minute > 0) //如果倒计时分>0
{
countdown_minute--; //倒计时分-1
countdown_second = 59; //倒计时秒=59
}
else //如果倒计时分=0
{
if(countdown_hour > 0) //如果倒计时时>0
{
countdown_hour--; //倒计时时-1
countdown_minute = 59; //倒计时分=59
countdown_second = 59; //倒计时秒=59
}
else //如果倒计时时=0,倒计时结束
{
flag_timer_begin = 0;
flag_countdown_end = 1;
flag_weight_beep = 1;
}
}
}
}
if(flag_countdown_end == 1) //倒计时结束
{
flag_countdown_end = 0; //蜂鸣器报警三秒提醒喝水,同时发送短信“喝水时间到,请喝水”
BEEP = 0;
Delay_function(1000);
Delay_function(1000);
Delay_function(1000);
BEEP = 1;
send_msg_chinese("559D6C3465F695F45230FF0C8BF7559D6C34");
if(weight_value/100 < weight_value_old/100) //如果喝水
{
countdown_hour = countdown_hour_old; //重新赋值倒计时时间
countdown_minute = countdown_minute_old;
countdown_second = countdown_second_old;
weight_value_old = weight_value;
flag_weight_beep = 0;
}
else //没有喝水,重量没有减少标志位置1
{
BEEP = 1;
flag_weight_beep = 1;
weight_value_old = weight_value;
}
}
if(flag_weight_beep == 1) //如果没有喝水,开启十秒定时,十秒中蜂鸣器报警一次,提醒喝水
{
flag_timer_begin_10s = 1;
if(flag_10s == 1)
{
BEEP = 0;
Delay_function(1000);
BEEP = 1;
flag_10s = 0;
}
if(weight_value/100 < weight_value_old/100) //如果喝水,那么重新倒计时
{
countdown_hour = countdown_hour_old; //重新赋值倒计时时间
countdown_minute = countdown_minute_old;
countdown_second = countdown_second_old;
weight_value_old = weight_value;
flag_weight_beep = 0;
flag_timer_begin_10s = 0;
BEEP = 1;
}
}
}
else //如果水喝完时关闭定时器,倒计时显示0,同时关闭蜂鸣器和加热
{
flag_timer_begin = 0;
flag_timer_begin_10s = 0;
flag_weight_beep = 0;
weight_value_old = 0;
countdown_hour = 0;
countdown_minute = 0;
countdown_second = 0;
BEEP = 1;
JR = 1;
flag_end = 1;
}
}
else //设置界面
{
flag_timer_begin = 0;
flag_timer_begin_10s = 0;
JR = 1;
BEEP = 1;
}
}