密码锁的设计.docx
《密码锁的设计.docx》由会员分享,可在线阅读,更多相关《密码锁的设计.docx(47页珍藏版)》请在冰豆网上搜索。
密码锁的设计
届别2012届
学号**********21
毕业论文
基于单片机密码锁的设计与实现
姓 名王强
系别、专业物电系电子信息科学与技术
导师姓名、职称黄健全讲师
完成时间2012年3月
摘要
本文从经济实用的角度出发,采用美国Atmel公司的单片机AT89S51与低功耗CMOS型E2PROMAT24C02分别作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁等电路,用汇编语言编写主控芯片的控制程序,设计并实现了一款可以任意更改密码具有报警功能的电子密码锁。
关键词:
密码锁;单片机;EEPROM;AT24C02
ABSTRACT
Anelectroniccipherlockwasdesignedinthispaper,whichhasthefunctionofalarmandwhoseciphercanbechangedmanytimes.ThiscipherlockusesAT89S51SCMandE2PROMAT24C02asmainchipanddatamemorycell.ThesystemwascontrolledbyprogrammingtheMCU(microcontrolunit)andhastheadvantagesofsimplecircuitincludingkeyboard,LCDdisplay,alarm,andunlockparts.
Keywords:
Cipherlock;MCU;EEPROM;AT24C02
1.引言
1.1选题背景及意义
随着社会经济的不断发展,安全防盗已成为社会问题。
如何制作安全可靠,又要使用方便的各种防盗锁,是制锁者长期以来研制的主题。
传统的机械锁,由于其构造简单,被撬的事件屡见不鲜。
在电子技术飞速发展的今天,具有防盗报警等功能的电子密码锁代替弹子锁和密码量少、安全性差的机械式密码锁已是必然趋势。
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
具有保密性高,使用灵活性好,安全系数高等优点,受到了广大用户青睐。
选题以应用广泛,与人们的生命财产息息相关的电子密码锁为研究目前,力图在可靠性、性价比方面有所收获,具有一定的应用价值。
1.2研究现状
随着电子技术的不断发展,特别是单片机应用的不断推广,无论电子密码锁功能性,稳定性都有了比较全面地提高。
电子锁的常用识别方式有虹膜识别,指纹识别,声音识别。
电子锁在国外发展比较早,所以应用也比较广泛,主要在家庭装较贵重地方,银行,保险柜等应用较多。
在多年前,由于价格较普通机械锁更贵,普通场合应用较少。
近几年来,各种新型的电子密码锁不断研制,具有越来越高的性价比,在各种场合的应用越来越广泛。
由于电子密码锁的功能、安全是机械锁无法相比的,如果能够在保证安全可性的前提下,进一步降低成本,电子密码锁将具有更广阔的发展前境。
1.3论文研究内容
选题的主要研究内容是电子密码锁的设计与实现。
设计一种电子密码锁的控制系统电路,使得密码锁具有以下功能:
开机输入密码,密码正确则电磁锁打开;允许连续输入错误密码不超过两次,否则电子锁报警。
考虑到研究核心是电子密码锁的控制部分,电子密码锁的执行部分用发光二极管来代替,绿色发光二极管亮表示密码锁开启,红色发光耳机管亮表示密码锁锁定。
电子锁的行为表现为:
1.开机输入密码,密码正确绿灯亮;2.密码输入错误红灯亮;3.连续三次输入密码不正确则锁定键盘,并报警凤鸣。
2.硬件设计
2.1主要器件
2.1.1单片机
AT89C51是一种低功耗/低电压、高性能的八位CMOS单片机,片内有一个4KB的FLASH可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory),它采用了CMOS工艺和ATMEL公司的高密度非易失性存储器技术,而且其输出引脚和指令系统都与MSC—51兼容。
片内置通用8位中央处理器(CPU)和FLASH存储单元,片内的存储器允许在系统内改编程序或用常规的非易失性存储器编程。
因此,AT89C51是一种功能强、灵活性高且价格合理的单片机,可方便的应用于各种控制领域。
其主要特性如下:
(1)与MCS-51产品指令系统兼容
(2)4K字节可编程闪烁存储器
(3)寿命:
1000写/擦循环
(4)数据保留时间:
10年
(5)全静态工作:
0Hz-24Hz
(6)三级程序存储器锁定
(7)128*8位内部RAM
(8)32可编程I/O线
(9)两个16位定时器/计数器
(10)6个中断源
(11)可编程串行通道
(12)低功耗的闲置和掉电模式
(13)片内振荡器和时钟电路
另外,AT89C51是用静态逻辑来设计的,其工作频率可下降到零并提供两种软件的省电方式-空闲方式和掉电方式。
在空闲方式中,CPU停止工作。
在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片内RAM中的内容,直到下次硬件复位为止。
2.1.2存储芯片
AT24C02中带有的片内地址寄存器。
每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。
所有字节均以单一操作方式读取。
为降低总的写入时间,一次操作可写入多达8个字节的数据。
I2C总线是一种用于IC器件之间连接的二线制总线。
他通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。
AT24C02正是运用了I2C规程,使用主/从机双向通信,主机(通常为单片机)和从机(AT24C02)均可工作于接收器和发送器状态。
主机产生串行时钟信号(通过SCL引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。
无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。
AT24C02的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向。
电路接线图如图1:
图1AT24C02接线图
图中AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。
在AT89C51试验开发板上它们都接地,第8脚和第4脚分别为正、负电源。
第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,在AT89C51试验开发板上和单片机的P3.5连接。
第6脚SCL为串行时钟输入线,在AT89C51试验开发板上和单片机的P3.6连接。
SDA和SCL都需要和正电源间各接一个5.1K的电阻上拉。
第7脚需要接地。
24C02中带有片内地址寄存器。
每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。
所有字节均以单一操作方式读取。
为降低总的写入时间,一次操作可写入多达8个字节的数据。
2.1.3液晶显示器
现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。
1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
图2为显示器。
图2显示器LCD1602
2.2单元电路
2.2.1晶振电路
单片机引脚XTAL1和XTAL2与晶体振荡器及电容C2、C1连接。
晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C1、C2取值范围在5~30pF之间。
根据实际情况,本设计中采用12MHZ做为系统的外部晶振。
电容取值为20pF。
其原理图见图3.
图3晶振电路图
2.2.2复位电路
当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
原理图见图4.
图4复位电路图
2.2.3键盘电路
由于本设计所用到的按键数量较多而不适合用独立按键式键盘。
采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。
本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,比如清空显示功能等。
键盘的每个按键功能在程序设计中设置。
其大体功能(看键盘按键上的标记)及与单片机引脚接法如图5所示:
图5键盘电路原理图
2.2.4存储电路
掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。
AT24C02是ATMEL公司开发的可擦除存储芯片,AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,AT24C02有一个16字节页写缓冲器。
该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
其接线如图6所示:
图6存储电路原理图
2.2.5报警电路
报警部分由陶瓷压电发声装置及外围电路组成,加电后不发声,当有键按下时,“叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的P2.1引脚为低电平,三极管T3导通蜂鸣器发出蜂鸣声报警。
如图7所示:
图7报警电路原理图
2.2.6执行电路
开锁控制电路的功能是当输入正确的密码后将锁打开。
系统使用单片机其中一引脚线发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开。
用户通过键盘任意设置密码,并储存在EEPROM中作为锁码指令。
只有用户操作键盘时,单片机的电源端才能得到3V电源,否则.单片机处于节电工作方式。
开锁步骤如下:
首先按下键盘上的开锁按键,然后利用键盘上的数字键0-9输入密码,最后按下确认键。
当用户输入一密码后,单片机自动进行密码校验,如果密码不符,则报警。
只有当密码正确,单片机才能控制电子锁内的微型继电器吸合。
当继电器吸合以后带动锁杆伸缩,这时,锁勾在弹簧的作用下弹起,完成本次开锁。
开锁以后,单片机自动清除掉由用户输人的这个密码。
如图8所示:
图8执行电路原理图
2.3总体电路
Proteus软件是LabcenterElectronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。
Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。
通过Proteus软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。
本密码锁采用proteus进行电路图设计,经过元件选型,用万能实验版进行硬件焊接,以实现硬件部分。
其外围电路包刮键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成,根据实际情况键盘输入部分选择4*4矩阵键盘,显示部分选择字符型液晶显示LCD1602,密码存储部分选用AT24C02芯片来完成画出总体电路见图9:
图9总电路图
3.软件设计
3.1主程序
图10主程序流程图
3.2子程序
3.2.1按键输入
图11键功能流程图
3.2.2EEPROM读写
图12读写流程图
3.2.3密码设置
图13密码设置流程图
3.2.4开锁程序
图14开锁流程图
4.系统实现与测试
硬件焊接完成后,下载程序(见附录),然后插上电源,第一步开锁,输入密码,为了安全起见,输入的密码在显示器上显示*号,输入原始密码000000,密码正确开锁。
显示器会显示open。
见图15.
图15正确开锁
输入密码错误则显示error,并且蜂鸣器发声报警,见图16。
图16密码错误
用户可以根据自己的需要修改密码,但在修改秘码前必须先输入正确的原始密码,让后再设置新密码,输入一个6位数的新密码,设置密码时界面会显示SetNewWordEnable,见图17.
图17输入一次新密码
然后再输入新密码,系统会显示pleaseinputagain,若两次输入的新密码一致,则修改密码成功。
此时会显示ResetPasswordOk.见图18。
图18密码修改成功
测试表明:
设计的电子密码锁可以实现密码控制开锁、密码修改等功能,辅以适当的执行部件,则可以达到一定的安防效果。
该电子密码锁电路简单,成本低廉,操作方便,安全可靠。
结论
为了能够更好地完成这次的毕业设计的任务,我通过不同的渠道学习了选题的相关知识,这些是我在课堂上无法学到的。
在毕业设计的这段时间里,我学会了在网络上查找有关选题的硬件资料,其中包括:
电子密码锁国内外发展现状、AT89C51单片机及其引脚说明等。
在做毕业设计的初期阶段,难度很大,没有头绪。
在参考一些成功例子,经过一段时间的摸索后,初步形成了设计方案,并最后得以完成,有了很大的收获。
通过毕业设计,我不但对单片机有了更为深入的了解,对与之相关的应用也有了更广泛的认识。
更重要的是,进一步加强了自己的动手能力,从中学习到如何去思考和解决问题,以及如何灵活地改变方法去实现设计方案;特别是深刻体会到的是软件和硬件结合的重要性。
让我了解到电子技术和软件编程对当今人们生活的重要性。
毕业设计的经历也使我认识到,做任何事情都应脚踏实地,刻苦努力地去做。
毕业设计是我大学时期影响深刻的一次实践和锻炼经历。
致谢
在这四年当中,我除了学习之外还在日常生活中积累了许多经验。
本论文是在黄老师的精心指导下完成的。
论文从选题到完成的整个过程中,得到了黄老师的热情帮助和精心指导。
黄健全老师严谨的治学态度、渊博的专业知识、敏锐的学术眼光、精益求精的精神给我留下了深刻的印象,并对我的学习和工作产生极大地促进作用。
四年的大学生活转眼流逝,对于我来说,在成长中给予我帮助的每一个人都功不可没。
感谢老师们对我的谆谆教诲,
在此,再次感谢所有任课老师的精心授业和教辅人员的辛勤工作!
参考文献
[1]胡汉才.单片机原理及接口技术[M]清华大学出版社,2004.
[2]潘永雄.新编单片机原理与应用[M],西安:
西安电子科技大学出版社,2003.
[3]王千.实用电子电路大全[M].电子工业出版社,2001,p101.
[4]何立民.单片机应用技术选编[M].北京:
北京航空大学出版社,1998;
[5]李华.MCS-51系列单片机使用接口技术[M].北京航空航天大学出版社,1993;
[6]彭为.单片机典型系统设计实例精讲[M],北京:
电子工业出版社,2006;
[7]王迎旭.单片机原理及及应用[M]机械工业出版社.2001.
[8]潘新民,王燕芳.微型计算机控制技术实用教程[M].北京:
电子工业出版社,2007:
75-76,118-119.
[9]童诗白,华成英,模拟电子技术基础[M],北京:
高等教育出版社,2000;
[10]李朝清.单片机原理及接口技术[M].北京航空航天大学出版社2004.
[11]周航慈.单片机应用程序设计技术[M].北京航空航天大学出版社.
[12]刘瑞新.单片机原理及应用教程.北京:
机械工业出版社,2003.
[13]李华.MCS-51系列单片机使用接口技术.北京航空航天大学出版社,1993.
[14]樊昌信,曹丽娜.通信原理[M],北京:
国防工业出版社,2007;
5
附录
电子密码锁程序源代码
#include
#include
#defineLCM_DataP0
#defineucharunsignedchar
#defineuintunsignedint
#defineBusy0x80//用于检测LCM状态字中的Busy标识
sbitLCM_RS=P2^7;
sbitLCM_RW=P2^6;
sbitLCM_E=P2^5;
sbitScl=P3^4;//24C02串行时钟
sbitSda=P3^5;//24C02串行数据
sbitALAM=P2^1;//报警
sbitKEY=P2^0;//开锁
bitoperation=0;//操作标志位
bitpass=0;//密码正确标志
//bitResetEn=0;//重设密码充许标志
bitReInputEn=0;//重置输入充许标志
voidDelay5Ms(void);
unsignedcharcodea[]={0xFE,0xFD,0xFB,0xF7};//控盘扫描控制表
unsignedcharcodestart_line[]={"password:
_______"};
unsignedcharcodeclear[]={""};
unsignedcharcodename[]={"===Coded-Lock==="};//显示名称
unsignedcharcodeCorrect[]={"-----correct----"};//输入正确
unsignedcharcodeError[]={"------error-----"};//输入错误
unsignedcharcodecodepass[]={"------pass------"};
unsignedcharcodeLockOpen[]={"------open------"};//OPEN
unsignedcharcodeSetNew[]={"SetNewWordEnable"};
unsignedcharcodeInput[]={"input:
__________"};//INPUT
unsignedcharcodeResetOK[]={"ResetPasswordOK_"};
unsignedcharcodeinitword[]={"==initpassword=="};
unsignedcharcodeEr_try[]={"error,try_again_"};
unsignedcharcodeagain[]={"pleaseinputagain"};
unsignedcharInputData[6];//输入密码暂存区
unsignedcharCurrentPassword[6]={1,3,1,4,2,0};//当前密码值
unsignedcharTempPassword[6];
unsignedcharN=0;//密码输入位数记数
unsignedcharErrorCont;//错误次数计数
unsignedcharCorrectCont;//正确输入计数
unsignedcharReInputCont;//重新输入计数
unsignedcharcodeinitpassword[6]={0,0,0,0,0,0};
/*
voidDelay1ns(void)
{
unsignedintTempCyc=200;
while(TempCyc--);
}
*/
//=====================5ms延时==============================
voidDelay5Ms(void)
{
unsignedintTempCyc=5552;
while(TempCyc--);
}
//===================400ms延时==============================
voidDelay400Ms(void)
{
unsignedcharTempCycA=5;
unsignedintTempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
//=============================================================================================
//================================24C02========================================================
//=============================================================================================
voidmDelay(uintt)//延时
{
uchari;
while(t--)
{
for(i=0;i<125;i++)
{;}
}
}
voidNop(void)//空操作
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*起始条件*/
voidStart(void)
{
Sda=1;
Scl=1;
Nop();
Sda=0;
Nop();
}
/*停止条件*/
voidStop(void)
{
Sda=0;
Scl=1;
Nop();
Sda=1;
Nop();
}
/*应答位*/
voidAck(void)
{
Sda=0;
Nop();
Scl=1;
Nop();
Scl=0;
}
/*反向应答位*/
voidNoAck(void)
{
Sda=1;
Nop();
Scl=1;
Nop();
Scl=0;
}
/*发送数据子程序,Data为要求发送的数据*/
voidSend(ucharData)
{
ucharBitCounter=8;
uchartemp;
do
{
temp=Data;
Scl=0;
Nop();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*读一字节的数据,并返回该字节值*/
ucharRead(void)
{
uchartemp=0;
uchartem