电子密码锁.docx
- 文档编号:8966362
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:50
- 大小:315.58KB
电子密码锁.docx
《电子密码锁.docx》由会员分享,可在线阅读,更多相关《电子密码锁.docx(50页珍藏版)》请在冰豆网上搜索。
电子密码锁
电子密码锁
东北大学秦皇岛分校自动化工程系
自动控制系统课程设计
基于单片机的电子密码锁设计
专业名称
自动化
班级学号
学生姓名
指导教师
设计时间
2011.6.27~2010.7.8
入功能。
2.显示模块:
用于完成对系统状态显示及操作提示功能。
3.复位电路:
完成系统的复位。
4.报警电路:
用于完成输错密码时候的警报功能。
5.密码存储模块:
用于完成掉电存储功能,使修改的密码断电后仍能保存。
6.开锁电路:
应用继电器及发光二极管模拟开锁,完成开锁及开锁提示。
2.2主要芯片介绍
2.2.1AT89S52
AT89S52单片机是一个低功耗,高性能CMOS8位单片机,片内含8KBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案[4]。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止[5]。
AT89S52的管脚分布如图2所示。
图2AT89S52芯片管脚
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容[6]。
P3口作为AT89S52的一些特殊功能管脚备选功能,
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
AT89S52主要特性如表1所示。
表1AT89S52主要特性
兼容MCS-51指令系统
8k可反复擦写(>1000次)ISPFlashROM
32个双向I/O口
4.5-5.5V工作电压
3个16位可编程定时/计数器
时钟频率0-33MHz
全双工UART串行中断口线
256x8bit内部RAM
2个外部中断源
低功耗空闲和省电模式
中断唤醒省电模式
3级加密位
看门狗(WDT)电路
软件设置空闲和省电功能
灵活的ISP字节和分页编程
双数据寄存器指针
2.2.2存储芯片AT24C02
AT24C02是美国Atmel公司的低功耗CMOS型E²PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)、抗干扰能力强、数据不易丢失、体积小等特点。
而且他是采用了I²C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。
AT24C02中带有的片内地址寄存器。
每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。
所有字节均以单一操作方式读取。
为降低总的写入时间,一次操作可写入多达8个字节的数据。
I2C总线是一种用于IC器件之间连接的二线制总线。
他通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件。
AT24C02正是运用了I²C规程,使用主/从机双向通信,主机(通常为单片机)和从机(AT24C02)均可工作于接收器和发送器状态。
主机产生串行时钟信号(通过SCL引脚)并发出控制字,控制总线的传送方向,并产生开始和停止的条件。
无论是主机还是从机,接收到一个字节后必须发出一个确认信号ACK。
AT24C02的控制字由8位二进制数构成,在开始信号发出以后,主机便会发出控制字,以选择从机并控制总线传送的方向[7]。
管脚描述:
SCL为串行时钟:
串行时钟输入管脚用于产生器件所有数据发送或接收的时钟这是一个输入管脚。
SDL为串行数据/地址:
双向串行数据/地址管脚用于器件所有数据的发送或接收SDL,是一个开漏输出管脚可与其它开漏输出或集电极开路输出进行线或。
A0、A1、A2为器件地址输入端:
当使用24C02时最大可级联8个器件,如果只有一个24C02被总线寻址,这三个地址输入脚A0、A1、A2可悬空或连接到Vss。
WP为写保护:
如果WP管脚连接到Vcc所有的内容都被写保护只能读当WP,管脚连接到Vss或悬空,允许器件进行正常的读/写操作[12]。
管脚图如图3所示。
图3AT24C02引脚图
2.2.3LCD1602显示器
现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。
1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能[8]。
接口信号说明:
1602型LCD的接口信号说明如表2所示。
表21602型LCD的接口信号说明
第1脚
VSS电源地
第9脚
D2双向数据线
第2脚
VDD+5V电源
第10脚
D3双向数据线
第3脚
VEE液晶显示偏压信号
第11脚
D4双向数据线
第4脚
RS数据/命令选择端
第12脚
D5双向数据线
第5脚
R/W读/写选择端
第13脚
D6双向数据线
第6脚
E使能端
第14脚
D7双向数据线
第7脚
D0双向数据线
第15脚
BLA背光源正极
第8脚
D1双向数据线
第16脚
BLK背光源负极
主要技术参数[9]:
1602型LCD的主要技术参数如表3所示。
表31602型LCD的主要技术参数
显示容量
16×2个字符
芯片工作电压
4.5~5.5V
工作电流
2.0mA(5.0V)
模块最佳工作电压
5.0V
字符尺寸
2.95×4.35(WXH)mm
基本操作程序:
读状态:
令RS=L,RW=L,E=H输出:
D0~D7=状态字
读数据:
令RS=H,RW=H,E=H输出:
无
写指令:
令RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:
D0~D7=数据
写数据:
令RS=H,RW=L,D0~D7=数据,E=高脉冲输出:
无
2.3硬件设计
本系统外围电路包括键盘输入部分、密码存储部分、复位部分、显示部分、报警部分、开锁部分组成,根据实际情况键盘输入部分选择4×4矩阵键盘,显示部分选择字符型液晶显示LCD1602,密码存储部分选用AT24C02芯片来完成。
其原理图如图4所示。
图4电路原理图
2.3.1键盘输入模块
由于本设计所用到的按键数量较多而不适合用独立按键式键盘。
采用的是矩阵式按键键盘,它由行和列组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。
本设计中使用的这个4×4键盘不但能完成密码的输入还能作特别功能键使用。
键盘的每个按键功能在程序设计中设置。
它与单片机的连接如图5所示。
图5键盘输入模块
2.3.2密码存储模块
图6所示AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。
在AT89S51试验开发板上它们都接地,第5脚和第8脚分别为正、负电源。
第8脚SDL为串行数据输入/输出,数据通过这条双向I²C总线串行传送,在AT89S52试验开发板上和单片机的P3.6连接。
第6脚SCL为串行时钟输入线,在AT89S52试验开发板上和单片机的P3.7连接。
SDL和SCL都需要和正电源间各接一个5.1K的电阻上拉。
第6脚接P3.5。
AT24C02中带有片内地址寄存器。
每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。
所有字节均以单一操作方式读取[10]。
为降低总的写入时间,一次操作可写入多达8个字节的数据。
图6密码存储电路
2.3.3复位部分
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。
该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C1上的电压很小,复位下拉电阻上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于
某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。
增加手动复位按键是为了避免死机时无法可靠复位。
当复位按键按下后电容C1通过R5放电。
当电容C1放电结束后,RST端的电位由R5与R6分压比决定。
由于R5< R5的作用在于限制按键按下瞬间电容C1的放电电流,避免产生火花,以保护按键触电。 其电路如图7所示。 图7复位电路 2.3.4晶振部分 AT89S52引脚XTAL1和XTAL2与晶体振荡器及电容C2、C3按图4-5所示方式连接。 晶振、电容C2/C3及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器[12],振荡信号频率与晶振频率及电容C2、C3的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C2、C3取值范围在5~30pF之间。 根据实际情况,本设计中采用12MHZ作为系统的外部晶振。 电容取值为10pF。 其电路图如图8所示。 图8晶振电路 2.3.5显示模块 显示部分由液晶显示器LCD1602取代普通的数码管完成。 开锁时,按下键盘上的开锁按键后,利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。 当密码输入完成时,按下确认键,如果输入的密码正确的话,LCD显示“DOOROPEN”,单片机其中P2.0引脚会输出低电平,使三极管T2导通,电磁铁吸合,继电器开关跳转,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“CODEWRONG”,P2.0输出的是高电平,电子密码锁不能打开。 通过LCD显示屏,可以清楚地判断出密码锁所处的状态。 电路图如图9所示。 图9显示电路 2.3.6报警部分 报警部分由陶瓷压电发声装置及外围电路组成,加电后不发声,当有键按下时,“叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的P2.1引脚为低电平,三极管T3导通蜂鸣器发出噪声报警。 如图10所示。 图10报警电路 2.3.7开锁部分 开锁控制电路的功能是当输入正确的密码后将锁打开。 系统使用单片机其中一引脚线发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开。 用户通过键盘任意设置密码,并储存在E2PROM中作为锁码指令。 只有用户操作键盘时,单片机的电源端才能得到3V电源,否则,单片机处于节电工作方式。 开锁步骤如下: 首先按下键盘上的开锁按键,然后利用键盘上的数字键0-9输入密码,最后按下确认键。 当用户输入密码后,单片机自动识别密码,如果密码不符,则报警。 只有当密码正确,单片机才能使继电器处于开锁状态。 具体电路如图11所示。 图11开锁电路 2.4软件设计 2.4.1主程序 主程序设计流程图如图12所示。 图12主程序流程框图 2.4.2键功能程序 键功能程序流程图如图13所示。 图13键功能程序流程图 2.4.3开锁程序 开锁程序流程框图如图14所示。 图14开锁程序流程图 2.4.4子程序举例 开锁子程序: if(sk[15]==1)//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>提示输入密码 { GotoXY(0,0); count=0; Print("Code: "); count1=1; count2=1; count6=1; sk[15]=0; sk[14]=0; m=0; cp[0]=1; } if((count! =0)&&(count1==1))//>>>>>>>>>>>>>>>>>>>LCD上显示"*" { if(count==1) {GotoXY(0,0);Print("Code: * ");} if(count==2) {GotoXY(0,0);Print("Code: ** "); } if(count==3) {GotoXY(0,0);Print("Code: *** ");} if(count==4) {GotoXY(0,0);Print("Code: **** ");} if(count==5) {GotoXY(0,0);Print("Code: ***** ");} if(count==6) {GotoXY(0,0);Print("Code: ****** ");} if(count>6) {GotoXY(0,0);Print("Code: ****** "); count1=0;} } if((sk[14]==1)&(count6==1))//>>>>>>>>>>>>>>>>>>"按下确认,刚进入较验 { //>>>>>>>>>>>>>>>>>>密码正确 if((password[0]==cq[0])&(password[1]==cq[1])&(password[2]==cq[2])&(password[3]==cq[3])&(password[4]==cq[4])&(password[5]==cq[5])&(count==6)) { GotoXY(0,0);Print("DoorOpen! "); sk[14]=0;count=0;count2=0;m=0; count4=1;DelayMs(1000);count6=1; P2_0=0; DelayMs(500); P2_0=1; //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>密码错误 LCD_Initial();cp[0]=0; } else {GotoXY(0,0);Print("Codewrong! "); DelayMs(1000); sk[14]=0;count=0;count2=0;count6=0; m=0;p3_6=0; DelayMs(100); DelayMs(3000);p3_6=1;LCD_Initial();cp[0]=0; //密码错误 } } 按键扫描子程序: voidCheck_Key(void) { unsignedintrow,col,tmp1,tmp2; tmp1=0x10;//tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0 for(row=0;row<4;row++)//行检测 { P1=0x0f;//先将p1.0~P1.3置高 P1=~tmp1;//使P1.4~p1.7中有一个为0 tmp1*=2;//tmp1左移一位 if((P1&0x0f)<0x0f)//检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 {DelayMs(30); if((P1&0x0f)<0x0f)//检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 { tmp2=0x01;//tmp2用于检测出哪一列为0 for(col=0;col<4;col++)//列检测 { if((P1&tmp2)==0x00)//该列如果为低电平则可以判定为该列 { key_val=row*4+col;//获取键值,识别按键 while((P1&tmp2)==0x00); return;//退出循环 } tmp2*=2;//tmp2左移一位 } while((P1&tmp2)==0x00); } } } } 密修改码子程序: if((sk[11]==1)&(cp[0]==0)) { //提示输入旧密码 GotoXY(0,0);Print("OldCode: "); pass=1; count1=0; count=0; count7=1; count2=1; count6=0; sk[11]=0; } f((count! =0)&(pass==1)&(cp[0]==0)) { //输出显示"*" pass0=0; if(count==1) {GotoXY(0,0);Print("OldCode: * ");} if(count==2) {GotoXY(0,0);Print("OldCode: ** ");} if(count==3) {GotoXY(0,0);Print("OldCode: *** ");} if(count==4) {GotoXY(0,0);Print("OldCode: **** ");} if(count==5) {GotoXY(0,0);Print("OldCode: ***** ");} if(count==6) {GotoXY(0,0);Print("OldCode: ****** ");} m=0; } if((count! =0)&(pass0==1)&(cp[0]==0)) { pass=0; if(count==1) {GotoXY(0,0);Print("NewCode: * ");} if(count==2) {GotoXY(0,0);Print("NewCode: ** ");} if(count==3) {GotoXY(0,0);Print("NewCode: *** ");} if(count==4) {GotoXY(0,0);Print("NewCode: **** ");} if(count==5) {GotoXY(0,0);Print("NewCode: ***** ");} if(count==6) {GotoXY(0,0);Print("NewCode: ****** ");} m=0; } if((sk[14]==1)&(count7==1))//>>>>>>>>>>>按键盘认键,较验旧密码 {//旧密码输入正确 if((password[0]==cq[0])&(password[1]==cq[1])&(password[2]==cq[2])&(password[3]==cq[3])&(password[4]==cq[4])&(password[5]==cq[5])&(pass==1)&(count>=6)) { GotoXY(0,0);Print("NewCode: "); pass0=1; pass=0; sk[14]=0; count=0; count7=0; n=0; m=0; } else { GotoXY(0,0);Print("OldCodeWrong! ");//>>>>>>>>>>>>旧密码输入错误 sk[14]=0; count2=0; count7=0; pass=0; m=0; } } if((pa! =10)&(pass0==1)) { if(n<7) { co[n]=pa; n++; pa=10; } } if(sk[14]==1) { if((n>=7)&(count==6)) { GotoXY(0,0);Print("SetOver! ");//>>>>>>>>>>>>>>旧密码输入正确,存新密码 cq[0]=co[1]; cq[1]=co[2]; cq[2]=co[3]; cq[3]=co[4]; cq[4]=co[5]; cq[5]=co[6]; n=0; pass0=0; pass1=1; sk[14]=0; count=0; count2=0; m=0; count7=0; } else { GotoXY(0,0);Print("SetWrong! ");//>>>>>>>>>>>密码过多或过少,报错 sk[14]=0; count2=0; count=0; count7=0; m=0; } } } } 3、参考文献 [1]叶启明.单片机制作的新型安全密码锁[J].家庭电子.2000,第六期: 24-27 [2]郭海英.基于单片机的电子安全密码锁的设计[J].现代电子技术.2005,第三期: 57-58 [3]李明喜.新型电子密码锁的设计[J].机电产品开发与创新.2004,第八期: 77-79 [4]董继成.一种新型安全的单片机密码锁[J].电子技术.2004,第三期: 55-60 [5]祖龙起.刘仁杰.孙乃凌.一种新颖的电子密码锁[J].电子世界.2001,第六期: 88-90 [6]李明喜.新型电子密码锁的设计[J].机电产品开发与创新.2004,第五期: 22-28 [7]瞿贵荣.实用电子密码锁[J].家庭电子.2000,第三期: 77-82 [8]杨茂涛.一种电子密码锁的实现[J].福建电脑.2004,第九期: 44-49 [9]张俊谟.单片机中级教程—原理与应用[M].北京: 北京航空航天大学出版社,1999: 66-77 [10]肖洪兵.跟我学用单片机[M].北京: 北京航空航天大学出版社,2002: 88-92 [11]RichardPark.Ele
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 密码锁