【Proteus仿真】【STM32单片机】智能电饭煲系统设计

2023-05-16

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使用继电器加热/保温模块、数码管模块、按键模块、LED指示灯、蜂鸣器模块等。

主要功能:
系统运行后,数码管默认不显示,当按下K5键选择功能模式,此时数码管会显示对应模式所需时间,且LED指示灯工作,系统默认有煮饭、煮粥、蒸、煲汤四种功能,还可按下K6键设置预约时间,通过K2和K3键修改时间,当设置好时间后,按下K4键开始,预约时间开始倒计时,当时间达到后,继电器开启加热,在所选功能时间倒计时结束后停止加热,开启保温。若不需要保温,可按下K1键关闭。
主要功能如下:
1、功能:煮饭/煮粥/蒸/煲汤
2、按键:开始/取消/功能/加减/预约


二、软件设计

/*
作者:嗨小易(QQ:3443792007)
*/





//功能指示灯显示
void _fun_led_show(u8 sta)
{
	switch(sta)
	{
		case 1://煮饭
			LED_ZF=0;LED_ZZ=1;LED_Z=1;LED_BT=1; 
			break;
		case 2://煮粥
			LED_ZF=1;LED_ZZ=0;LED_Z=1;LED_BT=1; 
			break;
		case 3://蒸
			LED_ZF=1;LED_ZZ=1;LED_Z=0;LED_BT=1; 
			break;
		case 4://煲汤 
			LED_ZF=1;LED_ZZ=1;LED_Z=1;LED_BT=0;
			break;
	}	
}

//功能选择时间初始化
void _fun_time_init(u8 fun)
{
	switch(fun)
	{
		case 1://煮饭
			sys_ctrl.hour=0;sys_ctrl.min=0;sys_ctrl.sec=10; 
			break;
		case 2://煮粥
			sys_ctrl.hour=0;sys_ctrl.min=0;sys_ctrl.sec=7;  
			break;
		case 3://蒸
			sys_ctrl.hour=0;sys_ctrl.min=0;sys_ctrl.sec=5; 
			break;
		case 4://煲汤 
			sys_ctrl.hour=0;sys_ctrl.min=0;sys_ctrl.sec=4; 
			break;
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	key=KEY_Scan(0);

	//还未开启时,按键控制
	if(sys_ctrl.start==0)
	{
		//功能选择
		if(key==KEY5_PRESS)
		{
			sys_ctrl.fun++;
			if(sys_ctrl.fun>4)sys_ctrl.fun=1;
			_fun_led_show(sys_ctrl.fun);//功能指示灯显示
			_fun_time_init(sys_ctrl.fun);//设置初始时间	
		}
		//开始工作
		else if(key==KEY4_PRESS)
		{
			//未开启预约
			if(sys_ctrl.order==0)
			{
				//仅当选择好功能模式后,开启有效
				if(sys_ctrl.fun!=0)
				{
					sys_ctrl.start=1;
					LED_KS=0;//开始指示灯亮
					TIM_Cmd(TIM2,ENABLE);//开启定时器
					RELAY_JR=0;//加热开启
					RELAY_BW=1;//保温关闭
					sys_ctrl.insul=0;
				}		
			}
			//已开启预约
			else
			{
				//仅当选择好功能模式后,开启有效
				if(sys_ctrl.fun!=0)
				{
					sys_ctrl.start=1;
					TIM_Cmd(TIM2,ENABLE);//开启定时器
					RELAY_BW=1;//保温关闭
					sys_ctrl.insul=0;	
				}		
			}
		}
		//保温/取消
		else if(key==KEY1_PRESS)
		{
			//还未开启预约,保温
			if(sys_ctrl.order==0)
			{
				sys_ctrl.insul=!sys_ctrl.insul;
				RELAY_BW=!RELAY_BW;	
			}
			//已开启预约,取消
			else
			{
				sys_ctrl.order=0;
				LED_YY=1;		
			}	
		}
		//预约
		else if(key==KEY6_PRESS)
		{
			//已选择好功能模式,可以开始预约时间
			if(sys_ctrl.fun!=0)
			{
				sys_ctrl.order=1;
				LED_YY=0;	
			}		
		}
		//加
		else if(key==KEY2_PRESS)
		{
			//已开启预约,可以设置时间
			if(sys_ctrl.order==1)
			{
				sys_ctrl.time[1]+=30;//加30分钟
				if(sys_ctrl.time[1]>=60)
				{
					sys_ctrl.time[1]=0;
					sys_ctrl.time[0]++;//加1小时
					if(sys_ctrl.time[0]>23)sys_ctrl.time[0]=0;
				}	
			}	
		}
		//减
		else if(key==KEY3_PRESS)
		{
			//已开启预约,可以设置时间
			if(sys_ctrl.order==1)
			{
				sys_ctrl.time[1]-=30;//减30分钟
				if(sys_ctrl.time[1]<0)
				{
					sys_ctrl.time[1]=30;
					sys_ctrl.time[0]--;//减1小时
					if(sys_ctrl.time[0]<0)sys_ctrl.time[0]=23;
				}	
			}
		}		
	}
	//开始工作时,按键控制
	else
	{
		//取消
		if(key==KEY1_PRESS)
		{
			TIM_Cmd(TIM2,DISABLE);
			sys_parm_init();	
		}
	}	
}

//系统数据获取
void sys_data_get(void)
{
			
}

//系统数据显示
void sys_data_show(void)
{
	u8 buf[8];
	//还未开启时,功能选择时,数码管显示对应功能时间
	if(sys_ctrl.start==0)
	{
		//进入功能选择时,数据处理
		if(sys_ctrl.fun!=0)
		{
			//未开启预约,时间显示
			if(sys_ctrl.order==0)
			{
				buf[0]=gsmg_code[sys_ctrl.hour/10];
				buf[1]=gsmg_code[sys_ctrl.hour%10];
				buf[2]=0x40;
				buf[3]=gsmg_code[sys_ctrl.min/10];
				buf[4]=gsmg_code[sys_ctrl.min%10];
				buf[5]=0x40;
				buf[6]=gsmg_code[sys_ctrl.sec/10];
				buf[7]=gsmg_code[sys_ctrl.sec%10];
				//数码管显示
				smg_display(buf,1);	
			}
			//开启预约,数码管显示预约时间
			else
			{
				buf[0]=gsmg_code[sys_ctrl.time[0]/10];
				buf[1]=gsmg_code[sys_ctrl.time[0]%10];
				buf[2]=0x40;
				buf[3]=gsmg_code[sys_ctrl.time[1]/10];
				buf[4]=gsmg_code[sys_ctrl.time[1]%10];
				buf[5]=0x40;
				buf[6]=gsmg_code[sys_ctrl.time[2]/10];
				buf[7]=gsmg_code[sys_ctrl.time[2]%10];
				//数码管显示
				smg_display(buf,1);		
			}
						
		}
	}
	//开启后,时间显示
	else
	{
		//未开启预约,时间显示
		if(sys_ctrl.order==0)
		{
			buf[0]=gsmg_code[sys_ctrl.hour/10];
			buf[1]=gsmg_code[sys_ctrl.hour%10];
			buf[2]=0x40;
			buf[3]=gsmg_code[sys_ctrl.min/10];
			buf[4]=gsmg_code[sys_ctrl.min%10];
			buf[5]=0x40;
			buf[6]=gsmg_code[sys_ctrl.sec/10];
			buf[7]=gsmg_code[sys_ctrl.sec%10];
			//数码管显示
			smg_display(buf,1);	
		}
		//已开启预约,显示预约时间
		else
		{
			buf[0]=gsmg_code[sys_ctrl.time[0]/10];
			buf[1]=gsmg_code[sys_ctrl.time[0]%10];
			buf[2]=0x40;
			buf[3]=gsmg_code[sys_ctrl.time[1]/10];
			buf[4]=gsmg_code[sys_ctrl.time[1]%10];
			buf[5]=0x40;
			buf[6]=gsmg_code[sys_ctrl.time[2]/10];
			buf[7]=gsmg_code[sys_ctrl.time[2]%10];
			//数码管显示
			smg_display(buf,1);		
		}	
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
		
}

//应用控制系统
void appdemo_show(void)
{
	KEY_Init();
	smg_init();
	BEEP_Init();
	ctrl_pin_init();
	TIM2_Init(500-1,71);//定时10ms
	sys_parm_init();//系统参数初始化
	
	while(1)
	{
		sys_data_set();//系统数据设置
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_fun_ctrl();//系统功能控制		
	}
}

/*******************************************************************************
* 函 数 名         : TIM2_IRQHandler
* 函数功能		   : TIM2中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM2_IRQHandler(void)
{
	static u8 i=0;
	if(TIM_GetITStatus(TIM2,TIM_IT_Update))
	{
		i++;
		if(i>=100)//1S到达
		{
			i=0;
			//未开启预约,倒计时
			if(sys_ctrl.order==0)
			{
				sys_ctrl.sec--;
				if(sys_ctrl.sec<0)
				{
					sys_ctrl.sec=59;
					sys_ctrl.min--;
					if(sys_ctrl.min<0)
					{
						sys_ctrl.min=59;
						sys_ctrl.hour--;
						if(sys_ctrl.hour<=0)
							sys_ctrl.hour=0;		
					}			
				}
				else if(sys_ctrl.sec==0)
				{
					if(sys_ctrl.min==0)
					{
						if(sys_ctrl.hour==0)//时间达到
						{
							TIM_Cmd(TIM2,DISABLE);//关闭定时器
							sys_parm_init();
							sys_ctrl.okflag=1;
							sys_ctrl.insul=1;//保温标记
							RELAY_BW=0;//保温开启
							BEEP=0;//蜂鸣器提示
							delay_ms(1000);
							BEEP=1;	
						}	
					}
				}	
			}
			//已开启预约,倒计时
			else
			{
				sys_ctrl.time[2]--;
				if(sys_ctrl.time[2]<0)
				{
					sys_ctrl.time[2]=59;
					sys_ctrl.time[1]--;
					if(sys_ctrl.time[1]<0)
					{
						sys_ctrl.time[1]=59;
						sys_ctrl.time[0]--;
						if(sys_ctrl.time[0]<=0)
							sys_ctrl.time[0]=0;		
					}			
				}
				else if(sys_ctrl.time[2]==0)
				{
					if(sys_ctrl.time[1]==0)
					{
						if(sys_ctrl.time[0]==0)//时间达到
						{
							sys_ctrl.order=0;
							sys_ctrl.okflag=0;
							sys_ctrl.time[0]=0;sys_ctrl.time[1]=0;sys_ctrl.time[2]=0;
					
							LED_KS=0;LED_YY=1;//开始指示灯亮

							sys_ctrl.okflag=1;
							sys_ctrl.start=1;
							TIM_Cmd(TIM2,ENABLE);//开启定时器
							RELAY_JR=0;//加热开启	
						}	
					}
				}	
			}
		}			
	}
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);	
}





三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Proteus仿真】【STM32单片机】智能电饭煲系统设计 的相关文章

随机推荐

  • firefox 的cookie 存放在哪里?

    在地址栏输入about surpport 打开配置页 找到about profiles 点击打开 看到有两个目录项 看准正在使用的那一个 34 正在使用此配置文件 34 找到cookie sqlite 的位置 正在使用的那个配置是删不掉的
  • C++ 构造函数和New运算符

    算法和数据结构就是编程的一个重要部分 xff0c 你若失掉了算法和数据结构 xff0c 你就把一切都失掉了 系统会自动在栈中为每个变量开辟内存空间 xff0c 以保证数值被合理地存放 由于栈是系统自动分配的 xff0c 因此速度较快 xff
  • matlab函数interp2及其c++代码

    最近将一个matlab程序转为c 途中遇到interp2这个家伙 我是左查右查 发现网上没有人总结这个玩意 于是我来初探一下 还是别有洞天的 嘿嘿 1 关于interp2 nbsp nbsp Vq interp2 X Y V Xq Yq l
  • CentOS 7中利用Snapper快照进行系统备份与恢复

    为什么要使用Snapper快照 xff1f 我们可以想像以下场景 xff1a 1 场景一 xff1a 系统发生意外宕机 xff0c 工程师无法快速定位问题 xff0c 业务受到中断 xff0c 客户十分不满意 2 场景二 xff1a 项目会
  • 计蒜之道 作弊揭发者(测试赛)

    鉴于我市拥堵的交通状况 xff0c 市政交管部门经过听证决定在道路两侧安置自动停车收费系统 当车辆驶入车位 xff0c 系统会通过配有的摄像头拍摄车辆画面 xff0c 通过识别车牌上的数字 字母序列识别车牌 xff0c 通过连接车管所车辆信
  • 7-10 兔子繁衍问题

    7 10 兔子繁衍问题 xff08 15 分 xff09 一对兔子 xff0c 从出生后第3个月起每个月都生一对兔子 小兔子长到第3个月后每个月又生一对兔子 假如兔子都不死 xff0c 请问第1个月出生的一对兔子 xff0c 至少需要繁衍到
  • Ubuntu运行tkinter程序的部署

    软件部署 xff08 Ubuntu系统 xff09 1 安装python环境 前提需要有网 ubuntu会自带python xff0c 不用单独安装 xff0c 但python的pip工具和tkinter包需要安装 xff08 1 xff0
  • Linux-用shell脚本写一个进度条

    shell执行脚本 xff1a 创建一个 sh文件 xff0c 编辑文件即可执行脚本 Shell脚本中用 表示注释 xff0c 相当于c语言的 注释 但如果 位于第一行开头 xff0c 并且是则例外 xff0c 它表示该脚本使用后面指定的解
  • S3C2440裸机按键控制小灯

    1 环境 1 操作系统 xff1a win7 64位 2 集成开发环境 xff1a keil4 7 3 开发板 xff1a FL2440 4 下载器 xff1a Jlink V9 2 按键以及LED灯原理图 根据FL2440开发板原理图可知
  • 数组存邻接表

    模板 xff1a 数组表示邻接表 int top 61 0 向 点中存第top个边 int head MAX N 61 1 每个点在建立邻接表时 xff0c 栈顶的边的编号 边的结构体 struct Edge int v 另一端连接的点 i
  • windows远程桌面到Ubuntu

    环境 xff1a VMware 43 Ubuntu18 04 方案 xff1a xrdp 43 gnome ubuntu xff08 不要安装xubuntu xff0c 费力不讨好 xff09 自己分步安装有时会遇到配置困难 xff0c 建
  • 系列一、NotePad++离线安装NppFTP插件

    一 下载离线插件 链接 xff1a https pan baidu com s 16EEGYOTKkMP bB8LcnwpsQ pwd 61 yyds 提取码 xff1a yyds 二 解压自己NotePad 43 43 对应版本 xff0
  • Ubuntu18 AMD和ARM版本的源的区别

    Ubuntu18 AMD和ARM版本的源的区别 文章目录 Ubuntu18 AMD和ARM版本的源的区别AMD版本ARM版本主要区别 之前因为懒没有仔细研究ubuntu AMD和ARM版本系统apt源的区别 xff0c 导致今天换源时候走了
  • 【C51】基于C51单片机的定时闹钟(含代码,电路,拿走即可用)

    基于C51单片机的定时闹钟 上电后设置定时时间 xff0c 按键1选择设置的是小时分钟还是秒钟 按键2对其进行具体的数字设置 一次选择完成之后就默认进入计时模式 达到计时时间后响铃 按键3可以关闭响铃 代码 span class token
  • 解决Centos7.9图形界面root用户登录报“sorry, that didn‘t work please try again”问题

    一 问题描述 xff1a 新装的Centos7 9 在图形界面以root身份进行登录时报 sorry that didn t work please try again xff0c 如下图所示 xff1a 经确认 xff0c root密码是
  • ubuntu 安装QT 5.0出现错误:Failed to load platform plugin "xcb".

    当你安装QT 5 0 时 xff0c 启动的时候会出现如下错误 xff1a Failed to load platform plugin 34 xcb 34 Available platforms are linuxfb minimal x
  • 获取Android设备的序列号(SN号)

    方法 xff08 一 xff09 通过反射获取sn号 public static String getDeviceSN String serial 61 null try Class lt gt c 61 Class forName 34
  • Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较

    一 邮件发送流程 邮件的发送是主动行为 xff1a 主要通过 MUA 邮件客户端软件 xff0c 将邮件内容发送给对应的服务器 暂存到投递服务区 xff0c 然后由当前运营商根据邮件特征信息将邮件转发给目标服务器的投递服 务区 xff0c
  • mysql limit 使用规范

    在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢 xff1f 不用担心 xff0c mysql 已经为我们提供了上面这样一个功能 xff08 0 xff09 mysql不支持select
  • 【Proteus仿真】【STM32单片机】智能电饭煲系统设计

    文章目录 一 功能简介二 软件设计三 实验现象联系作者 一 功能简介 本项目使用Proteus8仿真STM32单片机控制器 xff0c 使用继电器加热 保温模块 数码管模块 按键模块 LED指示灯 蜂鸣器模块等 主要功能 xff1a 系统运