找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3985|回复: 1
打印 上一主题 下一主题
收起左侧

八位数字电子密码锁设计论文与单片机程序等资料下载

[复制链接]
跳转到指定楼层
楼主


电子密码锁
摘要本文的电子密码锁利用数字逻辑电路,实现对门的电子控制,并且有各种附加电路保证电路能够安全工作,具有极高的安全系数。
关键词】电子密码锁、电压比较器、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等仿真软件操作,能达到学以致用。对我们学生来说,理论与实际同样重要,这是我们以后在工作中说明自己能力的一个重要标准。
在实习中,我感受到了老师对学生的那种悔人不卷的精神,每天的固定时间,老师都来给我们指导,使我们少走弯路,顺利完成实习任务,请允许我向你们致意崇高的敬意,感谢你们,老师!



单片机源程序如下:
  1. #include<reg52.h>            
  2. #include<math.h>               
  3. #include<intrins.h>              
  4. #define        uchar unsigned char      
  5. #define        uint unsigned int
  6. #define         data_IO P2

  7. sbit     rs=P3^0;        //指令和数据寄存器 “1是数据,” “0是指令”
  8. sbit     rw=P3^1;//读写控制,“1读” “0写”
  9. sbit          e=P3^2; //片选信号
  10. sbit      p=P2^7;
  11. sbit   deng=P3^3;///响音乐的端口
  12. sbit   md=P3^4;///修改密码时的灯


  13. uchar  pwflag;//密码是否正确的标志位
  14. uchar  count;//
  15. uchar  gg=0 ;//只有输入正确的密码才能修改密码
  16. uchar  cs=3 ;//输入密码的错误次数


  17. uchar m[]={1,2,3,4,5,6}; ///初始密码
  18. static uchar mbuf[6];///输入的密码


  19. char d[32]={' ','I','M','P','O','R','T',' ','C','I','P','H','E','R',':',' ',
  20.              ' ',' ','_',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};//输入密码

  21. code  char ks[32]={'C','O','N','G','R','A','T','U','L','A','T','E',' ','Y','O','U',
  22.                           ' ','O','P','E','N','I','N','G',' ',' ','L','O','C','K','!',' '};////开锁

  23. code char cw[32]={' ','C','I','P','H','E','R',' ',' ','E','R','R','O','R',' ',' ',
  24.                               '~','~','~','~','~','~','~','~','~','~','~','~','~','~','~','~' };////错误         

  25. code char xc[32]={' ',' ','A','M','E','N','D',' ','S','U','C','C','E','E','D',' ',
  26.                   ' ',' ',' ',' ',' ','!','!','!','!','!','!',' ',' ',' ',' ',' '};//修改成功  

  27. code char xg[32]={' ','A','M','E','N','D',' ',' ','C','I','P','H','E','R',':',' ',
  28.                   ' ',' ',' ',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};///修改密码*/


  29. void yanshi(uint n)///////////////延时函数///////////////////////////////////
  30. {
  31. uint i;
  32.   for(i=0;i<n;i++){};
  33. }

  34. void delay(uint n)///////////////延时函数///////////////////////////////////
  35. {
  36. uint i,j;
  37.   for(i=0;i<1000;i++)
  38.    {for(j=0;j<n;j++){}}
  39.    
  40. }

  41. void busy() ////////////////////判断是否忙////////////////////////////////////////
  42. {data_IO=0xff;
  43. rs=0; //写指令        ////////////////////
  44. rw=1; //表示读状态    // 三个的状态表示 //
  45. e=1;  //下降延//      // 判忙状态       //
  46. while(!p);         ////////////////////
  47. // e=0;
  48. }
  49. void xiezl(uchar shuju) /////////////////////*写指令*/////////////////////////////
  50. {
  51. busy();/*yanshi(6500);*/
  52. data_IO=shuju;
  53. rs=0; //写指令        ////////////////////
  54. rw=0; //表示写状态    // 三个的状态表示 //
  55. e=1;  //下降延//      // 写指令         //
  56. e=0;  /////////       ////////////////////

  57. }

  58. void w_dat(uint n)//////////////////写数据//////////////////////////
  59. {
  60. busy(); /*yanshi(6500) ;*/
  61.   data_IO=n;
  62.    rs=1; //写数据       ////////////////////
  63.    rw=0; //表示写状态    // 三个的状态表示 //
  64.    e=1;  //下降延//      //写数据         //
  65.    e=0;  /////////       ////////////////////
  66.   // return;
  67. }

  68. void xianshi(uchar js[]) //////////////////显示函数///////////////////////////////
  69. {
  70.   uchar h,v;
  71.   xiezl(0x01); //清屏显示
  72.   yanshi(2000) ;
  73.   xiezl(0x80); // DDRAM地址的设置
  74. for(h=0;h<16;h++)
  75.    {w_dat(js[h]);  ///n表示有写几位数据
  76.    yanshi(100) ;
  77.    }
  78.    xiezl(0xc0);//换行
  79. for(v=(16);v<32;v++)
  80.    {w_dat(js[v]);  ///n表示有写几位数据
  81.    yanshi(100) ;
  82.    }
  83. }

  84. void chushihua(void)///////////////////*液晶模块初始化*/
  85. { uchar i;
  86.    rs=0; //写指令
  87.    rw=0; //表示写状态
  88.    e=0;  //使能
  89.    for(i=0;i<3;i++)
  90.    {
  91.     xiezl(0x38);  //功能设置,8位,一行显示,5*7点阵
  92.     yanshi(1000);
  93.    }
  94.     xiezl(0x38); //两行显示
  95.     xiezl(0x0f); //显示开关控制位
  96.     xiezl(0x18); //移位控制,光标和显示一起左移  
  97.     xiezl(0x06); //设置输入模式
  98.     xiezl(0x01); //清屏显示
  99.     xiezl(0x80); // DDRAM地址的设置
  100.     }

  101. bit pwcmp(void)
  102. {
  103.         bit flag;
  104.         uchar i;
  105.         for (i=0;i<6;i++)
  106.         {
  107.                 if (m[i]==mbuf[i])   flag = 1;   //*密码正确*/
  108.                 else  {        flag = 0;  i=6; } //*密码错误*/
  109.         }
  110.         return(flag);
  111. }

  112. void gb(void)/////////转移光标
  113. {  uchar c;
  114.    xiezl(0xc0);//换行
  115.    yanshi(3000) ;
  116.    for(c=0;c<5;c++)
  117.    {w_dat(' ');///n表示有写几位数据
  118.     yanshi(2000) ;
  119.    }
  120. }
  121. uchar getkey(void)///得到键值
  122. { uchar h,l,k;
  123.   while(P1!=0x0f)
  124.   {
  125.    h=P1&0x0f;
  126.    P1=0xf0;
  127.    l=P1&0xf0;
  128.    k=h|l;
  129.    return(k);
  130.   }
  131. }


  132. void diaoyong(uchar i)///////////调用各键的函数//////输入密码
  133. {  uchar lq;
  134.          switch(i)
  135.             {
  136.           case 0x7e: if (count<6) { mbuf[count]=1; count++;  w_dat('*');}  break;  // 01111110       1
  137.           case 0xbe:  if (count<6) { mbuf[count]=2; count++;  w_dat('*');}  break;  // 10111110                 2
  138.           case 0xde: if (count<6) { mbuf[count]=3; count++;  w_dat('*');}  break;  // 11011110                 3
  139.           case 0xee:  if (count<6) { mbuf[count]=4; count++;  w_dat('*');}  break;  // 11101110                 4

  140.           case 0x7d:  if (count<6) { mbuf[count]=5; count++;  w_dat('*');}  break;  // 01111101                 5
  141.           case 0xbd:  if (count<6) { mbuf[count]=6; count++;  w_dat('*');} break; // 10111101                 6
  142.           case 0xdd: if (count<6) { mbuf[count]=7; count++;  w_dat('*');}  break;  // 11011101                 7
  143.           case 0xed: if (count<6) { mbuf[count]=8; count++;  w_dat('*');} break;  // 11101101                 8

  144.           case 0x7b:  if (count<6) { mbuf[count]=9; count++;  w_dat('*');}  break;  // 01111011                 9
  145.           case 0xbb:  if (count<6) { mbuf[count]=0; count++;  w_dat('*');} break;  // 10111011                 0
  146.           case 0xdb: if (count==6) { pwflag = pwcmp();}   else  pwflag = 0;// 只有输入6个密码后按确认键才作密码比较
  147.                                    if(pwflag) {deng=0; xianshi(ks);gg=1; }   else { cs--;deng=1; xianshi(cw); delay(200); xianshi(d);gb();count = 0; }
  148.                                     break;  // 11011011                 a           
  149.           case 0xeb:  count = 0;deng=1; xianshi(d);  gb();gg=0;         /*取消键*/
  150.                                break;  // 11101011                 b         

  151.           case 0x77: if(gg==1){ count=0;xianshi(xg); gb();} //修该密码
  152.                                break;  // 01110111                 c
  153.          
  154.                   case 0xb7: if((count==6)&&(gg==1)) { count=0;
  155.                   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;}//保存密码
  156.                                break;  // 10110111                 d
  157.           /*case 0xd7: sr[jm]='e'; break;  // 11010111                 e
  158.             case 0xe7: sr[jm]='f'; break;  // 11100111                 f        */

  159.           default: break;
  160.           }
  161.       
  162. }


  163. void main(void)
  164. {uchar key;
  165. chushihua();
  166. xianshi(d);//显示函数
  167. gb(); //移光标到第二行第六位
  168. while(cs)
  169. {
  170.   P1=0x0f;
  171.   if(P1!=0x0f)  
  172. {
  173.    yanshi(20);
  174.    key=getkey();
  175.         md=0;
  176.    diaoyong(key);
  177.    yanshi(20000);
  178.    md=1;
  179. }
  180. }while(1);
  181. }
复制代码

所有资料51hei提供下载:
八位数字密码锁资料.rar (829.8 KB, 下载次数: 49)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:634141 发表于 2019-12-12 07:35 | 只看该作者
谢谢分享,能再分享一些密码锁的设计吗?想多学习一下274490449@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表