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