基于中微89F2265B的200w智能电饭煲

大三暑假的时候,小组三人从零设计了一个智能电饭煲项目

一、主要功能

电饭煲主要功能概括为以下四点:

主要功能逻辑
功能选择① 按“功能选择”键,可依次从煮饭-慢炖-粥/汤-保温之间循环切换。
② 选择功能后,无其他操作5秒后自动进入工作状态数码管显示“- -”并上下跳动。
保温预约① 在待机状态下数码管显示“- -”,按“保温取消”键直接进入保温状态。备注:在通电状态下保温时长为24小时。
② 在工作状态下数码管显示“- -”并上下跳动,按“保温取消”键可取消操作进行重新操作。
定时① 按“定时”键可进行定时设定,煮饭和保温无定时设定。
② 按“功能选择”键选择好功能后,再按“定时”键对所选功能进行定时设定
预约① 按“预约”键可进行预约设定,保温无预约设定。
② 按“功能选择”键选择好功能后,再按“预约”键对多选功能进行预约设定。
③ 预约时间操作完成后,无其他操作5秒后进入预约状态,指示灯开始闪烁

① 煮饭工作时间约40分钟;

② 慢炖工作时间约60分钟;

③ 粥/汤工作时间约75分钟;

④ 保温功能可用于加热饭菜工作时间约20分钟

二、硬件设计

2.1 控制板

控制板主要包括核心芯片 89F2265B、连接到电源板的接线口(包括热敏电阻 NTC)、两位数码管、4 个按键与 4 个指示灯,原理图设计如下:

在这里插入图片描述

PCB 如下:

在这里插入图片描述

BOM 表如下:

在这里插入图片描述

装配实物图:

在这里插入图片描述

2.2 电源板

电源板主要包括电源驱动部分、蜂鸣器驱动电路、继电器驱动电路与连接到控制板的接线口,原理图设计如下:

在这里插入图片描述

其中对于电源驱动部分,由 220V 交流电经过保险丝、压敏电阻等,由变压器变成 10.5V,通过 MB10S 桥式整流器由交流转换成直流电输出给 78L05 输出 5V 作为 VCC。

PCB 如下:

在这里插入图片描述

BOM 表如下:

在这里插入图片描述

装配实物图:

在这里插入图片描述

三、软件设计

3.1 总体框架

按照分层的概念,整个电饭煲功能可以分区硬件驱动层与用户应用层。

对于硬件驱动层,分为:

1、数码管驱动

2、按键驱动

3、发光二极管驱动

4、蜂鸣器驱动

5、继电器驱动

对于用户应用层,分为:

1、待机状态

2、工作状态

3、取消状态

各个状态有各自的功能。

思维导图如下:

在这里插入图片描述

3.2 功能细化

3.2.1 开机

数码管与LED全亮1秒,1秒后数码管显示“- -”,LED全部熄灭。

3.2.2 各按键功能

功能选择

(一)、按“功能选择”键,可依次从煮饭-慢炖-粥/汤-保温之间循环切换,所对应的LED点亮;

(二)、选择功能后,无其他操作5秒后自动进入工作状态数码管显示“- -”并往下跳动;

(三)、无其他操作5秒后只能按下“保温取消”键进行取消,取消后LED全灭,数码管显示“- -”。

保温/取消

(一)、在待机状态下数码管显示“- -”,按“保温取消”键直接进入保温状态。备注:在通电状态下保温时长为24小时;

(二)、在工作状态下数码管显示“- -”并往下跳动,按“保温取消”键可取消操作进行重新操作。

(三)、按“取消”键,功能重新依次从煮饭-慢炖-粥/汤-保温之间循环切换

定时

(一)、按“定时”键可进行定时设定,煮饭和保温无定时设定;

(二)、按“功能选择”键选择好功能后,再按“定时”键对所选功能进行定时设定。

预约

(一)、按“预约”键可进行预约设定,保温无预约设定;

(二)、按“功能选择”键选择好功能后,再按“预约”键对多选功能进行预约设定;

(三)、预约时间操作完成后,无其他操作5秒后进入预约状态,指示灯开始闪烁。

3.2.3 电饭煲定时与预约功能

煮饭

(一)、数码管显示“- -”并间隔1s闪烁,“煮饭”LED点亮;

(二)、无其他操作5秒后,数码管显示“- -”并往下一直跳动,蜂鸣器响一声;

(三)、无其他操作5秒后只能按下“保温取消”键进行取消,取消后LED全灭,数码管显示“- -”;

(四)、5秒内按“预约”键,数码管显示“0.5”,每按一下“预约”键,数码管显示数值增加0.5,一直到显示“10.”(注意显示一个点)切换为数值每次增加1,一直到显示“24.”,再按一下“预约”键就显示“0.0”,无其他操作5秒后,数码管显示“预约值”(不闪烁),“煮饭”LED间隔1秒闪烁,蜂鸣器响一声

慢炖

(一)、数码管显示“1.0”并间隔1秒闪烁,“慢炖”LED点亮;

(二)、无其他操作5秒后,数码管显示“1.0”不闪烁,蜂鸣器响一声;

(三)、无其他操作5秒后只能按下“保温取消”键进行取消,取消后LED全灭,数码管显示“- -”;

(四)、按“定时”键每次数码管显示数值增加0.5,从显示“1.0”到“4.0”循环;

(五)、5秒内按“预约”键,数码管显示“0.5”,每按一下“预约”键,数码管显示数值增加0.5,一直到显示“10.”切换为数值每次增加1,一直到显示“24.”,再按一下“预约”键就显示“0.0”,无其他操作5秒后,数码管显示“预约值”(不闪烁),“慢炖”LED间隔1秒闪烁,蜂鸣器响一声。

粥/汤

(一)、数码管显示“10”(注意不显示点)并间隔1秒闪烁,“粥/汤”LED点亮;

(二)、无其他操作5秒后,数码管显示“- -”并往下一直跳动,蜂鸣器响一声;

(三)、无其他操作5秒后只能按下“保温取消”键进行取消,取消后LED全灭,数码管显示“- -”;

(四)、按“定时”键,在数码管显示“10”到“50”范围每次数值增加10,按至显示“50”后再按变为显示“1.0”,在显示“1.0”到“4.0”范围每次增加0.5,按至显示“4.0”后再按变为显示“10”。

(五)、5秒内按“预约”键,数码管显示“0.5”,每按一下“预约”键,数码管显示数值增加0.5,一直到显示“10.”切换为数值每次增加1,一直到显示“24.”,再按一下“预约”键就显示“0.0”,无其他操作5秒后,数码管显示“预约值”(不闪烁),“粥/汤”LED间隔1秒闪烁,蜂鸣器响一声。

保温

(一)、数码管显示“bb” 并间隔1秒闪烁,“保温”LED点亮;

(二)、无其他操作5秒后,数码管“bb”不闪烁,蜂鸣器响三声;

(三)、无其他操作5秒后只能按下“保温取消”键进行取消,取消后LED全灭,数码管显示“- -”。

3.2.4 电饭煲加热功能

煮饭

煮饭功能煮饭测试:

(一)、进入工作后开始加热,持续加热到130℃后停止,温度降至105℃继续加热50秒,加热停止后温度降至100℃进入7分钟倒计时;

(二)、在七分钟倒计时期间,停止加热2分钟,加热30秒,停止加热2分30秒,加热30秒,之后等待时间结束进入保温。

慢炖

定时“1.0”功能加水测试:

(一)、实际工作1小时,显示部分以倒计时形式显示,从“1.0”开始->“59”-> … -> “01”;

(二)、进入工作后开始加热,15分钟后关闭加热(温度92℃)、17分40秒开启加热(温度95℃)、18分55秒关闭加热(温度96℃)、19分40秒开启加热(温度97℃)、10秒后关闭加热、30秒后开启加热、如此反复间断加热10秒、不加热30秒,直到到达时间,到达时间后蜂鸣器鸣叫三声进入保温模式。

粥/汤

定时“10”功能测试:

(一)、实际工作时长57分15秒,显示部分以“- -”往下刷新,在最后十分钟显示“10”开始每分钟倒计时;

(二)、进入工作后开始加热,14分钟后关闭加热(温度95℃)、16分15秒开启加热(温度96℃)、然后进入间断加热,加热8秒、不加热32秒,直到到达时间,到达时间后蜂鸣器鸣叫三声进入保温模式。

定时“1.0”功能测试:

(一)、大约加热1个小时后,显示“59”倒计时;

(二)、间断加热同上。

保温

保温功能加水测试:

(一)、72℃开启加热、80℃关闭加热。

3.2.5 其他说明
  1. 煮饭工作时间约40分钟;
  2. 慢炖工作时间约60分钟;
  3. 粥/汤工作时间约75分钟;
  4. 保温功能可用于加热饭菜工作时间约20分钟
  5. 每次按按键响一声
  6. 预约时间到,长鸣一声

3.3 主流程图

在这里插入图片描述

3.4 主函数程序

#include <cms.h>
#include "typedef.h"
#include "main.h"
#include "buzzer.h"
#include "task.h"
#include "display.h"
#include "key.h"
#include "working.h"


static volatile bool Flag_Main;

/**
  * @brief  毫秒延时函数
  * @param  x:毫秒数
  * @retval 无
  */ 
void DelayXms(unsigned char x)
{
	unsigned char i = 0;;
	
	while(x--)
	{
		asm("clrwdt");
		while(--i)
		{
			asm("nop");
			asm("nop");
			asm("nop");
			asm("nop");
		}
	}
}


/**
  * @brief  系统寄存器初始化
  * @param  无
  * @retval 无
  */ 
void SysInit(void)
{
	asm("nop");
	asm("clrwdt");

	//预分频给TMR0  
	OPTION_REG =0;
	//内部振荡器8M					
	OSCCON = 0X71;					

	//允许所有未被屏蔽的中断、外设中断
	INTCON = 0xC0;			
	
	//配置上拉情况
	WPUA = 0B00000010;
	WPUB = 0B01100000;
	WPUC = 0B00000001;
	//配置IO状态
	TRISA = 0B00000010;
	TRISB = 0B11100000;
	TRISC = 0B00000001;
}

/**
  * @brief  定时器初始化
  * @param  无
  * @retval 无
  */ 
void TimerInit(void)
{
//---------------------------------------
//125us中断初始化
	PR2 = 249;				//赋初值	
	TMR2IF = 0;				//清中断标志位
	TMR2IE = 1;				//允许Timer2中断
	T2CON = 0x04;			//开启Timer2,预分频值为1,后分频比为1:1
//---------------------------------------
}

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */ 
void main(void)
{
	task_data Task_Data;
	
	// 系统初始化
	SysInit();
	// 定时器中断初始化
	TimerInit();
	// 待机模式初始化
	StandbyMode(&Task_Data);
	// 打开显示
	Dis_ON();
	// 延时200ms等待系统稳定
	DelayXms(400);
	// 关闭显示
	Dis_OFF();
	//RELAY = 0;	// 伪造GND来调试蜂鸣器
	MakeBeep(BEEP_ONCE, BEEP_LONG);

	while(1)
	{
		if(Flag_Main)
		{
			Flag_Main = 0;
			asm("clrwdt");
			
			KeyScan();
			AdcGet(&Task_Data.adc_val);
			TaskProcess(&Task_Data);
			WorkingMode(&Task_Data);
			BuzzerCheck();
		}
	}
}

/**
  * @brief  定时器2中断函数
  * @param  无
  * @retval 无
  */ 
void interrupt Isr_Timer(void)
{
// 125us*8=1ms
#define TIME_1MS 	8
// 主循环执行一次时间,1ms*4=4ms
#define	TIME_MAIN	4

	static uchar time_main;
	static uchar time_cnt;

	asm("clrwdt");
	if(Flag_IsrTimer)
	{
		// 清定时器中断
		Flag_IsrTimer = 0;
		// 125us*8=1ms
		if(++time_cnt >= TIME_1MS)
		{
			time_cnt = 0;
			// 主循环执行一次时间,1ms*4=4ms
			if(++time_main >= TIME_MAIN)
			{
				time_main = 0;
				Flag_Main = 1;
			}
		}
		// 蜂鸣器
		if(Flag_Buzzer)
			Pin_Buzzer = ~Pin_Buzzer;
		// 动态扫描
		DisScan();
		
	}
	else
		Flag_Isr = 0;
}

四、开发问题

测试仪器使用电参数测试仪器,可以实时查看电饭煲运行的电流与功率:

在这里插入图片描述

还有就是万用表使用测温功能来查看电饭煲温度的变化:

在这里插入图片描述

问题一些总结处理:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值