电子密码锁 【摘要】本文的电子密码锁利用数字逻辑电路,实现对门的电子控制,并且有各种附加电路保证电路能够安全工作,具有极高的安全系数。 【关键词】电子密码锁、电压比较器、555单稳态电路、计数器、JK触发器、UPS电源。 一、引言 随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。 设计本课题时构思了两种方案:一种是用以AT89C2051为核心的单片机控制方案;另一种是用以74LS112双JK触发器构成的数字逻辑电路控制方案。考虑到单片机方案原理复杂,而且调试较为繁琐,所以本文采用后一种方案。 二、总体方案设计 1、设计思路 共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。 2、总体方框图 三、设计原理分析 电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电 造成的密码锁电路失效,使用户免遭麻烦。 密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输 次数锁定电路。 1、键盘输入、密码修改、密码检测、开锁及执行电路 . 其电路如下图3-1-1所示: 图3-1-1键盘输入、密码修改、密码检测、开锁、执行电路 开关K1~K9是用户的输入密码的键盘,用户可以通过开关输入密码,开关两端的电容是为了提高开关速度,电路先自动将IC1~IC4清零,由报警电路送来的清零信号经C25送到T11基极,使T11导通,其集电极输出低电平,送往IC1~IC4,实现清零。 密码修改电路由双刀双掷开关S1~S4组成(如图3-1-2所示), 它是利用开关切换的原理实现密码的修改。例如要设定密码为1458,可以拨动开关S1向左,S2向右,S3向左,S4向右,即可实现密码的修改,由于输入的密码要经过S1~S4的选择,也就实现了密码的校验。本电路有16组的密码可供修改。 图3-1-2密码修改电路 由两块74LS112(双JK触发器,包含IC1~IC4)组成密码检测电路。由于IC1处于计数状态,当用户按下第一个正确的密码后,CLK端出现了一个负的下降沿,IC1计数,Q端输出为高电平,用户依次按下有效的密码,IC2~IC3也依次输出高电平,送入与门IC5,使其输出开锁的高电平信号送往IC13的2脚,执行电路动作,实现开锁。 执行电路是由一块555单稳态电路(IC13),以及由T10、 T11组成的达林顿管构成。若IC13的2脚输入一高电平,则3脚输出高电平,使T10导通,T11导通,电磁阀开启,实现开门,同时T10集电极上接的D5(绿色发光二极管)发亮,表示开门,20秒后,555电路状态翻转,电磁阀停止工作,以节电。其中电磁阀并联的电容C24使为了提高电磁阀的力矩。 2、报警电路 报警电路实现的功能是:当输入密码的时间超过40秒(一般情况下用户输入不会超过),电路报警80秒,防止他人恶意开锁。 电路包含两大部分,2分钟延时和40秒延时电路。其工作原理是当用户开始输入密码时,电路开始2分钟计时,超出40秒,电路开始80秒的报警。图如下3-2-1所示 图3-2-1报警电路 有人走近门时,触摸了TP端(TP端固定在键盘上,其灵敏度非常高,保证电路可靠的触发),由于人体自身带的电,使IC10的2脚出现低电平,使IC10的状态发生翻转,其3脚输出高电平,T5导通(可以通过R12控制T1的基极电流),其集电极接的黄色发光二极管D3发光,表示现在电子锁处于待命状态,T6截止,C4开始通过R14充电(充电时间是40秒,此时为用户输入密码的时间,即用户输入密码的时间不能超过40秒,否则电路就开始报警, 由于用户经常输入密码,而且知道密码,一般输入密码的时间不会超过40秒),IC2开始进入延时40秒的状态。 开始报警:当用户输入的密码不正确或输入密码的时间超过40秒,IC11的2脚电位随着C4的充电而下降,当电位下降到1/3Vcc时(即40秒延时结束时候),3脚变成高电位(延时时是低电平),通过R15使(R15的作用是为了限制T7的导通电流防止电流过大烧毁三极管)T7导通,其集电极上面接的红色发光二极管D4发亮,表示当前处于报警状态,T8也随之而导通,使蜂鸣器发声,令贼人生怯,实现报警. 停止报警:当达到了80秒的报警时间,IC10的6,7脚接的电容C5放电结束,IC10的3脚变成低电平,T5截止,T6导通,强制使强制电路处于稳态,IC11的3脚输出低电平,使T7,T8截止,蜂鸣器停止报警;或者用户输入的密码正确,则有开锁电路中的T10集电极输出清除报警信号,送至T12(PNP),T12导通,强制使T7基极至低电位,解除报警信号。 3、报警次数检测及锁定电路 若用户操作连续失误超过3次,电路将锁定5分钟。其工作原理如下:当电路报警的次数超过3次,由IC9(74161)构成的3位计数器将产生进位,通过IC7,输出清零信号送往74161的清零端,以实现重新计数。经过IC8(与门),送到IC12(555)的2脚,使3脚产生5分钟的高电平锁定脉冲(其脉冲可由公式T=1.1RC计算得出),经T9倒相,送IC6输入端,使IC6输出低电平,使IC13不能开锁,到锁定的目的。电路图如下3-3-1所示: 图3-3-1报警次数检测及锁定电路 4、备用电源电路 为了防止停电情况的发生,本电路后备了UPS电源,它包括市电供电电路,停电检测电路,电子开关切换电路,蓄电池充电电路和蓄电池组成。其电路图如下3-4-1所示:
220V市电通过变压器B降压成12V的交流电,再经过整流桥整流,7805稳压到5V送往电子切换电路,由于本电路功耗较少,所以选用10W的小型变压器。
图3-4-1电源电路 由R8,R9,R6,R7及IC14构成电压比较器,正常情况下,V+<V- IC14输出高电平,继电器的常闭触点和市电相连;当市电断开,V+>V- IC14输出高电平,由T3,T4构成的达林顿管使继电器J开启,将其常开触电将蓄电池和电路相连,实现市电和蓄电池供电的切换,保证电子密码锁的正常工作(视电池容量而定持续时间)。其电路图如下3-4-2所示: 图3-4-2停电检测及电子开关切换电路 T1,T2构成的蓄电池自动充电电路,它在电池充满后自动停止充电,其中D1亮为正在充电,D2为工作指示。由R4,R5,T1构成电压检测电路,蓄电池电压低,则T1,T2导通,实现对其充电;充满后,T1,T2截止,停止充电,同时D1熄灭,电路中C4的作用是滤除干扰信号。其电路图如3-4-3所示: 图3-4-3 蓄电池自动充电电路 五、总结与体会
以上为实习期间所设计的电子密码锁电路,它经过多次修改和整理,以是一个比较不错的设计,可以满足人们的基本要求,但因为水平有限,此电路中也存在一定的问题,譬如说电路的密码不能遗忘,一旦遗忘,就很难打开,这可以通过增加电路解决,但过于复杂,本次设计未其中;用开关作74LS112的CLK脉冲,不是很稳定,可以调换其它高速开关或计数脉冲;电路密码只有16种可供修改,但由于他人不知道密码的位数,而且还要求在规定的时间内按一定的顺序开锁,所以他人开锁的几率很小;电路中未加显示电路,但可通过其它数字模块实现这一功能。这需要一段时间的进一步改进,如果有好的意见,希望老师给以支持。 通过这三周的学习,我感觉有很大的收获:首先,通过学习使自己对课本上的知识可以应用于实际,使的理论与实际相结合,加深自己对课本知识的更好理解,同时实习也段练了我个人的动手能力:能够充分利用图书馆去查阅资料,增加了许多课本以外的知识。能对protel 99、和EWB等仿真软件操作,能达到学以致用。对我们学生来说,理论与实际同样重要,这是我们以后在工作中说明自己能力的一个重要标准。 在实习中,我感受到了老师对学生的那种悔人不卷的精神,每天的固定时间,老师都来给我们指导,使我们少走弯路,顺利完成实习任务,请允许我向你们致意崇高的敬意,感谢你们,老师!
单片机源程序如下: - #include<reg52.h>
- #include<math.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define data_IO P2
- sbit rs=P3^0; //指令和数据寄存器 “1是数据,” “0是指令”
- sbit rw=P3^1;//读写控制,“1读” “0写”
- sbit e=P3^2; //片选信号
- sbit p=P2^7;
- sbit deng=P3^3;///响音乐的端口
- sbit md=P3^4;///修改密码时的灯
- uchar pwflag;//密码是否正确的标志位
- uchar count;//
- uchar gg=0 ;//只有输入正确的密码才能修改密码
- uchar cs=3 ;//输入密码的错误次数
- uchar m[]={1,2,3,4,5,6}; ///初始密码
- static uchar mbuf[6];///输入的密码
- char d[32]={' ','I','M','P','O','R','T',' ','C','I','P','H','E','R',':',' ',
- ' ',' ','_',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};//输入密码
- code char ks[32]={'C','O','N','G','R','A','T','U','L','A','T','E',' ','Y','O','U',
- ' ','O','P','E','N','I','N','G',' ',' ','L','O','C','K','!',' '};////开锁
- code char cw[32]={' ','C','I','P','H','E','R',' ',' ','E','R','R','O','R',' ',' ',
- '~','~','~','~','~','~','~','~','~','~','~','~','~','~','~','~' };////错误
- code char xc[32]={' ',' ','A','M','E','N','D',' ','S','U','C','C','E','E','D',' ',
- ' ',' ',' ',' ',' ','!','!','!','!','!','!',' ',' ',' ',' ',' '};//修改成功
- code char xg[32]={' ','A','M','E','N','D',' ',' ','C','I','P','H','E','R',':',' ',
- ' ',' ',' ',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};///修改密码*/
- void yanshi(uint n)///////////////延时函数///////////////////////////////////
- {
- uint i;
- for(i=0;i<n;i++){};
- }
- void delay(uint n)///////////////延时函数///////////////////////////////////
- {
- uint i,j;
- for(i=0;i<1000;i++)
- {for(j=0;j<n;j++){}}
-
- }
- void busy() ////////////////////判断是否忙////////////////////////////////////////
- {data_IO=0xff;
- rs=0; //写指令 ////////////////////
- rw=1; //表示读状态 // 三个的状态表示 //
- e=1; //下降延// // 判忙状态 //
- while(!p); ////////////////////
- // e=0;
- }
- void xiezl(uchar shuju) /////////////////////*写指令*/////////////////////////////
- {
- busy();/*yanshi(6500);*/
- data_IO=shuju;
- rs=0; //写指令 ////////////////////
- rw=0; //表示写状态 // 三个的状态表示 //
- e=1; //下降延// // 写指令 //
- e=0; ///////// ////////////////////
- }
- void w_dat(uint n)//////////////////写数据//////////////////////////
- {
- busy(); /*yanshi(6500) ;*/
- data_IO=n;
- rs=1; //写数据 ////////////////////
- rw=0; //表示写状态 // 三个的状态表示 //
- e=1; //下降延// //写数据 //
- e=0; ///////// ////////////////////
- // return;
- }
- void xianshi(uchar js[]) //////////////////显示函数///////////////////////////////
- {
- uchar h,v;
- xiezl(0x01); //清屏显示
- yanshi(2000) ;
- xiezl(0x80); // DDRAM地址的设置
- for(h=0;h<16;h++)
- {w_dat(js[h]); ///n表示有写几位数据
- yanshi(100) ;
- }
- xiezl(0xc0);//换行
- for(v=(16);v<32;v++)
- {w_dat(js[v]); ///n表示有写几位数据
- yanshi(100) ;
- }
- }
- void chushihua(void)///////////////////*液晶模块初始化*/
- { uchar i;
- rs=0; //写指令
- rw=0; //表示写状态
- e=0; //使能
- for(i=0;i<3;i++)
- {
- xiezl(0x38); //功能设置,8位,一行显示,5*7点阵
- yanshi(1000);
- }
- xiezl(0x38); //两行显示
- xiezl(0x0f); //显示开关控制位
- xiezl(0x18); //移位控制,光标和显示一起左移
- xiezl(0x06); //设置输入模式
- xiezl(0x01); //清屏显示
- xiezl(0x80); // DDRAM地址的设置
- }
- bit pwcmp(void)
- {
- bit flag;
- uchar i;
- for (i=0;i<6;i++)
- {
- if (m[i]==mbuf[i]) flag = 1; //*密码正确*/
- else { flag = 0; i=6; } //*密码错误*/
- }
- return(flag);
- }
- void gb(void)/////////转移光标
- { uchar c;
- xiezl(0xc0);//换行
- yanshi(3000) ;
- for(c=0;c<5;c++)
- {w_dat(' ');///n表示有写几位数据
- yanshi(2000) ;
- }
- }
- uchar getkey(void)///得到键值
- { uchar h,l,k;
- while(P1!=0x0f)
- {
- h=P1&0x0f;
- P1=0xf0;
- l=P1&0xf0;
- k=h|l;
- return(k);
- }
- }
- void diaoyong(uchar i)///////////调用各键的函数//////输入密码
- { uchar lq;
- switch(i)
- {
- case 0x7e: if (count<6) { mbuf[count]=1; count++; w_dat('*');} break; // 01111110 1
- case 0xbe: if (count<6) { mbuf[count]=2; count++; w_dat('*');} break; // 10111110 2
- case 0xde: if (count<6) { mbuf[count]=3; count++; w_dat('*');} break; // 11011110 3
- case 0xee: if (count<6) { mbuf[count]=4; count++; w_dat('*');} break; // 11101110 4
- case 0x7d: if (count<6) { mbuf[count]=5; count++; w_dat('*');} break; // 01111101 5
- case 0xbd: if (count<6) { mbuf[count]=6; count++; w_dat('*');} break; // 10111101 6
- case 0xdd: if (count<6) { mbuf[count]=7; count++; w_dat('*');} break; // 11011101 7
- case 0xed: if (count<6) { mbuf[count]=8; count++; w_dat('*');} break; // 11101101 8
- case 0x7b: if (count<6) { mbuf[count]=9; count++; w_dat('*');} break; // 01111011 9
- case 0xbb: if (count<6) { mbuf[count]=0; count++; w_dat('*');} break; // 10111011 0
- case 0xdb: if (count==6) { pwflag = pwcmp();} else pwflag = 0;// 只有输入6个密码后按确认键才作密码比较
- if(pwflag) {deng=0; xianshi(ks);gg=1; } else { cs--;deng=1; xianshi(cw); delay(200); xianshi(d);gb();count = 0; }
- break; // 11011011 a
- case 0xeb: count = 0;deng=1; xianshi(d); gb();gg=0; /*取消键*/
- break; // 11101011 b
- case 0x77: if(gg==1){ count=0;xianshi(xg); gb();} //修该密码
- break; // 01110111 c
-
- case 0xb7: if((count==6)&&(gg==1)) { count=0;
- for (lq=0;lq<6;lq++){ m[lq]=mbuf[lq]; yanshi(10000);} md=1; xianshi(xc); delay(200); xianshi(d);yanshi(2000);gb();yanshi(200);gg=0;}//保存密码
- break; // 10110111 d
- /*case 0xd7: sr[jm]='e'; break; // 11010111 e
- case 0xe7: sr[jm]='f'; break; // 11100111 f */
- default: break;
- }
-
- }
- void main(void)
- {uchar key;
- chushihua();
- xianshi(d);//显示函数
- gb(); //移光标到第二行第六位
- while(cs)
- {
- P1=0x0f;
- if(P1!=0x0f)
- {
- yanshi(20);
- key=getkey();
- md=0;
- diaoyong(key);
- yanshi(20000);
- md=1;
- }
- }while(1);
- }
复制代码
所有资料51hei提供下载:
|