一、功能简介
本项目使用Proteus8仿真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;
if(sys_ctrl.time[1]>=60)
{
sys_ctrl.time[1]=0;
sys_ctrl.time[0]++;
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;
if(sys_ctrl.time[1]<0)
{
sys_ctrl.time[1]=30;
sys_ctrl.time[0]--;
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);
sys_parm_init();
while(1)
{
sys_data_set();
sys_data_get();
sys_data_show();
sys_fun_ctrl();
}
}
void TIM2_IRQHandler(void)
{
static u8 i=0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
i++;
if(i>=100)
{
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(使用前将#替换为@)