Bootstrap

【单片机毕业设计】【mcuclub-dz-058】基于单片机的智能水杯控制系统

   最近设计了一个项目基于单片机的智能水杯控制系统,与大家分享一下:

一、基本介绍

项目名:智能水杯
单片机: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;
	}
}

;