基于AT89C52电子密码锁方案设计书.docx

上传人:b****5 文档编号:11815668 上传时间:2023-04-03 格式:DOCX 页数:27 大小:136.40KB
下载 相关 举报
基于AT89C52电子密码锁方案设计书.docx_第1页
第1页 / 共27页
基于AT89C52电子密码锁方案设计书.docx_第2页
第2页 / 共27页
基于AT89C52电子密码锁方案设计书.docx_第3页
第3页 / 共27页
基于AT89C52电子密码锁方案设计书.docx_第4页
第4页 / 共27页
基于AT89C52电子密码锁方案设计书.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

基于AT89C52电子密码锁方案设计书.docx

《基于AT89C52电子密码锁方案设计书.docx》由会员分享,可在线阅读,更多相关《基于AT89C52电子密码锁方案设计书.docx(27页珍藏版)》请在冰豆网上搜索。

基于AT89C52电子密码锁方案设计书.docx

基于AT89C52电子密码锁方案设计书

在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。

若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。

随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。

为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。

密码锁具有安全性高、成本低、功耗低、易操作等优点。

在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。

随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。

随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。

但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。

而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。

加上其成本较高,一定程度上限制了这类产品的普及和推广。

鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。

本次设计使用AT89C52实现一基于单片机的电子密码锁的设计。

 

2电子密码锁的工作原理

本设计以AT89C52单片机为控制核心,结合矩阵键盘、自动报警系统等来完成电子密码锁的设计。

单片机接收键入的代码,并与存贮在EEPROM中的密码进行比较,如果密码正确,驱动电磁执行器开锁,则门开,同时用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;如果密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止,如果继续按键,每按下一次键,会发出“嘀”的报警声;如果输入密码超过已设定好的密码的位数时,会发出“嘀”的提示声。

密码错误或位数超出时,数码管“P”位会灭掉,提示用户操作出错。

 

图2.1单片机控制方案

 

3硬件电路设计

3.1AT89C52简介

3.1.1AT89C52的主要工作特性

AT89C52是美国Atmel公司生产的低电压、高性能CMOS8位单片机,片内含8KB的可反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。

AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。

其主要工作特性是:

·片内程序存储器内含8KB的Flash程序存储器,可擦写寿命为1000次;

·片内数据存储器内含256字节的RAM;

·具有32根可编程I/O口线;

·具有3个可编程定时器;

·中断系统是具有8个中断源、6个中断矢量、2个级优先权的中断结构;

·串行口是具有一个全双工的可编程串行通信口;

·具有一个数据指针DPTR;

·低功耗工作模式有空闲模式和掉电模式;

·具有可编程的3级程序锁定位;

·AT89C52工作电源电压为5(1+0.2)V,且典型值为5V;

·AT89C52最高工作频率为24MHz。

[1]

3.1.2AT89C52各引脚功能及管脚电压

·VCC:

电源电压

·GND:

接地线

·P0口:

P0口是一组8位漏极开路型双向I/O口,也是地址/数据总线复用口。

作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为共阻抗输入端用。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。

在flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

·P1口:

P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平.对P1端口写"1"时,内部上拉电阻把端口拉高,此时可以作为输入口使用.作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL).此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示.

在flash编程和校验时,P1口接收低8位地址字节.

 

·P2口:

P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平.对P2端口写"1"时,内部上拉电阻把端口拉高,此时可以作为输入口使用.作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL).在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址.在这种应用中,P2口使用很强的内部上拉发送1.在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容.

在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号.

·P3口:

P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平.对P3端口写"1"时,内部上拉电阻把端口拉高,此时可以作为输入口使用.作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL).

 

·RST:

复位输入.晶振工作时,RST脚持续2个机器周期高电平将使单片机复位.看门狗计时完成后,RST脚输出96个晶振周期的高电平.特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效.DISRTO默认状态下,复位高电平有效.

·ALE/PROG:

地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲.在flash编程时,此引脚(PROG)也用作编程输入脉冲.在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用.然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过.如果需要,通过将地址为8EH的SFR的第0位置"1",ALE操作将无效.这一位置"1",ALE仅在执行MOVX或MOVC指令时有效.否则,ALE将被微弱拉高.这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效.

·PSEN:

外部程序存储器选通信号(PSEN)是外部程序存储器选通信号.当AT89C52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活.

·EA/VPP:

访问外部程序存储器控制信号.为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND.为了执行内部程序指令,EA应该接VCC.

在flash编程期间,EA也接收12伏VPP电压.

·XTAL1:

振荡器反相放大器和内部时钟发生电路的输入端.

·XTAL2:

振荡器反相放大器的输出端.[2]

3.2电路系统的功能单元设计

本系统的电路组成比较简单,最基本的单片机驱动电路和键盘扫描电路,开锁电路和显示电路以及报警系统。

驱动电路包括振荡电路、复位电路:

键盘扫描电路由4×4键盘矩阵构成:

报警系统由报警装置—扬声器构成:

显示系统由八位LED数码管构成。

[3]

★电路元件及参数:

1、AT89C52,PCBPackage:

DIL40,ClockFrequency:

12MHZ

2、C2、C1,33PF,PCBPackage:

CAP10

3、X1,PCBPackage:

XTAL18,Frequency:

1MHZ

4、C3,10uF,PCBPackage:

ELEC-RAD,

5、R1,220,PCBPackage:

RES40

6、R5,10K,PCBPackage:

RES40

7、LED:

D1

8、SOUNDER:

LS1,PlaybackSimpleRate:

44100,PlaybackBufferTime:

500ms

9、LED4位数码管:

7SEG-MPX4-CC

3.2.1开锁电路设计

通过单片机送给开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的。

其原理如图3.1所示。

 

图3.1密码锁开锁示意图

当用户输入的密码正确而且是在规定的位数输入的话,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的。

3.2.2键盘电路设计

本系统采用采用4X4行列式矩阵键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样的方法。

每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。

在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。

当确认有按键按下后,下一步就要识别哪一个按键按下。

对键的识别通常有两种方法:

一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。

首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。

方法是:

向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。

如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。

判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。

方法是:

依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。

按键的操作面板如图3.2所示。

共计数字键10个,功能键2个,即确认键和删除键。

[4]

 

图3.2键盘操作图

3.2.3显示电路设计

本系统设计的显示电路是为了给使用者以提示而设置的,选择八位共阳的数码管,本系统的显示采用并行显示的方式,只使用单片机的两个口P0口和P2口,就可以完成单片机的显示功能,显示电路的电路原理图如图3.3所示,P0口完成段码显示,P2口完成位选功能。

电路设定:

当密码输入错误次数达到三次以上时,显示”E”,当无输入\断电时,则关闭显示,当忘记密码,输错密码,判断密码正确无误时,可通过功能键进行显示更改密码及判断。

{5}

图3.3显示电路原理图

3.2.4设计总体电路图

 

图3.4总体电路图

3.2.5系统电路的仿真图

输入密码前,数码管显示“PP8.8.8.8.8.8.”,如图3.5所示。

 

图3.5输入密码前

输入密码正确时,数码管显示“8.P8.8.8.8.8.8.”,并伴有“滴答”声,提示用户密码正确,如图3.6所示。

 

图3.6输入密码正确

输入密码错误时,数码管“P”位熄灭,并伴有“滴”的声音,提示用户密码输入错误,如图3.7所示。

 

图3.7输入密码错误

仿真结果分析

通过对上述模块的仿真,可以得到基于单片机控制的密码锁能实现预计的功能,还能添加掉电存储、声光提示甚至添加遥控控制功能,且可以满足现在的安全需求,因此,从仿真结果可以看出,本设计可以得到预期的效果。

 

4软件设计

4.1程序设计

程序设计(Programming)是指设计、编制、调试程序的方法和过程。

它是目标明确的智力活动。

在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。

因此,软件设计在微机控制系统设计中占重要地位。

对于本系统,软件也占有重要的地位。

本系统是采用Proteus仿真软件进行原理图设计,程序代码编译、调试、仿真以及PCB板的设计制作。

为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。

把一个程序分成具有多个明确任务的程序模块,分别编制、调试后再把它们连接在一起形成一个完整的程序,这样的程序设计方法称为模块化程序设计。

所谓“模块”,实质上就是能完成一定功能,并相对独立的程序段,这种程序设计方法称为模块程序设计法。

模块程序设计法的主要优点是:

(1)单个模块比起一个完整的程序易编写、调试及修改。

(2)程序的易读性好。

(3)程序的修改可局部化。

(4)模块可以共存,一个模块可以被多个任务在不同条件下调用。

(5)模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。

4.2模块介绍

该计程计价系统的软件设计分为以下几个模块:

4.2.1主程序模块

主程序主要完成初始化、设置中断向量、检查有无按键按下、以及调用显示等等。

4.2.2键盘扫描及识别子程序

键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。

4.2.3显示子程序

由于是分屏显示数据,所以就要用到5个显示子程序,分别是:

关闭状态显示子程序、开锁状态显示子程序、密码输入及修改状态显示子程序、密码输入错误后的提示子程序。

密码在规定的时间内输入错误次数超过3次后的锁定状态显示子程序。

4.3程序流程图

本系统设计的程序流程图如图4.3所示:

 

图4.3程序设计流程图

 

5结束语

以上所设计的电子密码锁电路,它经过多次修改和整理,已是一个比较不错的设计,但因为水平有限,此电路也存在一定的问题,比如说电路的密码无法修改,不能忘记密码,否则无法打开。

通过本次设计,使自己掌握的理论知识能够运用于实践,加深了自己对课本知识的理解,同时也锻炼了个人的动手能力。

 

参考文献:

[1]  何立民.单片机高级教程.北京航空航天大学出版社.2001:

40~53

[2]  李建忠.单片机原理及应用(第二版).西安电子科技大学出版社.2008.2:

22~23

[3]  童诗白,华成英.模拟电子技术基础(第三版).北京,高等教育出版社,2001:

76~110

[4]  康华光.电子技术基础(第四版).北京高等教育出版社.1998:

134~138

[5]  梁宗善.新型集成块应用.武汉华中理工大出版社.2004:

15~19

[6]  谭浩强.C语言程序设计(高职教材).清华大学出版社,2000.01:

20~88

 

附录[6]

电子密码锁程序

#include

unsignedcharps[]={1,2,3,4,5};

unsignedcharcodedispbit[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,

0x77,0x7c,0x39,0x5e,0x79,0x71,

0x00,0x40,0x73,0xff};

unsignedchardispbuf[8]={18,16,16,16,16,16,16,16};

unsignedchardispcount;

unsignedcharflashcount;

unsignedchartemp;

unsignedcharkey;

unsignedcharkeycount;

unsignedcharpslen=5;

unsignedchargetps[6];

bitkeyoverflag;

biterrorflag;

bitrightflag;

unsignedintsecond3;

unsignedintaa,bb;

unsignedintcc;

bitokflag;

bitalarmflag;

bithibitflag;

unsignedcharoka,okb;

voidmain(void)

{

unsignedchari,j;

TMOD=0x01;

TH0=(65536-500)/256;

TL0=(65536-500)%256;

TR0=1;

ET0=1;

EA=1;

while

(1)

{

P3=0xff;

P3_4=0;

temp=P3;

temp=temp&0x0f;

if(temp!

=0x0f)

{

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

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

temp=P3;

temp=temp&0x0f;

if(temp!

=0x0f)

{

temp=P3;

temp=temp&0x0f;

switch(temp)

{

case0x0e:

key=7;

break;

case0x0d:

key=8;

break;

case0x0b:

key=9;

break;

case0x07:

key=10;

break;

}

temp=P3;

P1_1=~P1_1;

if((key>=0)&&(key<10))

{

if(keycount<6)

{

getps[keycount]=key;

dispbuf[keycount+2]=19;

}

keycount++;

if(keycount==6)

{

keycount=6;

}

elseif(keycount>6)

{

keycount=6;

keyoverflag=1;//keyoverflow

}

}

elseif(key==12)//deletekey

{

if(keycount>0)

{

keycount--;

getps[keycount]=0;

dispbuf[keycount+2]=16;

}

else

{

keyoverflag=1;

}

}

elseif(key==15)//enterkey

{

if(keycount!

=pslen)

{

errorflag=1;

rightflag=0;

second3=0;

}

else

{

for(i=0;i

{

if(getps[i]!

=ps[i])

{

i=keycount;

errorflag=1;

rightflag=0;

second3=0;

gotoa;

}

}

errorflag=0;

rightflag=1;

a:

i=keycount;

}

}

temp=temp&0x0f;

while(temp!

=0x0f)

{

temp=P3;

temp=temp&0x0f;

}

keyoverflag=0;

}

}

P3=0xff;

P3_5=0;

temp=P3;

temp=temp&0x0f;

if(temp!

=0x0f)

{

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

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

temp=P3;

temp=temp&0x0f;

if(temp!

=0x0f)

{

temp=P3;

temp=temp&0x0f;

switch(temp)

{

case0x0e:

key=4;

break;

case0x0d:

key=5;

break;

case0x0b:

key=6;

break;

case0x07:

key=11;

break;

}

temp=P3;

P1_1=~P1_1;

if((key>=0)&&(key<10))

{

if(keycount<6)

{

getps[keycount]=key;

dispbuf[keycount+2]=19;

}

keycount++;

if(keycount==6)

{

keycount=6;

}

elseif(keycount>6)

{

keycount=6;

keyoverflag=1;//keyoverflow

}

}

elseif(key==12)//deletekey

{

if(keycount>0)

{

keycount--;

getps[keycount]=0;

dispbuf[keycount+2]=16;

}

else

{

keyoverflag=1;

}

}

elseif(key==15)//enterkey

{

if(keycount!

=pslen)

{

errorflag=1;

rightflag=0;

second3=0;

}

else

{

for(i=0;i

{

if(getps[i]!

=ps[i])

{

i=keycount;

errorflag=1;

rightflag=0;

second3=0;

gotoa4;

}

}

errorflag=0;

rightflag=1;

a4:

i=keycount;

}

}

temp=temp&0x0f;

while(temp!

=0x0f)

{

temp=P3;

temp=temp&0x0f;

}

keyoverflag=0;

}

}

P3=0xff;

P3_6=0;

temp=P3;

temp=temp&0x0f;

if(temp!

=0x0f)

{

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

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

temp=P3;

temp=temp&0x0f;

if(temp!

=0x0f)

{

temp=P3;

temp=temp&0x0f;

switch(temp)

{

case0x0e:

key=1;

break;

case0x0d:

key=2;

break;

case0x0b:

key=3;

break;

case0x07:

key=12;

break;

}

temp=P3;

P1_1=~P1_1;

if((key>=0)&&(key<10))

{

if(keycount<6)

{

getps[keycount]=key;

dispbuf[keycount+2]=19;

}

keycount++;

if(keycount==6)

{

keycount=6;

}

elseif(keycount>6)

{

keycount=6;

keyoverflag=1;//keyoverflow

}

}

elseif(key==12)//deletekey

{

if(keycount>0)

{

keycount--;

getps[keycount]=0;

dispbuf[keycount+2]=16;

}

else

{

keyoverflag=1;

}

}

elseif(key==15)//enterkey

{

if(keycount!

=pslen)

{

errorflag=1;

r

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1