一、功能簡介
本項目使用Proteus8仿真51單片機(jī)控制器,使用LCD1602液晶、矩陣按鍵、蜂鳴器、EEPROM模塊、繼電器模塊等。
系統(tǒng)運行后,LCD1602顯示密碼輸入提示界面,系統(tǒng)存儲在EEPROM的初始密碼為123456,
用戶可通過矩陣按鍵S1-S10輸入數(shù)值0-9,當(dāng)在密碼輸入過程中有誤,可按S11鍵回刪并重新輸入。當(dāng)密碼輸入完成后,可按S12鍵確認(rèn),校驗密碼是否正確,如密碼輸入正確,電磁閥工作開門,對應(yīng)D3指示燈點亮;如密碼輸入錯誤,LCD顯示錯誤信息,可重新輸入密碼,最多可輸入3次,如還輸入錯誤,系統(tǒng)鎖死,需等待10S鐘解鎖系統(tǒng)方可再次輸入。當(dāng)管理員需要更換密碼時,可按下S13鍵,LCD顯示更換密碼界面,此時可通過S1-S10輸入修改密碼,修改過程中如需更改可按S11鍵回刪并重新輸入。修改密碼完成后可按下S12鍵保存新密碼至EEPROM中,更新的密碼可斷電不丟失。
二、軟件設(shè)計
/*
作者:嗨小易(QQ:3443792007)
*/
//定時器0中斷函數(shù)
void time0() interrupt 1
{
static u32 i=0;
TH0=0XDC; //給定時器賦初值,定時10ms
TL0=0X00;
i++;
if(i==(100*AFRESH_TIME))//時間到
{
i=0;
time0_stop();//關(guān)閉定時器
lock_sys_control.time_flag=1;
}
}
//主界面,輸入密碼提示
void main_display(void)
{
memset(lock_sys_control.password,0,6);//密碼數(shù)據(jù)清零
lock_sys_control.time_flag=0;
lock_sys_control.resive_flag=0;
delay_ms(500);
lcd1602_clear();
lcd1602_show_string(0,0,"Password Input:");
}
//密碼輸入錯誤次數(shù)超過規(guī)定值,等待指定時間后可重新輸入
void password_error_wait_afreah_input(void)
{
time0_start();//開啟定時器
lcd1602_clear();
lcd1602_show_string(0,0,"Error Too much!");
lcd1602_show_string(0,1,"Please Wait...");
while(1)
{
if(lock_sys_control.time_flag)//時間到
{
RELAY=1;
lock_sys_control.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(lock_sys_control.resive_flag==0)
{
lock_sys_control.password[cnt]=key-1;//記錄用戶輸入密碼
if(PASSWORD_SHOW_HIDE==0)
lcd1602_show_num(cnt,1,'*',0);
else
lcd1602_show_num(cnt,1,lock_sys_control.password[cnt],1);
}
else//修改密碼狀態(tài)
{
lock_sys_control.save_password[cnt]=key-1;//記錄驗證密碼
lcd1602_show_num(cnt,1,lock_sys_control.save_password[cnt],1);
}
cnt++;
}
}
//輸入撤回
if(cnt>0)//有輸入密碼,撤回才有效
{
if(key==11)//撤回鍵
{
beep_alarm(100,10);
cnt--;
if(lock_sys_control.resive_flag==0)
{
lock_sys_control.password[cnt]=' ';
lcd1602_show_num(cnt,1,lock_sys_control.password[cnt],0);
}
else//修改密碼狀態(tài)
{
lock_sys_control.save_password[cnt]=' ';
lcd1602_show_num(cnt,1,lock_sys_control.save_password[cnt],0);
}
}
}
//密碼確認(rèn)
if(key==12)//密碼確認(rèn)鍵
{
beep_alarm(100,10);
if(lock_sys_control.resive_flag==0)
{
if(lock_sys_control.error_cnt<ERROR_PASSWORD_CNT)//密碼輸錯,還可繼續(xù)重新輸入
{
if(memcmp(lock_sys_control.password,lock_sys_control.save_password,6))//密碼錯誤
{
lock_sys_control.error_cnt++;
lcd1602_show_string(0,1,"Password Error!");
//密碼錯誤,不可繼續(xù)輸入,需等待10S重新輸入
if(lock_sys_control.error_cnt==ERROR_PASSWORD_CNT)
password_error_wait_afreah_input();
break;
}
else//密碼正確,開鎖
{
RELAY=0;
lock_sys_control.error_cnt=0;
lcd1602_show_string(0,1,"Password OK!");
delay_ms(2000);
RELAY=1;
break;
}
}
}
else//修改密碼狀態(tài)
{
lock_sys_control.resive_flag=0;//修改完成
lcd1602_show_string(0,1,"Password Set OK!");
at24cxx_write_str(lock_sys_control.save_password,0,6);//存儲新密碼
break;
}
}
//密碼修改
if(key==13)//密碼修改鍵
{
beep_alarm(100,10);
lock_sys_control.resive_flag=1;
cnt=0;
lcd1602_clear();
lcd1602_show_string(2,0,"Password Set:");
}
}
}
//數(shù)字密碼鎖控制系統(tǒng)
void password_lock_control_sys(void)
{
u8 init_flag=0;
u8 i=0;
lcd1602_init();//LCD1602初始化
time0_init();//初始化定時器0
init_flag=At24c02Read(250);
if(init_flag!=0xAA)//初始化一次,防止重復(fù)初始化密碼
{
At24c02Write(250,0xAA);
for(i=1;i<7;i++)lock_sys_control.save_password[i-1]=i;
delay_ms(10);
at24cxx_write_str(lock_sys_control.save_password,0,6);//寫入初始密碼123456
}
at24cxx_read_str(lock_sys_control.save_password,0,6);//讀取密碼
while(1)
{
main_display();//主界面顯示
password_input();//密碼輸入、修改
}
}
三、實驗現(xiàn)象
演示視頻:https://space.bilibili.com/444388619
文章來源:http://www.zghlxwxcb.cn/news/detail-538586.html
聯(lián)系作者
專注于51單片機(jī)、STM32、國產(chǎn)32、DSP、Proteus、ardunio、ESP32、物聯(lián)網(wǎng)軟件開發(fā),PCB設(shè)計,視頻分享,技術(shù)交流。文章來源地址http://www.zghlxwxcb.cn/news/detail-538586.html
到了這里,關(guān)于【Proteus仿真】【51單片機(jī)】電子密碼鎖設(shè)計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!