51单片机关于密码锁的毕业设计,论文

摘要

在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。
随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
基于以上思路,此次使用C51单片机实现电子密码锁的设计。本电子密码锁,采用两个按键实现密码的输入功能。在密码输入正确之后,锁正常打开;如果连续三次密码输入错误,按键将被锁定三秒,并自动报警。三秒之后,方可继续进行操作。本设计将使用C语言来完成程序编写。

关键词:电子密码锁 C51单片机 C语言 自动报警

摘要………I
ABSTRACT………………………………………………………………………II
目录……………………………………………………………………………III
第一章 绪论……………………………………………………………………1
1.1 本课题研究背景和意义……………………………………………1
1.2 电子密码锁目前发展趋势…………………………………………1
1.3 课题研究主要内容和待解决问题…………………………………2
第二章 设计方案选择及论证…………………………………………………4
2.1 两种设计方案的比较………………………………………………4
2.1.1 采用数字电路控制的方案………………………………………4
2.1.2 以单片机为核心的设计方案……………………………………5
2.2 系统可行性分析……………………………………………………6
第三章 设计原理……………7
3.1 设计原理……………7
3.2 主控芯片AT89S51…………8
3.2.1 发展概况及趋势…………8
3.2.2 AT89S51的性能特点………9
3.2.3 AT89S51引脚功能说明………10
3.2.2 AT89S51芯片内部结构……13
3.3 整体电路设计原理图………15
第四章 电路硬件设计…………16
4.1 电源输入部分 ………16
4.2 键盘输入部分 ………16
4.3 密码存储部分 ………17
4.3.1 存储芯片AT24C02………17
4.3.2 存储电路设计……18
4.4 复位部分 ……19
4.5 晶振部分 …………20
4.5.1 晶体振荡器………20
4.5.2 晶振电路设计………21
4.6 显示部分 ………22
4.6.1 LCD1602显示器………22
4.6.2 显示电路设计………23
4.7 报警部分 ………24
4.8 开锁部分 ………24
第五章 电路软件设计………26
5.1 主程序模块…………26
5.2 键盘扫描及识别子程序…………27
5.3 调电存储服务程序……28
5.4 开锁流程………………29
5.5 显示子程序……………30
总结及展望…………………31
参考文献…………………32
致谢…………………33
附录。。。。(图文等)

程序设计内容 

(1). 密码的设定,在此程序中密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。

(2). 密码的输入问题:  由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。

(3).按键禁止功能:初始化时,是允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态在3次密码输入不正确的情况下发生的。

C语言源程序

#include unsigned char code ps[]={1,2,3,4,5}; 

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,                               

0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; 

unsigned char pslen=9; unsigned char templen;

 unsigned char digit; unsigned char funcount; 

unsigned char digitcount; 

unsigned char psbuf[9];

 bit cmpflag; 

bit hibitflag;

 bit errorflag;

 bit rightflag; 

unsigned int second3;

 unsigned int aa; 

unsigned int bb;

 bit alarmflag; 

bit exchangeflag; 

unsigned int cc;

 unsigned int dd; 

bit okflag;

 unsigned char oka;

 unsigned char okb; 

void main(void) 

{   

unsigned char i,j;   

P2=dispcode[digitcount];   

TMOD=0x01;   

TH0=(65536-500)/256;  

 TL0=(65536-500)%6;  

 TR0=1;   

ET0=1;  

 EA=1;  

 while(1)   

  {       

  if(cmpflag==0)        

    {          

       if(P3_6==0) //function key           

        {              

         for(i=10;i>0;i--)              

         for(j=248;j>0;j--);      

         if(P3_6==0)                 

           {                

           if(hibitflag==0)       

              {     

                  funcount++;  

                     if(funcount==pslen+2) 

                        {  

                         funcount=0; 

                          cmpflag=1; 

                         } 

                       P1=dispcode[funcount]; 

                    } 

                    else

                       { 

                         second3=0;

                       }  

                 while(P3_6==0);

                 } 

            }

           if(P3_7==0) //digit key 

            {

               for(i=10;i>0;i--) 

              for(j=248;j>0;j--); 

              if(P3_7==0) 

                { 

                  if(hibitflag==0)

                     { 

                      digitcount++; 

                  if(digitcount==10) 

                        { 

                          digitcount=0; 

                        } 

                      P2=dispcode[digitcount]; 

                      if(funcount==1)

                         {

                           pslen=digitcount;                                                                                 

                           templen=pslen;

                         }

                         else if(funcount>1) 

                          {  

                           psbuf[funcount-2]=digitcount; 

                          }

                     } 

                    else 

                      { 

                        second3=0;

                       } 

                  while(P3_7==0);

                 } 

            } 

        }  

       else 

          { 

            cmpflag=0;

             for(i=0;i 

              {  

               if(ps[i]!=psbuf[i]) 

                  { 

                    hibitflag=1; 

                    i=pslen;

                     errorflag=1; 

                    rightflag=0; 

                    cmpflag=0; 

                    second3=0; 

                    goto a;  

                 } 

              }   

          cc=0;  

           errorflag=0;  

           rightflag=1; 

            hibitflag=0; 

         a:   cmpflag=0; 

          } 

         }  

       } 

void t0(void) 

interrupt 1 using 0 {   TH0=(65536-500)/256;  

 TL0=(65536-500)%6;  

 if((errorflag==1) && (rightflag==0))  

      bb++;

       if(bb==800) 

        { 

          bb=0; 

          alarmflag=~alarmflag;

         }

       if(alarmflag==1)

         {

           P0_0=~P0_0;

         }

       aa++; 

      if(aa==800) 

        { 

          aa=0; 

          P0_1=~P0_1;

         } 

      second3++;

       if(second3==6400) 

        { 

          second3=0;

           hibitflag=0; 

          errorflag=0; 

          rightflag=0;

           cmpflag=0;

           P0_1=1;  

         alarmflag=0; 

          bb=0;  

         aa=0;  

       } 

    } 

  if((errorflag==0) && (rightflag==1)) 

    {

       P0_1=0; 

      cc++; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cc<1000) 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; okflag=1; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(cc<2000)

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; okflag=0; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errorflag=0; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rightflag=0; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hibitflag=0;

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmpflag=0; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P0_1=1; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc=0; &nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oka=0; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; okb=0; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; okflag=0; &nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P0_0=1; &nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(okflag==1)

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { &nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oka++; &nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(oka==2)

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oka=0;

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P0_0=~P0_0;

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; okb++; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(okb==3)

 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; okb=0; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P0_0=~P0_0; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } 

&nbsp;&nbsp;&nbsp; } 

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-28
电子密码锁
摘要 本文的电子密码锁利用数字逻辑电路,实现对门的电子控制,并且有各种附加电路保证电路能够安
工作,有极高的安全系数。
关键词 电子密码锁 电压比较器 555单稳态电路 计数器 JK触发器 UPS电源。

1 引言
随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。
设计本课题时构思了两种方案:一种是用以AT89C2051为核心的单片机控制方案;另一种是用以74LS112双JK触发器构成的数字逻辑电路控制方案。考虑到单片机方案原理复杂,而且调试较为繁琐,所以本文采用后一种方案。
第2个回答  2010-12-16
用STC的单片机,里面有EEPROM,把设定的密码写到里面。
正常运行时 输入密码和EEPROM里面的密码比较 正确了就可以进入
第3个回答  2010-12-17
新款的单片机都可以设置密码
相似回答