大三暑假的时候,小组三人从零设计了一个智能电饭煲项目
文章目录
- 一、主要功能
- 二、硬件设计
- 2.1 控制板
- 2.2 电源板
- 三、软件设计
- 3.1 总体框架
- 3.2 功能细化
- 3.2.1 开机
- 3.2.2 各按键功能
- 3.2.3 电饭煲定时与预约功能
- 3.2.4 电饭煲加热功能
- 3.2.5 其他说明
- 3.3 主流程图
- 3.4 主函数程序
- 四、开发问题
一、主要功能
电饭煲主要功能概括为以下四点:
主要功能 | 逻辑 |
功能选择 | ① 按“功能选择”键,可依次从煮饭-慢炖-粥/汤-保温之间循环切换。 ② 选择功能后,无其他操作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 其他说明
- 煮饭工作时间约40分钟;
- 慢炖工作时间约60分钟;
- 粥/汤工作时间约75分钟;
- 保温功能可用于加热饭菜工作时间约20分钟
- 每次按按键响一声
- 预约时间到,长鸣一声
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;
}
四、开发问题
测试仪器使用电参数测试仪器,可以实时查看电饭煲运行的电流与功率:
还有就是万用表使用测温功能来查看电饭煲温度的变化:
问题一些总结处理: