一、功能简介
本项目使用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);
}
三、实验现象