一、功能簡介
本項目使用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);
}
三、實驗現象
評論
查看更多