(1)本設計為了防止密碼被竊取在輸入密碼時在LCD屏幕上顯示*號。
(2)設計開鎖密碼位六位密碼的電子密碼鎖。
(3)能夠LCD顯示在密碼正確時顯示OPEN,密碼錯誤時顯示 Error。
(4)實現輸入密碼錯誤超過限定的五次電子密碼鎖定。
(5)4×4的矩陣鍵盤其中包括0-9的數字鍵、*、#和A-D的功能鍵。
(6)本設計具備報警功能,當輸入密碼錯誤時蜂鳴器響。
(7)密碼可以修改設定(只支持6位密碼),按修改密碼鍵修改密碼,在輸入新密碼
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg52.h>
- #include "delay.h"
- #include "LCD1602.h"
- #include "speaker.h"
- #include "key4x4.h"
- #include "AT24C02.h"
- #include "t1.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit led=P3^6; //繼電器接口
- uint dumima,old_mima,new_mima,shige;
- uchar code chushimima_tab[]={1,2,3,4,5,6}; //設第一次初始密碼為123456
- uchar data dumima_tab1[6]={0}; //從24C02中讀取寫入的初始或修改的密碼保存
- uchar data dumima_tab2[6]={0}; // 保存讀取的密碼
- uchar data shurumima_tab1[6]={0}; //保存輸入的密碼,以便和讀取的密碼對比
- uchar data shurumima_tab2[6]={0}; //保存輸入的密碼,以便和讀取的密碼對比
- void main()
- {
- uchar j,mm=5; //j顯示位置字符,mm報警次數計數及輸入錯誤機會為5次
- led=1;
- speak=1;
- init(); //1602初始化
- jiemian(); //1602顯示界面
- ding_time=50000; //設T1定時器定時50ms
- timer1_init( );
- TR1=1;
- dumima=AT24C02_read_byte(0x02);//判斷24c02是否寫入初始或修改的密碼
- if(dumima!=1) //如果不等于1,判斷沒寫初始或修改的密碼,需要寫入
- {
- AT24C02_write_byte(0x02,0x01); //在第2個地址中寫入1,以便判斷下次不用寫入
- delay_ms(10);
- for(j=0;j<6;j++)
- { //從第4個地址開始寫初始密碼數據
- AT24C02_write_byte(j+4,chushimima_tab[j]);
- delay_ms(10);
- }
- }
- for(j=0;j<6;j++)
- { //從24C02中讀取寫入的初始或修改的密碼保存
- dumima_tab1[j]=AT24C02_read_byte(j+4);
- delay_ms(10);
- }
- been();
- while(1)
- {
- key4x4(); //查詢按鍵是否有按下,只對啟動和修改密碼鍵有效
- if(start_stop==1) //啟動按鍵輸入密碼
- {
- ok=0; //取消其他按鍵誤動作及退出判斷
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0;
- TR1=0;
- been();
- write_com(0x80); //第一行顯示“Please input You”
- for(j=0;j<16;j++)
- {
- write_data(you_table[j]);
- delay_us(10);
- }
- write_com(0xc0); //第二行顯示“Password: ”
- for(j=0;j<16;j++)
- {
- write_data(table3[j]);
- delay_us(10);
- }
- num=0; start4x4=1; //num輸入顯示計數位置設置及等待輸入密碼循環開始
- while(start4x4==1) //等待鍵按下
- {
- key4x4(); //只對數字按鍵和取消按鍵有效
- if(key_valu==1) //在輸入密碼過程中,可以隨時取消輸入重來
- { //但是輸入滿6位時不能取消,必須按確認鍵
- ok=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0;
- been(); //輸入按鍵提示聲音
- write_com(0xca+num); //第二行顯示輸入的密碼
- write_data(xing_tab[0]); //用*號代替數字保密
- dumima_tab2[num]=key_table2[i]; //將輸入的密碼進行保存以便核對
- while(dengdai==1) //判斷按鍵是否松開,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就繼續等待
- else dengdai=0; //松開就返回
- }
- num++;
- if(num==6) //按下6個數字,等待確認鍵按下
- {
- num=0; start4x4=0;dengdai_ok=1; //進入下一個顯示環節,等待按確認鍵確認密碼
- while(dengdai_ok==1)
- {
- key4x4();
- if(ok==1) //確認按鍵按下,進行密碼對比
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0; dengdai_ok=0;
- start_stop=0;
- if(dumima_tab2[0]==dumima_tab1[0]&&dumima_tab2[1]==dumima_tab1[1]
- &&dumima_tab2[2]==dumima_tab1[2]&&dumima_tab2[3]==dumima_tab1[3]
- &&dumima_tab2[4]==dumima_tab1[4]&&dumima_tab2[5]==dumima_tab1[5])
- {
- been();
- baojing=0; mm=5;
- write_com(0xc0); //第二行顯示:Password: 0pen!
- for(j=0;j<16;j++)
- {
- write_data(table4[j]);
- delay_us(10);
- }
- led=0;
- delay_ms(5000);
- jiemian();
- TR1=1; time=0;xian1=0;xian2=1; //啟動定時器開鎖工作
- delay_ms(5000);led=1; //指示燈延時5秒之后關閉
- }
- else //密碼錯誤
- {
- been();delay_ms(50);been();delay_ms(500); //輸入密碼錯誤提示
- write_com(0xc0); //第二行顯示:Password: Error!
- for(j=0;j<16;j++)
- {
- write_data(table5[j]);
- delay_us(10);
- }
- delay_ms(2000);
- mm--; //輸入機會減少1次
- if(mm>0) //少于5次時顯示輸入機會
- {
- write_com(0x80);//第二行顯示" Sorry! You have"
- for(j=0;j<16;j++)
- {
- write_data(chan_tab1[j]);
- delay_us(10);
- }
- write_com(0xc0);
- for(j=0;j<16;j++) //清除第二行內容
- {
- write_data(kong_tabb[j]);
- delay_us(10);
- }
- write_com(0xc3); //第二行顯示"12345“
- write_data(chan_tab3[mm]);
- delay_us(5);
- write_com(0xc7); //第二行顯示" Chance!!!"
- for(j=0;j<9;j++)
- {
- write_data(chan_tab2[j]);
- delay_us(10);
- }
- delay_ms(5000);
- start_stop=1; //返回繼續等待重新輸入密碼開鎖
- }
- else //輸錯5次報警
- {
- been();delay_ms(50);been();delay_ms(50);been();delay_ms(500);
- P1=0x00;mm=1; //鎖定鍵盤,同時限制輸入次數只能為1次
- jiemian();
- TR1=1; time=0;xian1=0;xian2=1;
- baojing=1;
- speaker(); //蜂鳴器報警
- for(j=0;j<20;j++) //延時20秒不輸入,鎖定鍵盤
- {
- delay_ms(1000);
- } //延時時間到重啟輸入,但是只給一次機會
- TR1=0;
- write_com(0x80);
- for(j=0;j<16;j++)
- {
- write_data(chan_tab1[j]);
- delay_us(10);
- }
- write_com(0xc0);
- for(j=0;j<16;j++)
- {
- write_data(kong_tabb[j]);
- delay_us(10);
- }
- write_com(0xc1);
- write_data(chan_tab3[mm]);
- delay_us(5);
- write_com(0xc3);
- for(j=0;j<9;j++)
- {
- write_data(chan_tab2[j]);
- delay_us(10);
- }
- write_com(0xcd); //第二行顯示" ok?"
- for(j=0;j<3;j++)
- {
- write_data(ok_tab[j]);
- delay_us(10);
- }
- delay_ms(2000);
- dengdai_ok=1; been();delay_ms(50);been();delay_ms(50);been();delay_ms(500);
- while(dengdai_ok==1) //提示最后輸入密碼
- {
- key4x4();
- if(ok==1)
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- start_stop=0;
- dengdai_ok=0;
- start_stop=1;
- }
- }
- }
- }
- }
- }
- }
- }
- if(quxiao==1) //按下取消按鍵
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0;
- dengdai_ok=0; start4x4=0; been();
- jiemian();
- TR1=1;time=0;xian1=0;xian2=1;
- while(dengdai==1) //判斷按鍵是否松開,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就繼續等待
- else dengdai=0; //松開就返回
- }
- }
- }
- }
- /**********************修改密碼程序 ******************/
- if(xiugaimima==1)
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- start_stop=0;
- xiugaimima=0; been();
- TR1=0;
- write_com(0x80);
- for(j=0;j<16;j++)
- {
- write_data(old_table[j]);//顯示"Please input Old"
- delay_us(100);
- }
- write_com(0xc0);
- for(j=0;j<16;j++)
- {
- write_data(table3[j]); //顯示"password: "
- delay_us(10);
- }
- start4x4=1;
- while(start4x4==1) //等待密碼輸入
- {
- key4x4(); //只對數字按鍵和取消按鍵有效
- if(key_valu==1) //在輸入密碼過程中,可隨時去取消輸入重來
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- start_stop=0;
- xiugaimima=0; been();
- write_com(0xca+num);
- write_data(key_table[i]); //顯示密碼,
- write_com(0xca+num);
- write_data(xing_tab[0]); //用*號代替保密
- dumima_tab2[num]=key_table2[i]; //將輸入的密碼進行保存以便核對
- while(dengdai==1) //判斷按鍵是否松開
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就繼續等待
- else dengdai=0; //松開就返回
- }
- num++;
- if(num==6)
- {
- num=0; dengdai_ok=1;start4x4=0;
- while(dengdai_ok==1)
- {
- key4x4();
- if(ok==1) //確認按鍵按下,進行密碼對比
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0; dengdai_ok=0;
- start_stop=0; //密碼對比判斷是否正確
- if(dumima_tab2[0]==dumima_tab1[0]&&dumima_tab2[1]==dumima_tab1[1]
- &&dumima_tab2[2]==dumima_tab1[2]&&dumima_tab2[3]==dumima_tab1[3]
- &&dumima_tab2[4]==dumima_tab1[4]&&dumima_tab2[5]==dumima_tab1[5] )
- { //密碼正確
- been();
- mm=5;
- write_com(0x80);
- for(j=0;j<16;j++)
- {
- write_data(new_table[j]);//顯示"Please input New"
- delay_us(10);
- }
- write_com(0xc0);
- for(j=0;j<16;j++)
- {
- write_data(table3[j]); //顯示"password: "
- delay_us(10);
- }
- old_mima=1;
- while(old_mima==1)
- {
- key4x4(); //只對數字按鍵和取消按鍵有效
- if(key_valu==1) //在輸入密碼過程中,可隨時取消輸入重來
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0; been();
- write_com(0xca+num);
- write_data(key_table[i]);
- write_com(0xca+num);
- write_data(xing_tab[0]); //用*號代替保密
- shurumima_tab1[num]=key_table2[i]; //將輸入的密碼進行保存以便核對
- while(dengdai==1) //判斷按鍵是否松開,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就繼續等待
- else dengdai=0; //松開就返回
- }
- num++;
- if(num==6)
- {
- num=0; dengdai_ok=1;old_mima=0;
- while(dengdai_ok==1)
- {
- key4x4();
- if(ok==1)
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0;
- dengdai_ok=0; been();
- write_com(0x80);
- for(j=0;j<16;j++)
- {
- write_data(agn_table[j]);//顯示" Again input new"
- delay_us(10);
- }
- write_com(0xc0);
- for(j=0;j<16;j++)
- {
- write_data(table3[j]); //顯示"password: "
- delay_us(10);
- }
- while(dengdai==1) //判斷按鍵是否松開,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就繼續等待
- else dengdai=0; //松開就返回
- }
- new_mima=1;
- while(new_mima==1)
- {
- key4x4(); //只對數字按鍵和取消按鍵有效
- if(key_valu==1) //在輸入密碼過程中,可隨時取消輸入重來
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0; been(); //輸入提示音
- // write_com(0xca+num);
- // write_data(key_table[i]); //顯示密碼,
- write_com(0xca+num);
- write_data(xing_tab[0]); //用*號代替保密
- shurumima_tab2[num]=key_table2[i]; //將輸入的密碼進行保存以便核對
- while(dengdai==1) //判斷按鍵是否松開,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就繼續等待
- else dengdai=0; //松開就返回
- }
- num++;
- if(num==6)
- {
- num=0; dengdai_ok=1; new_mima=0;
- while(dengdai_ok==1)
- {
- key4x4();
- if(ok==1)
- {
- ok=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0;
- dengdai_ok=0;
- if(shurumima_tab1[0]==shurumima_tab2[0]&&shurumima_tab1[1]==shurumima_tab2[1]&&
- shurumima_tab1[2]==shurumima_tab2[2]&&shurumima_tab1[3]==shurumima_tab2[3]&&
- shurumima_tab1[4]==shurumima_tab2[4]&&shurumima_tab1[5]==shurumima_tab2[5] )
- { //判斷兩次輸入的密碼是否一樣,一樣就寫入24c02,否則就報錯。
- been();
- AT24C02_write_byte(2,1); //在第2個地址中寫入1,以便判斷下次不用寫入
- delay_ms(10);
- for(j=0;j<6;j++)
- { //從第4個地址開始寫初始密碼數據
- AT24C02_write_byte(j+4,shurumima_tab1[j]);
- delay_ms(10);
- }
-
- for(j=0;j<6;j++)
- { //從24C02中讀取寫入的初始或修改的密碼保存
- dumima_tab1[j]=AT24C02_read_byte(j+4);
- delay_ms(10);
- write_com(0x80);
- }
- for(j=0;j<16;j++)
- {
- write_data(cag_table[j]);//顯示"Changed password"
- delay_us(10);
- }
- write_com(0xc0);
- for(j=0;j<16;j++)
- {
- write_data(suc_table[j]);//顯示" You Successful ";
- delay_us(10);
- }
- delay_ms(3000);
- jiemian();
- TR1=1;time=0;xian1=0;xian2=1;
- while(dengdai==1) //判斷按鍵是否松開,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就繼續等待
- else dengdai=0; //松開就返回
- }
- }
- else //兩次輸入密碼不一致
- {
- been(); delay_ms(50);been();delay_ms(500);
- write_com(0x80);
- for(j=0;j<16;j++)
- {
- write_data(diff_tab1[j]);//顯示" 2 New passwords"
- delay_us(10);
- }
- write_com(0xc0);
- for(j=0;j<16;j++)
- {
- write_data(diff_tab2[j]);//顯示"are different!!!"
- delay_us(10);
- }
- delay_ms(2000);
- write_com(0x80);
- for(j=0;j<16;j++)
- {
- write_data(new_table[j]);//顯示"Please input New"
- delay_us(10);
- }
- write_com(0xc0);
- for(j=0;j<16;j++)
- {
- write_data(table3[j]); //顯示"password: "
- delay_us(10);
- }
- delay_ms(2000);
- old_mima=1; been();
- }
- }
- }
- }
- }
- if(quxiao==1) //按下取消按鍵
- {
- ok=0;num=0;
- quxiao=0;
- key_valu=0;
- xiugaimima=0;
- start_stop=0;
- dengdai_ok=0; start4x4=0; old_mima=0;new_mima=0;
- jiemian();
- TR1=1;time=0;xian1=0;xian2=1;
- been();
- while(dengdai==1) //判斷按鍵是否松開,
- {
- tem=P1;
- if(tem!=0xf0) dengdai=1; //按下就繼續等待
- else dengdai=0; //松開就返回
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
密碼鎖原理圖及PCB.zip
(112.6 KB, 下載次數: 247)
2021-1-20 21:59 上傳
點擊文件名下載附件
密碼鎖仿真及程序.zip
(121.13 KB, 下載次數: 400)
2021-1-20 21:59 上傳
點擊文件名下載附件
|