STM32单片机智能电饭煲系统设计方案

控制/MCU

1814人已加入

描述

一、功能简介

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

主要功能:

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

主要功能如下:

(1)功能:煮饭、煮粥、蒸、煲汤;

(2)按键:开始、取消、功能、加减、预约;

二、软件设计

//功能指示灯显示

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);

}

三、实验现象

继电器

继电器

继电器

继电器

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分