一、功能簡介
本項目使用Proteus8仿真STM32單片機控制器,使用LCD1602液晶、矩陣按鍵、蜂鳴器、EEPROM模塊、繼電器模塊等。
主要功能:
系統(tǒng)運行后,LCD1602顯示密碼輸入提示界面,系統(tǒng)存儲在EEPROM的初始密碼為123456,用戶可通過矩陣按鍵S1-S10輸入數(shù)值0-9,當在密碼輸入過程中有誤,可按S11鍵回刪并重新輸入。當密碼輸入完成后,可按S12鍵確認,校驗密碼是否正確,如密碼輸入正確,電磁閥工作開門,對應D3指示燈點亮;如密碼輸入錯誤,LCD顯示錯誤信息,可重新輸入密碼,最多可輸入3次,如還輸入錯誤,系統(tǒng)鎖死,需等待10S鐘解鎖系統(tǒng)方可再次輸入。當管理員需要更換密碼時,可按下S13鍵,LCD顯示更換密碼界面,此時可通過S1-S10輸入修改密碼,修改過程中如需更改可按S11鍵回刪并重新輸入。修改密碼完成后可按下S12鍵保存新密碼至EEPROM中,更新的密碼可斷電不丟失。
二、軟件設計
/*******************************************************************************
- 函 數(shù) 名 : TIM2_IRQHandler
- 函數(shù)功能 : TIM2中斷函數(shù)
- 輸 入 : 無
- 輸 出 : 無
*******************************************************************************/
void TIM2_IRQHandler(void)
{
static u32 i=0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update))
{
i++;
if(i>=(100*AFRESH_TIME))//時間到
{
i=0;
TIM_Cmd(TIM2,DISABLE);//關(guān)閉定時器
sys_ctrl.time_flag=1;
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
//主界面,輸入密碼提示
void main_display(void)
{
memset(sys_ctrl.password,0,6);//密碼數(shù)據(jù)清零
sys_ctrl.time_flag=0;
sys_ctrl.resive_flag=0;
delay_ms(500);
lcd1602_clear();
lcd1602_show_string(0,0,"Password Input:");
}
//密碼輸入錯誤次數(shù)超過規(guī)定值,等待指定時間后可重新輸入
void password_error_wait_afreah_input(void)
{
TIM_Cmd(TIM2,ENABLE);//開啟定時器
lcd1602_clear();
lcd1602_show_string(0,0,"Error Too much!");
lcd1602_show_string(0,1,"Please Wait...");
while(1)
{
if(sys_ctrl.time_flag)//時間到
{
RELAY=1;
sys_ctrl.error_cnt=0;
break;
}
}
}
//密碼輸入、修改
void password_input(void)
{
u8 key=0;
u8 cnt=0;
while(1)
{
key=key_matrix_flip_scan();
//密碼輸入
if(key>0&&key<=10)//輸入有效數(shù)字0-9,排除無效鍵輸入
{
beep_alarm(100,10);//提示音
if(cnt<6)//有效密碼位數(shù),確保6位有效
{
if(sys_ctrl.resive_flag==0)
{
sys_ctrl.password[cnt]=key-1;//記錄用戶輸入密碼
if(PASSWORD_SHOW_HIDE==0)
lcd1602_show_num(cnt,1,'*',0);
else
lcd1602_show_num(cnt,1,sys_ctrl.password[cnt],1);
}
else//修改密碼狀態(tài)
{
sys_ctrl.save_password[cnt]=key-1;//記錄驗證密碼
lcd1602_show_num(cnt,1,sys_ctrl.save_password[cnt],1);
}
cnt++;
}
}
//輸入撤回
if(cnt>0)//有輸入密碼,撤回才有效
{
if(key==11)//撤回鍵
{
beep_alarm(100,10);
cnt--;
if(sys_ctrl.resive_flag==0)
{
sys_ctrl.password[cnt]=' ';
lcd1602_show_num(cnt,1,sys_ctrl.password[cnt],0);
}
else//修改密碼狀態(tài)
{
sys_ctrl.save_password[cnt]=' ';
lcd1602_show_num(cnt,1,sys_ctrl.save_password[cnt],0);
}
}
}
//密碼確認
if(key==12)//密碼確認鍵
{
beep_alarm(100,10);
if(sys_ctrl.resive_flag==0)
{
if(sys_ctrl.error_cnt< ERROR_PASSWORD_CNT)//密碼輸錯,還可繼續(xù)重新輸入
{
if(memcmp(sys_ctrl.password,sys_ctrl.save_password,6))//密碼錯誤
{
sys_ctrl.error_cnt++;
lcd1602_show_string(0,1,"Password Error!");
//密碼錯誤,不可繼續(xù)輸入,需等待10S重新輸入
if(sys_ctrl.error_cnt==ERROR_PASSWORD_CNT)
password_error_wait_afreah_input();
break;
}
else//密碼正確,開鎖
{
RELAY=0;
sys_ctrl.error_cnt=0;
lcd1602_show_string(0,1,"Password OK!");
delay_ms(2000);
RELAY=1;
break;
}
}
}
else//修改密碼狀態(tài)
{
sys_ctrl.resive_flag=0;//修改完成
lcd1602_show_string(0,1,"Password Set OK!");
AT24CXX_Write(0,sys_ctrl.save_password,6);//存儲新密碼
break;
}
}
//密碼修改
if(key==13)//密碼修改鍵
{
beep_alarm(100,10);
sys_ctrl.resive_flag=1;
cnt=0;
lcd1602_clear();
lcd1602_show_string(2,0,"Password Set:");
}
}
}
//應用控制系統(tǒng)
void appdemo_show(void)
{
u8 i=0;
u8 init_flag=0;
ctrl_pin_init();
key_matrix_init();
BEEP_Init();
lcd1602_init();//LCD1602初始化
TIM2_Init(500-1,71);//定時10ms
AT24CXX_Init();
init_flag=AT24CXX_ReadOneByte(250);
if(init_flag!=0xAA)//初始化一次,防止重復初始化密碼
{
AT24CXX_WriteOneByte(250,0xAA);
for(i=1;i<7;i++)sys_ctrl.save_password[i-1]=i;
delay_ms(10);
AT24CXX_Write(0,sys_ctrl.save_password,6);//寫入初始密碼123456
}
AT24CXX_Read(0,sys_ctrl.save_password,6);//讀取密碼
while(1)
{
main_display();//主界面顯示
password_input();//密碼輸入、修改
}
}
三、實驗現(xiàn)象
評論
查看更多