(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)
|