密码锁说明书.docx
《密码锁说明书.docx》由会员分享,可在线阅读,更多相关《密码锁说明书.docx(29页珍藏版)》请在冰豆网上搜索。
密码锁说明书
湄洲湾职业技术学院
密码锁说明书
系别:
自动化工程系
年级:
10级专业:
电气自动化
姓名:
张佳佳学号:
1101010139
导师姓名:
梁锋林职称:
讲师
2013年5月27日
1前言
从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一部分应用于保管箱和运钞车。
键盘式电子密码锁在键盘上输入,操作简单,因而易于掌握,其突出优点是“密码”是存储在被授权人脑子里的数字和字符,既准确又可靠,不会丢失,难以被窃。
但是密码不能太简单,太简单了就容易被他人在键盘上试探出来,或者可能被旁观者窥测出来,造成保密性不足。
当然,密码又不能太复杂,太复杂了可能自己都糊涂了,或者输入密码操作成功率低,造成使用不便。
遥控式电子防盗锁主要有光遥控和无线电遥控两类。
光遥控又分为红外线遥控和可见光遥控,光遥控利用窄角度的光传输密码,优点是传输信息量可以很大、速度极快、人眼识别不出来,又无法在光路径上以仪器捕获信号试图复制,因此保密性极高。
无线电遥控的优点也是传输信息量可以很大、速度快、人眼识别不出来,但发射的信号弥散空间,容易被仪器捕获,因此适合采用变化的密码,如所谓的“跳码”、“滚码”(均是随机变化而无明显规律),这样即使捕获了当时的信号也无利用、复制的价值。
使用遥控式电子防盗锁,需要仔细保管遥控器(即钥匙),而且对某些应用而言,这种钥匙大了一点,可能还要使用特定的电池。
当前最为活跃的产品则是使用各种“卡”作为钥匙的电子防盗锁,无论卡的种类如何多种多样,按照输入卡的操作方式,都可分为接触式卡和非接触式卡两大类。
值得注意的是,由于某些行业的安全要求较高,通常不得使用可靠性差、易被仿制的磁卡。
目前接触式卡的技术成熟、价格较低,应用也较为广泛;非接触式卡使用隐蔽、方便,大有后来居上之势。
储存信息量大是卡的优势,它不仅作为钥匙,还可载入多项个人信息,特别适合金融业注重“验明正身”的行业特点,而且一卡多用(如入门、开锁、存储、付费等)带来持卡人的便利。
使用这类电子防盗锁,需要仔细保管卡(即钥匙),尤其丢失了必须尽快取消该卡的授权。
由于数字、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子防盗锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子防盗锁,这样对盗贼而言是望尘莫及的。
组合使用信息也能够使电子防盗锁获得无穷扩展的可能,使产品多样化,对用户而言是千挑百选、自得其所。
2系统设计技术参数要求
1.本系统是由STC89C52单片机为控制核心。
2.键盘扫描,检测用户输入的密码是否与存储的密码一样,假如一样的话则驱动继电器把门打开,不一样则在液晶屏幕上显示错误。
3.用户成功输入密码之后可以修改密码,密码可以存储在AT24C02上面,掉电保存。
4.用户成功输入密码之后可以设置最多允许输入密码的错误次数,这个次数掉电能保存。
5.电源5V
3系统设计
3.1系统设计总体框图
图3-1系统设计总体框图
3.2各模块原理说明
1.主控模块
STC89C52单片机最初是由Intel公司开发设计的,但后来Intel公司把51核的设计方案卖给了几家大的电子设计生产商,譬如SST、Philip、Atmel等大公司。
如是市面上出现了各式各样的但均以51为内核的单片机,倒是Intel公司自己的单片机却显得逊色了。
这些各大电子生产商推出的单片机都兼容51指令、并在51的基础上扩展一些功能而内部结构是与51一致的。
2.AT24C02模块(核心部分)
AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。
AT24C02有一个16字节页写缓冲器。
该器件通过IC总线接口进行操作,有一个专门的写保护功能。
AT24C02支持IC,总线数据传送协议IC,总线协议规定任何将数据传送到总线的器件作为发送器。
任何从总线接收数据的器件为接收器。
数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。
主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。
3.继电器模块
电磁继电器是有触点电继电器的一种。
它是利用电磁效应实现电路开、关控制作用的元件,广泛应用在电子设备、仪器仪表及自动化设备中。
在各种自动控制设备中,都要求用一个低压电路提控制一个高压的电气电路。
这样不仅可以为电子线路和电气电路提供良好的电隔离,还可以保护电子电路和人员安全。
4.液晶模块
液晶显示器(LCD)英文全称为LiquidCrystalDisplay,它一种是采用了液晶控制透光度技术来实现色彩的显示器。
和CRT显示器相比,LCD的优点是很明显的。
由于通过控制是否透光来控制亮和暗,当色彩不变时,液晶也保持不变,这样就无须考虑刷新率的问题。
显示接口用来显示系统的状态,命令或采集的电压数据。
本系统显示部分用的是LCD液晶模块,采用一个16×1的字符型液晶显示模块。
3.3系统总原理图说明
本系统采用STC89C52智能锁的硬件和软件设计及实现方法,利用键盘、单片机最小系统、存储器、显示器等电路来设计一个门禁系统的控制电路。
该系统的工作过程为:
当用户输入预先存储在存储器中的密码(通常为6位数字)时,显示器提示相关信息,按开锁键,发光二极管亮,继电器动作门打开;反之,显示器提示错误信息,继电器不动作。
3.4系统印刷电路板的制作图
印刷电路板如附录2
3.5系统的操作说明
(1)键盘扫描,检测用户输入的密码是否与存储的密码一样,假如一样的话则驱动继电器把门打开,不一样则在液晶屏幕上显示错误。
(2)用户成功输入密码之后可以修改密码,密码可以存储在AT24C02上面,掉电保存。
(3)用户成功输入密码之后可以设置最多允许输入密码的错误次数,这个次数掉电能保存。
3.6系统操作注意事项
1.通电使用前,检查电路板是否有虚焊、漏焊、短路、元器件插错等现象。
2.通电使用要先检查电路板上的电源正负极,不得在接错的情况下通电。
3.通电时应把电路板放在绝缘物体上,避开其他导电物体避免发生短路现象。
4.调试电路时应小心操作,避免万用表笔或其它导电工具造成人为短路。
5.调试时,按操作说明进行操作,检测其是否符合系统预先设计的要求
参考文献
[1]彭伟.单片机C语言程序设计实训100例.电子工业出版社.2009年[2]吴运昌.模拟电子线路基础.广州:
华南理工大学出版社,2004年
[3]阎石.数字电子技术基础.北京:
高等教育出版社,1997年
[4]张晓丽等.数据结构与算法.北京:
机械工业出版社,2002年
[5]马忠梅等.ARM&Linux嵌入式系统教程.北京:
北京航空航天大学出版社,2004年
[6]李建忠.单片机原理及应用.西安:
西安电子科技大学,2002年
[7]韩志军等.单片机应用系统设计[M].机械工业出版社,2004
[8]周润景等.Proteus在MCS-51&ARM7系统中的应用百例[M].电子工业出版社,2006
[9]马忠梅等.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2006
[10]刘树中,孙书膺,王春平.单片机和液晶显示驱动器串行接口的实现[J].微计算机信息,2007年
致谢语
即将毕业了,我的三年大学生涯也即将圈上一个句号。
此刻我的心中却有些怅然若失,因为将和那些熟悉的恩师们和同学们挥手告别了。
在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,首先我想感谢父母的养育之恩和对我的支持,感谢我的导师梁锋林老师细心指导和帮助,感谢所有教过我的老师,感谢主任,感谢辅导员,不仅授我以文,而且教我做人,虽历时三载,却给以终身受益无穷之道。
感谢我的舍友同学们在我困难的时候帮助我。
在此,谨致以衷心的感谢和崇高的致意!
祝愿所有老师同学们工作顺利,事业上取得更大成功,你们的健康快乐永远是我最大的心愿。
还有,我想要感谢这个伟大的校园:
师者激情演讲、人文气息的熏陶、同学们风华正茂,条条绿荫、处处泛香。
我明白,正是在他那温润宽厚的胸怀上,让我成长起来的,我心我思永系湄职院。
最后我想对所有关心我的人、帮助我的人再次说一声“谢谢”。
附录
附录1系统总原理图
附录2系统印刷电路板的制作图
附录3程序
#include
#include"LCD1602.h"
#include"key.h"
#include"24c02.h"
sbitLED1=P2^7;
sbitLED2=P2^4;
sbitLED3=P2^1;
sbitRELAY=P1^5;//继电器
unsignedcharUserInput[6]={32,30,30,30,30,30};
bitFlagInputPassword=0;
bitFlagNewPassword=0;
bitFlagNumofTime=0;
unsignedcharNumofTime=3;
unsignedcharCountERROR=0;
bitFlagdead=0;
voidmain()
{
unsignedchari=0;
unsignedcharkey=0;
LCDInit();
LED2=0;//密码没有正确输入的时候,第二个LED亮
LED1=1;//第一个LED不亮
LED3=1;
RELAY=0;//继电器关闭
//writearray();
readarray();
while(!
Flagdead)//将数组array2的值依次赋给P0口显示
{
if(matrix_key_scan()==11)//关锁键,直接回到输入密码界面
FlagInputPassword=0;
if(matrix_key_scan()==10)//当需要输入新的密码时
FlagNewPassword=1;
if(matrix_key_scan()==12)//设置输错次数
FlagNumofTime=1;
while(!
FlagInputPassword)//输入密码界面
{
LED2=0;//密码没有正确输入的时候,第二个LED亮
LED1=1;//第一个LED不亮
LED3=1;
RELAY=0;//继电器关闭
for(i=0;i<6;i++)
UserInput[i]=16;
LCDDispString(0,1,"Inputpassword:
");
LCDDispString(0,2,"");
LCDCursor();
LCDDispChar(2,2,'');
while(UserInput[0]>9)//输入第一个数
UserInput[0]=matrix_key_scan();
LCDDispChar(3,2,'-');
delayms(500);//延时消抖用
while(UserInput[1]>9)//输入第2个数
UserInput[1]=matrix_key_scan();
LCDDispChar(4,2,'-');
delayms(500);//延时消抖用
while(UserInput[2]>9)//输入第3个数
UserInput[2]=matrix_key_scan();
LCDDispChar(5,2,'-');
delayms(500);//延时消抖用
while(UserInput[3]>9)//输入第4个数
UserInput[3]=matrix_key_scan();
LCDDispChar(6,2,'-');
delayms(500);//延时消抖用
while(UserInput[4]>9)//输入第5个数
UserInput[4]=matrix_key_scan();
LCDDispChar(7,2,'-');
delayms(500);//延时消抖用
while(UserInput[5]>9)//输入第6个数
UserInput[5]=matrix_key_scan();
LCDDispChar(8,2,'-');
if(UserInput[0]==array2[0]&&UserInput[1]==array2[1]&&UserInput[2]==array2[2]&&
UserInput[3]==array2[3]&&UserInput[4]==array2[4]&&UserInput[5]==array2[5])
{
LCDDispString(1,2,"");
LCDDispString(3,2,"Correct");
LED1=0;//密码输入正确,第一个灯亮
LED2=1;//第二个灯灭
RELAY=1;//继电器导通
FlagInputPassword=1;
LCDNotCursor();
CountERROR=0;
}
elseif(UserInput[0]==6&&UserInput[1]==5&&UserInput[2]==4&&
UserInput[3]==3&&UserInput[4]==2&&UserInput[5]==1)
{
LCDDispString(1,2,"SuperPassword");
LED1=0;//密码输入正确,第一个灯亮
LED2=1;//第二个灯灭
RELAY=1;//继电器导通
FlagInputPassword=1;
LCDNotCursor();
CountERROR=0;
}
else//密码错误
{
CountERROR++;
LCDNotCursor();
LCDDispString(3,2,"ERROR");
delayms(1000);//延时消抖用
LCDDispString(3,2,"");
for(i=0;i<6;i++)
UserInput[i]=16;
if(CountERROR==NumofTime)
{
FlagInputPassword=1;
Flagdead=1;
LCDDispString(3,2,"DEAD!
");
CountERROR=0;
}
}
}
while(FlagNewPassword==1)//修改密码界面
{
LED2=1;//密码没有正确输入的时候,第二个LED亮
LED1=0;//第一个LED不亮
LED3=0;
RELAY=1;//继电器关闭
LCDDispString(0,1,"Newpassword:
");
LCDDispString(1,2,"");
LCDCursor();
for(i=0;i<6;i++)
{
array1[i]=16;
}
LCDDispChar(2,2,'');
while(array1[0]>9)//输入第一个数
array1[0]=matrix_key_scan();
LCDDispNum(3,2,array1[0]);
delayms(500);//延时消抖用
while(array1[1]>9)//输入第2个数
array1[1]=matrix_key_scan();
LCDDispNum(4,2,array1[1]);
delayms(500);//延时消抖用
while(array1[2]>9)//输入第3个数
array1[2]=matrix_key_scan();
LCDDispNum(5,2,array1[2]);
delayms(500);//延时消抖用
while(array1[3]>9)//输入第4个数
array1[3]=matrix_key_scan();
LCDDispNum(6,2,array1[3]);
delayms(500);//延时消抖用
while(array1[4]>9)//输入第5个数
array1[4]=matrix_key_scan();
LCDDispNum(7,2,array1[4]);
delayms(500);//延时消抖用
while(array1[5]>9)//输入第6个数
array1[5]=matrix_key_scan();
LCDDispNum(8,2,array1[5]);
writearray();//将密码存在24c02中
readarray();
LCDNotCursor();
LCDDispString(3,2,"OK!
");
delayms(1000);//延时消抖用
FlagNewPassword=0;
}
while(FlagNumofTime==1)//设置出错次数
{
LED2=1;//密码没有正确输入的时候,第二个LED亮
LED1=0;//第一个LED不亮
LED3=1;
RELAY=1;//继电器关闭
LCDDispString(0,1,"Numoftime:
");
LCDDispString(1,2,"");
LCDDispNum(6,2,NumofTime);
NumofTime=16;
while(NumofTime>9)
{
NumofTime=matrix_key_scan();
}
LCDDispString(3,2,"OK!
");
delayms(1000);//延时消抖用
LCDDispString(3,2,"");
LCDDispNum(6,2,NumofTime);
FlagNumofTime=0;
}
}
while
(1);
}
#include
#include"24c02.h"
unsignedchararray1[6]={1,2,3,4,5,6,};//写入存储区的数组
unsignedchararray2[6]={0,0,0,0,0,0,};//从存储区读出数据的寄存数组
voiddelayus(unsignedchart)//1.1us11.0592MHz0
{
while(t--);
}
voidc02start()//起始信号
{
sda=1;
delayus(5);
scl=1;
delayus(5);
sda=0;
delayus(5);
}
voidc02stop()//终止信号
{
sda=0;
delayus(5);
scl=1;
delayus(5);
sda=1;
delayus(5);
}
voidc02respons()//应答信号
{
unsignedchari=0;
scl=1;
delayus(5);
while((sda==1)&&(i<250))i++;//sda=1或超时一个成立及默认应答
scl=0;
delayus(5);
}
voidc02init()//24c02初始化
{
sda=1;
delayus(5);
scl=1;
delayus(5);
}
voidc02write(unsignedcharbyte)//写一个字节
{
unsignedchari,temp;
temp=byte;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delayus(5);
sda=CY;
delayus(5);
scl=1;
delayus(5);
}
scl=0;
delayus(5);
sda=1;
delayus(5);
}
unsignedcharc02read()//读一个字节
{
unsignedchari,k;
scl=0;
delayus(5);
sda=1;
delayus(5);
for(i=0;i<8;i++)
{
scl=1;
delayus(5);
k=(k<<1)|sda;
scl=0;
delayus(5);
}
returnk;
}
voidwritedata(unsignedcharadd,unsignedchardata0)//从地址“add”处,写入“data0”
{
unsignedchart=255;
c02init();
c02start();
c02write(0xa0);//写器件地址和传输方向
c02respons();
c02write(add);//写首地址
c02respons();
c02write(data0);//写数据
c02respons();
c02stop();
while(t)
{
t--;
}
}
unsignedcharreaddata(unsignedcharadd)//读出地址“add”处的数据
{
unsignedchardata1;
c02init();
c02start();
c02write(0xa0);