密码锁.docx

上传人:b****6 文档编号:4687541 上传时间:2022-12-07 格式:DOCX 页数:28 大小:109.08KB
下载 相关 举报
密码锁.docx_第1页
第1页 / 共28页
密码锁.docx_第2页
第2页 / 共28页
密码锁.docx_第3页
第3页 / 共28页
密码锁.docx_第4页
第4页 / 共28页
密码锁.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

密码锁.docx

《密码锁.docx》由会员分享,可在线阅读,更多相关《密码锁.docx(28页珍藏版)》请在冰豆网上搜索。

密码锁.docx

密码锁

单片机课程设计论文

 

设计题目:

密码锁

 

学院:

班级:

成员名单:

1、姓名:

2、姓名:

3、姓名:

指导教师:

课程设计时间:

 

目录

摘要-2-

1设计课题任务、功能要求说明及总体方案介绍-3-

1.1设计任务-3-

1.2功能要求说明-3-

1.3系统结构-3-

1.4系统组成-4-

1.5系统可行性分析-4-

2硬件电路设计-5-

2.1硬件电路的组成及各模块功能说明-5-

3程序分析及程序设计-7-

3.1流程框图-7-

3.2电路原理图-9-

3.3系统板上硬件连线-9-

3.4程序设计内容-10-

3.5主程序清单-10-

4结语-21-

4.1设计课题的设计结论及使用说明-21-

4.2设计体会-21-

参考文献-21-

 

摘要

 

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

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

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

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

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

本设计从经济实用的角度出发,采用美国Atmel公司的单片机AT89S51作为主控芯片与数据存储器单元,结合外围的矩阵键盘输入、LCD液晶显示、报警、开锁等,用C语言编写的主控芯片控制程序与EEPROMAT24C02读写程序相结合,并用Keil软件进行编译,设计了一款可以多次更改密码,具有报警功能的电子密码控制系统。

这种密码锁的电路设计具有防试探按键输入、智能控制上锁、开锁、修改密码等多种功能。

关键词密码锁;晶显示;4×4矩阵键盘;AT89S52;密码锁

 

1设计课题任务、功能要求说明及总体方案介绍

1.1设计任务

用4×4组成0-9数字键及确认键。

用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。

1.2功能要求说明

设计的密码锁上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。

该密码锁具有系统原始密码888888,用户可以设定并存储用户密码,密码输入时应处于保密显示状态,密码输入正确时应显示密码输入正确提示信息,否则,显示密码输入错误提示信息。

1.3系统结构

原理总框图如图1.1所示

图1.1电子密码锁系统结构图

1.4系统组成

系统主要由AT89S52、显示电路、输入模块、复位电路、电源电路等组成。

本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。

其中矩阵键盘用于输入数字密码和进行各种功能的实现。

由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警。

本系统共有两部分构成,即硬件部分与软件部分。

其中硬件部分由电源输入部分、键盘输入部分、复位部分、晶振部分、显示部分组成,软件部分对应的由主程序、初始化程序、LCD显示程序、键盘扫描程序、启动程序、关闭程序、键功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。

1.5系统可行性分析

系统工作原理分析:

使用AT59S52单片机、4×4矩阵键盘、液晶显示器、蜂鸣器等。

矩阵键盘分别为0、1、2、3、4、5、6、7、8、9、原始密码、确认、返回。

系统开始显示“请输入密码”;输入密码时,液晶显示电路显示为“*”,当密码输入完毕按下确认键时,对输入密码与设定的密码进行比较,若密码正确则液晶显示电路显示为“密码正确”提示锁打开;若密码不正确,液晶显示电路显示提示“密码错误”。

在输入正确密码后,按下修改键时,液晶显示电路显示“输入旧密码”,此时输入正确的旧密码,则显示电路会有提示输入新密码在输入新密码后,显示电路会再次提示“再次输入新密码”若两次输入密码不一致,则修改密码失败,一致则成功。

在修改密码的过程中,如果一开始输入的旧密码错误显示电路会显示提示,同时系统返回到开始。

若在“再次输入新密码”的时候输入新密码与前次不一致,则会返回到系统开始。

修改密码完成后,系统自动清零上锁。

要再次开锁则需要输入正确的密码。

统中取消键用于退格,在输入密码时,若输入错误且未按下确认键,按下取消键可以删除刚输入的密码,然后再次输入。

 

2硬件电路设计

2.1硬件电路的组成及各模块功能说明

单片机系统是整个硬件系统的核心,它既协调整机工作,又是数据处理器,是软硬件系统连接的桥梁。

本系统主要包括:

按键控制模块,单片机控制模块,液晶显示模块。

此系统采用FYD12864液晶显示模块,FYD12864字符液晶有128×64个像素点,能显示各种字符,汉字和图形,可与单片机直接相接,具有8位标准数据总线、6位控制线及电源线.用24C02芯片来实现单片机运行数据的掉电保护,其硬件电路简单。

24C02芯片是一I平方C总线接口器件,此总线协议定义如下:

(1)只有在总线空闲时才允许启动数据传送;

(2)在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有电平跳变。

时钟线为高电平时,数据线的任何电平变化将被看成是总线的起始或停止信号。

起始信号:

在时钟线保持高电平期间,数据线电平从高到低的跳变作为此总线的起始信号。

停止信号:

在时钟线保持高电平期间,数据线电平从低到高的跳变作为此总线的停止信号。

2.1.1键盘输入电路

由于本设计所用到的按键数量较多而不适合用独立按键式键盘。

采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。

2.1.2电源输入电路

密码锁主要控制部分电源需要用5V直流电源供电。

2.1.3掉电存储电路

AT24C02是ATMEL公司的256个字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。

它的1、2、3脚是三条地址线,用于确定芯片的硬件地址,本设计中三条地址线都接地。

AT24C02中带有片内地址寄存器,每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个储存单元的读写,所有字节均以单一操作方式读取。

2.1.4复位电路

单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。

无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。

在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。

地址锁存信号ALE也为高电平。

本设计电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C3上的电压很小,复位下拉电阻上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于某一数值后,CPU脱离复位状态,由于电容C3足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。

增加手动复位按键是为了避免死机时无法可靠复位。

当复位按键按下后电容C3通过R2放电。

当电容C3放电结束后,RST端的电位由R1与R2分压比决定。

由于R1<

R1的作用在于限制按键按下瞬间电容C3的放电电流,避免产生火花,以保护按键触电。

2.1.5晶振电路

AT89S52引脚XTAL1和XTAL2与晶体振荡器及电容按附录一所示方式连接。

晶振、电容构成了电容三点式振荡器,振荡信号频率与晶振频率及电容的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容取值范围在5~40pF之间。

根据实际情况,本设计中采用12MHZ做系统的外部晶振。

电容取值为33pF。

本设计的晶振为12MHz。

2.1.6显示电路

为了提高密码锁的密码显示效果能力。

本设计的显示部分由液晶显示器FYD12864取代普通的数码管来完成。

当需要对密码锁进行开锁时,利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。

当密码输入完成时,按下确认键,如果输入的密码正确的话,液晶板显示“恭喜您成功开锁”,通过LCD显示屏,可以清楚的判断出密码锁所处的状态。

 

3程序分析及程序设计

3.1流程框图

图3.1.1所示为主程序流程图,开始接上电源,程序进行初始化设置,然后在键盘上输入密码,此系统进行键盘扫描,密码正确,开锁成功,密码错误3次出错报警,选择是否修改密码,若要修改密码,先输入旧密码密码,密码正确后设置新密码,错误时报警,需要两次确认新密码,确认后,密码修改成功,否则结束返回密码锁。

然后启动程序,进行保护,再次在键盘上输入密码,系统进行扫描,如果和之前一样,则执行相同程序,如不是,则执行另一种程序。

键扫流程框图和密码锁流程框图及密码修改框图分别如图3.1.2和图3.1.3及图3.1.4所示。

图3.1.1主流程框图

图3.1.2键扫流程框图

图3.1.3密码锁流程框图图3.1.4密码修改流程框图

 

3.2电路原理图

图3.2

3.3系统板上硬件连线

a)把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。

b)把“单片机系统“区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。

c)把“单片机系统”区域中的P3.0-P3.7用8芯排线连接到“4×4行列式键盘”区域中的R1R2R3R4C1C2C3C4端子上。

d)把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L2端子上。

e)把“单片机系统”区域中的P1.7用导线连接到“音频放大模块”区域中的SPKIN端子上。

f)把“音频放大模块”区域中的SPKOUT接到喇叭上。

3.4程序设计内容

1.4×4行列式键盘识别技术:

有关这方面内容前面已经讨论过,这里不再重复。

2.8位数码显示,初始化时,显示“P   ”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。

在输入密码过程中,显示器只显示“8.”。

当数字输入超过6个时,给出报警信息。

在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。

3.4×4行列式键盘的按键功能分布图如图3.4所示:

图3.4

3.5主程序清单

#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;

rightflag=0;

second3=0;

}

else

{

for(i=0;i

{

if(getps[i]!

=ps[i])

{

i=keycount;

errorflag=1;

rightflag=0;

second3=0;

gotoa3;

}

}

errorflag=0;

rightflag=1;

a3:

i=keycount;

}

}

temp=temp&0x0f;

while(temp!

=0x0f)

{

temp=P3;

temp=temp&0x0f;

}

keyoverflag=0;//?

?

?

?

?

?

?

?

?

}

}

P3=0xff;

P3_7=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=0;

break;

case0x0d:

key=13;

break;

case0x0b:

key=14;

break;

case0x07:

key=15;

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;

}

}

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

当前位置:首页 > 高中教育 > 理化生

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

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