基于单片机的电子密码锁设计

更新时间:2024-06-10 20:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

南京理工大学

毕业设计说明书(论文)

作 者: 系:

***

学 号: 1004220***

电子工程与光电技术学院

通信工程

基于单片机的保险柜电子密码锁的

设计与实现

专 业: 题 目:

** 高级工程师 指导者:

(姓 名) (专业技术职务)

评阅者:

(姓 名) (专业技术职务)

2014 年 5 月

毕业设计说明书(论文)中文摘要

摘要 在日常生活和工作中,锁是每个人都离不开的,它是保护个人财产安全、保护资料档案的关键元素。随着电子技术的飞速发展,传统弹子锁的缺点渐渐被放大,社会对新式电子密码锁的需求越来越大,前景广阔。 本次设计基于单片机,其主控芯片选择了单片机AT89S51,显示模块选择了LCD1602,结合了自行设计的矩阵键盘、报警模块等外围电路,主控芯片的控制程序则使用C语言写成,完成了一套具有按键输入、显示、解锁、报警及密码修改等多种功能的电子密码控制系统。 本论文详细叙述了各个模块的功能和设计方案,给出了系统各个功能的仿真结果截图。 关键词 单片机 电子密码锁 矩阵键盘 LCD显示 报警

毕业设计说明书(论文)外文摘要

Title The Design of Electronic Password Lock Based on SCM Abstract In daily life and work, everyone is inseparable from the lock, which is the protection of personal and property safety, the protection of data files. With the rapid development of electronic technology, the shortcomings of traditional tumbler lock gradually been enlarged, the demand for new electronic locks increasingly broad prospects. This design is based on the microcontroller, its main chip microcontroller chosen AT89S51, display module chosen LCD1602, a combination of self-designed matrix keyboard, alarm module and other peripheral circuits, the master chip control program is written in C language . From the design, we got an electronic password control system which has variety of functions: key input, display, unlock, password changing and alarm. This article details the features and design of each module, the simulation results of the various functions of the system screenshot. Keywords Electronic password lock SCM Matrix keyboard LCD Display Alarm 本科毕业设计说明书(论文)

目 录

第 Ⅰ 页 共 Ⅰ 页

1 引言······························· 1.1 课题背景和意义 ·························· 1.2 电子密码锁的发展趋势 ······················· 1.3 本设计要实现的目标 ························ 1.4 设计方案的选择··························

1 1 1 2 2

2 主要原件介绍··························· 5 2.1 主控芯片AT89C51简介 ······················· 5 2.2 LCD1602显示器介绍 ························ 7 2.3 晶体振荡器 ···························· 9 3 系统设计 ····························· 10 3.1 整体思路···························· 10 3.2 系统硬件部分设计························ 11 3.2.1 键盘输入电路 ·························· 11 3.2.2 复位电路 ···························· 12 3.2.3 晶振电路···························· 12 3.2.4 显示电路···························· 13 3.2.5 报警、解锁提示电路 ······················· 14 3.3 系统软件部分设计························ 15 3.3.1 主要程序流图 ·························· 15 3.3.2 按键检测子程序设计 ······················· 15 3.3.3 LCD显示子程序设计 ······················· 17 3.3.4 密码修改子程序设计 ······················· 18 3.3.5 报警声音子程序设计 ······················· 19 4 仿真调试····························· 22 4.1 PROTEUS ISIS简介 ························ 22 4.2 软件调试 ····························· 22 4.3 PROTEUS仿真 ··························· 24 5 结论······························· 29 致谢 ································· 30 参考文献 ······························· 31 附录A 电子密码锁程序源代码 ····················· 32

本科毕业设计说明书(论文)

1 引言

1.1 课题背景和意义

第 1 页 共 41页

自从人类脱离原始社会、开始有私有财产的概念以来,锁就是人们生活中的重要组成部分。它的存在,维护了人们的财产安全、人身安全,增加了人们的安全感,促进了社会和谐。因此,人们对锁的研究从未停止,但几千年来都未有较大的变化,直到20世纪30年代后,电子密码锁的概念出现,这一领域终于出现了日新月异的进步。得益于电子技术的飞速发展,电子密码锁的功能愈来愈完善,取密码量相对较少、安全性不好的常规锁具已然是大势所趋。电子密码锁拥有太多机械锁完全无法相比的优点。它不但能完成“锁”自身的功用,还可以具有记忆、辨识、警报等特别的作用。因为电子密码锁更安全性、更便宜、易操作,越来越多人开始关注这一领域。

当前在第一世界国家中,密码锁技术已经比较成熟,拥有不同的种类,在各类智能门禁系统中,电子密码锁的使用十分普遍,使得门禁的实现有了数种安全、可靠的技术来支持。总的来说,中国目前的密码锁技术还只有世界上70年代左右的水平,生产仍显昂贵。当前,按键式电子锁仍占据了中国市场的大头,国内有若干厂家引进了海外较为先进的按键式和卡片钥匙型锁。另一方面,中国自主研发的电子锁还没有形成成型的产业链,尚未普及。现在国内有不少企业引进了当前世界上先进的技术,发展前景非常可观[1]。相信国内的厂商也会不断进步,使得电子密码锁普及在中国的土地上。

1.2 电子密码锁的发展趋势

在大家的日常生活中,住所和单位的安全保障,档案、财务报表和大多数私人资料、文件的保护基本用上锁的办式来实现。现在门锁大都使用弹子锁,这种锁钥匙易丢失、仿制也并不困难;保险箱最常见的就是使用机械密码锁,它的构造很麻烦,制作精度要有相当高的保障,这种情况下,成本就很难降下来,不仅如此,机械密码锁的缺点依然明显:故障率居高不下,使用者往往要携带数把钥匙,易用性很成问题。前述锁具有着这样多的不便,而人们对锁的需求又是巨大的,一种使用密码来代替钥匙的锁具就成为了必然出现的产品。电子密码锁的出现,大大提高了人们的生活水平,提供了诸多便利,这也同时意味着巨大的市场,

本科毕业设计说明书(论文)

表2.1 P3口功能

第 7 页 共 41页

(P3口同时为闪烁编程和编程校验接收一些控制信号)

2.1.3 振荡器特性

单片机AT89C51允许用户自行外接合适频率的晶体振荡器,最常使用的不

外乎石晶振荡和陶瓷振荡。当配置为片内振荡器时,反向放大器输入端口应接XTAL1、输出端口应当接XTAL2。当使用外部时钟源时,不接XTAL2。此处外部时钟信号的脉冲宽度可以是任意的。 2.1.4 芯片擦除

想在任何已存有信息的存储字节上重复编程,首先必须对芯片进行擦出操作。

AT89C51芯片的擦出方法为:ALE管脚接低电平10ms,同时搭配以适当的控制信号组合,此种操作会将代码阵列全部写为“1”。此外,AT89C51设有两种掉电模式。用户可以自主选择:一是“闲置模式”,此模式下CPU将会挂起,但RAM,定时器,计数器,串口以及中断系统仍会处于工作状态;二是“掉电模式”,此时保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止[9]。

2.2 LCD1602显示器介绍

液晶显示模块主要用于为系统提供输出,可显示图形、数字或专用符号等信息,这一元件在电子产品中相当常见。在本次设计中我们选用LCD1602显示模块,

本科毕业设计说明书(论文)

第 8 页 共 41页

这一型号有诸多优点,如显示自由度高、体积小、耗能少等。 LCD1602可显示2*16 个字符,有RS,R/W,EN三个控制端口和8位数据总线D0-D7,工作电压为5V,并且具有字符对比度调节和背光功能[10]。

它的主要特性如下:

1内含复位电路,对比度可调 ○

2通过控制命令可以实现实现多种功能。 ○

3内部有一显示数据存储器DDRAM,其容量为80字节。 ○

4拥有200个5*7的字符发生器CGROM,其中8个可由用户自定义。 ○

1602型LCD的接口引脚说明如表2.2所示。

表2.2 LCD1602引脚说明

编号 1 2 3 4 5 6 7 8 符号 VSS VDD VL RS R/W E D0 D1 功能 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 编号 9 10 11 12 13 14 15 16 符号 D2 D3 D4 D5 D6 D7 BLA BLK 功能 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极 1602型LCD主要技术参数: 显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA 模块最佳工作电压:5.0V

字符尺寸:2.95×4.35mm(宽×高)

常用指令见下表:

本科毕业设计说明书(论文)

表2.3 LCD1602常见指令

第 9 页 共 41页

2.3 晶体振荡器

晶体振荡器(简称晶振)可以产生一定频率的时钟信号,这一信号经过调频后可成为处理器中各处的总线频率。

现在使用最多当属石英晶体振荡器,也称石英晶体谐振器。石英晶体振荡器具有精度高和稳定度高的优点,它同时可以作为一种晶体谐振元件实现LC谐振回路的功能:稳定频率和选择频率。石英晶体振荡器在生活中的电子设备里随处可见,为它们产生时钟信号,应用在在单片机中时也是如此。

石英晶体具有压电效应,石英晶体振荡器就是利用这一特点制作成的,简称为石英晶体或晶体、晶振。大多数晶振是这样构成的:从特定角度切下矩形或圆形的石英晶体薄片,并在其对应面上敷银制成电极,并在上面各焊一根引线接到管脚上,再加上封装外壳 [11]。

本科毕业设计说明书(论文)

3 系统设计

3.1 整体思路

第 10 页 共 41页

本系统主要包括单片机、矩阵键盘、复位电路、晶振电路和液晶显示器等部分。作为整个系统的输入,矩阵键盘担当着与用户交互的核心任务,用户可以再此输入密码或控制程序的运行方向。

功能上,首先由用户由矩阵键盘输入密码,而后与事先存储的密码进行比较,判断出密码的正确与否,然后单片机会控制特定引脚的电平以触发开锁电路或者报警电路。实用产品只须将单片机的负载由发光二极管替换为实际锁具的开锁电路即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈[12]。

具体的讲,本设计可以分为硬件部分与软件部分俩大部分。其中硬件部分又分为键盘输入电路、复位电路、晶振电路、显示电路、报警或解锁提示电路等几大模块;相应的,软件部分由主程序、按键检测子程序、LCD显示子程序、密码修改子程序、报警声音子程序等组成。

图3.1 系统框图

本科毕业设计说明书(论文)

3.2 系统硬件部分设计

第 11 页 共 41页

本系统外围电路包括键盘输入电路、复位电路、晶振电路、显示电路、报警或解锁提示电路等。结合本设计的原定目标,键盘输入电路选择4×3矩阵键盘,显示电路选择显示屏LCD1602来完成。其原理图如图4.1所示。

图3.2 系统原理图

3.2.1 键盘输入电路

单片机系统中,常用的键盘设计方式有独立式键盘和矩阵式键盘两种。 独立式键盘是指每个I/O输入端口对应一个物理按键的键盘。其优点是键盘结构简单,按键识别容易;缺点是占用I/O口较多。

矩阵式键盘适合用在按键数量较多的系统中,它将I/O口分别引出线,并分为行线和列线,在每一个行线和列线相交的地方放置一个按键,这种方案下,一个占用7个I/O端口的4×3的行列结构可以构成一个12键的键盘。显然这种方式与独立式键盘相比节省了很多I/O端口,但算法相对复杂[13]。常用的矩阵式键盘扫描原理有反转和行/列扫描法。本设计中采用行扫描法,具体原理将在软件部分介绍。

键盘功能及其引脚接法如图4.2所示:

本科毕业设计说明书(论文)

第 12 页 共 41页

图3.3 键盘输入原理图

3.2.2 复位电路

单片机复位可以让整个系统(单片机芯片本身)从一个确定的初始状态开始工作。在单片机刚刚上电时、断电后和执行出错,复位都是必须的操作。RST为高电平并保持一定时间后,单片机进入复位状态,在此期间,P0口呈现高阻态,P1-P3口均呈现高电平,同时PSEN信号无效、ALE为高电平。

本设计在最基础的复位电路基础上,添加了一个按键以实现手动复位功能。在刚接通电源时电容C1两端电势差很小,电阻R1上的电压接近电源电压,这会使得RST为高电平,接着,电容进入充电过程,RST端电势步降低,当RST端的电压表现为低电平时,CPU脱离复位状态,只要电容C3大小适当,就能够保证RST的高电平有效持续时间多于24个振荡周期,此时单片机就能够实现可靠的复位。手动复位按键的加入,使得死机时有了可靠的复位方法。在按下复位键后,电容C3将会经由R6进行放电,此过程结束后,RST端的电位就会由两个电阻的分压情况决定[14]。复位电路的原理如下图所示:

图3.4 复位电路原理图

3.2.3 晶振电路

将晶体振荡器按下图所示方式连接到XTAL1引脚和XTAL2引脚上,就构成了晶振电路。图示是一种电容三点式振荡器,振荡信号的频率取决于晶振频率和两

本科毕业设计说明书(论文)

第 13 页 共 41页

个电容的容量,其中,晶振频率又是主要因素。一般而言,晶振频率的取值范围在0~33MHz之间,两个电容的取值范围在5~30pF之间。根据实际情况,本设计中采用24MHZ做系统的外部晶振。电容取值为22pF[15]。晶振电路原理图如图4.4所示:

C122pFX1CRYSTALC222pF 图3.5 晶振电路原理图

3.2.4 显示电路

为了使密码锁的显示效果使人满意、电路简洁,此处使用了LCD1602作为显示模块的核心,而不是普通的数码管。接通电源后显示器处于等待开锁状态,提示用户输入密码,当用户需要开锁时,可以使用数字键0-9输入密码,每次按键都会把处理结果反馈到屏幕上。当密码输入结束后,按下确认键,系统将会把输入的密码和事先保存的对比,若正确,LCD将显示“Unlock succeed!”,电子密码锁被打开;否则,LCD显示屏会显示“Wrong Password,Unlock Failed!”,电子密码锁保持原状态。

在密码修改的过程中,LCD显示屏会显示更为多样的信息:“Change Password? (Y/N)”、“Old Password:”、“Wrong Password,Match Failed!”、“Enter New PW:”、“The Password must be 6 bits!”、“The Password has changed!”等等,电子锁当前所处的状态一目了然。其显示部分及引脚接口如图4.5所示:

本科毕业设计说明书(论文)

第 14 页 共 41页

图3.6 显示电路原理图

3.2.5 报警、解锁提示电路

本设计报警部分电路由蜂鸣器实现。当输入密码并确认后,单片机的P3.1引脚将输出特定频率的方波,则蜂鸣器被导通而发出声音。当密码错误时,发出的声音为短促的3声“嘟”,音高相同;当密码正确时,发出的声音为一小段乐声。

当解锁成功时,接于P3.0端口的绿色LED灯将会亮起,提示锁已打开。在实际应用的电子密码锁产品中,可以把其替换为电磁继电器的输入,原理仍是不变。报警、解锁提示部分电路原理图如图4.6所示(图中led接P3.0口,air接P3.1口)。

图3.7 报警、解锁提示电路原理图

本科毕业设计说明书(论文)

3.3 系统软件部分设计

第 15 页 共 41页

本设计的软件部分由主程序、按键检测子程序、LCD显示子程序、密码修改子程序、报警声音子程序等组成。 3.3.1 主程序流程图

如图5.1所示为主程序流程图,系统上电后将进行初始化,然后开始进行键盘扫描,此时在键盘上输入密码,若密码正确,则开锁成功,播放成功提示音,密码错误则会提示,包括屏幕画面及声音。

图3.8 主程序流程图

3.3.2 按键检测子程序设计

本设计中的的密码输入使用了4*3矩阵键盘,键盘上除数字键0—9以外还有2个功能键。该矩阵键盘的按键检测采用行扫描法,具体步骤如下:

1令第一行为低电平,其余行和列为高电平,即给P1口赋值0xFE。 ○

本科毕业设计说明书(论文)

2延时5~20ms再次进行检测,实现按键消抖。 ○

第 16 页 共 41页

3读P1口的值,判断当前是否有键被按下。若无键按下,其值仍应为0xFE。○

若第一个按键按下,则第一列会被拉低,即P1口的读取值应为0xEE,即0xEE为第一行第一列按键的键码。同理可得第一行另两个按键的键码为0xDE、0xBE[16]。

用同样的方法,令其它行为低电平,经上述3个步骤也可判断其它按键是否按下。

根据上述过程,该矩阵键盘的按键检测扫描程序设计如下:

uchar code rowScan[]={0xFE,0xFD,0xFB,0xF7}; //行扫描码 uchar code

key12[]={0xEE,0xDE,0xBE,0xED,0xDD,0xBD,0xEB,0xDB,0xBB,0xE7,0xD7,0xB7} // 1 2 3 4 5 6 7 8 9 * 0 # uchar code keyValue[]=\

#define KEY P1

//=====键盘扫描函数========== uchar keyScan(void) //返回值:有键按下时获得的键盘值

(1234567890*#),无键按下时返回字符‘$’

{

uchar k = 0,flag = 0; for(k = 0;k < 4; k++) {

KEY = rowScan[k]; //逐行扫描 delay(10); //按键扫描 if(KEY != rowScan[k]) {

uchar i=0;

for(i = 0; i < 12; i++) {

if(KEY == key12[i]) { //比较键码 flag=1; break; } }

while(KEY != rowScan[k]); //等待按键释放 if(flag)

本科毕业设计说明书(论文)

}

return keyValue[i]; } }

return '$';

第 17 页 共 41页

3.3.3 LCD显示子程序设计

LCD显示是本设计的核心模块之一,为了能在屏幕上总能显示恰当的信息,本设计中LCD显示子程序的功能,应为保障单个字符、字符串的显示,为主程序或其他子程序留出接口,以便需要时可以很容易调用。

本着上述目的,LCD显示子程序的结构如下图所示,它的目的是提供字符与字符串的显示函数。不同层次的函数之间是被调用的关系。

图3.9 显示模块结构图

各函数原型及参数介绍如下:

1void LCDWriteData(uchar Data) // 写数据函数 ○

2void LCDWriteCmd(uchar Cmd) // 写指令函数 ○

3void LCDPosition(uchar row,uchar column) //将坐标转换为LCD的坐标 ○

参数: row为所在行数(1或2),column为在行中的位置(0~15)

本科毕业设计说明书(论文)

4在指定位置写数据函数 ○

void writeChar(uchar row,uchar column, char c)

第 18 页 共 41页

参数: row指定行,column指定列位置,c为待写入的数据。 5写字符串函数 ○

void writeString(uchar row,uchar column1,uchar column2, char *s) 参数:row表示行,column1表示第一行起始地址,column2表示下一行起

始地址,均从1开始。

6 void moveString(char *s) //移动字符串函数 ○

7 void LCDInit(void) //液晶初始化函数 ○

{ LCDWriteCmd(0x38); //设置16*2显示,5*7点阵,8位数据接口 delay(30); LCDWriteCmd(0x01);//清屏 delay(30); LCDWriteCmd(0x06);//地址加一,整屏右移 delay(30); LCDWriteCmd(0x0f);//开显示,光标闪烁,显示光标 }

3.3.4 密码修改子程序设计

在本设计中,密码修改功能是使用外部中断触发的,这意味用户得以随时进行密码的修改,十分方便。因此,密码修改子程序同时也是外部中断0服务程序。若要修改密码,须先输入旧密码密码,密码验证通过后方可设置新密码,新密码输入结束后,验证位数,然后保存新密码。流程如图3.9所示。

本科毕业设计说明书(论文)

第 19 页 共 41页

图3.10 密码修改程序流程图

3.3.5 报警声音子程序设计

本程序的设计类似于电子音乐盒,可以实现1~7七个音符的各种组合,理论上可以播放任意音乐,但音阶始终位于1个八度内。

音调取决于物体振动的频率,频率越高,所发声音音调也就越高。本程序就是利用单片机产生不同频率的方波,来驱动蜂鸣器发出不同音调的声音。

设计中,系统使用了定时中断的方法。这里以起中的音阶“1”为例说明,其初值设为0xF720,对应十进制数63264,则计数65536 - 63264 = 2272次后溢出进入中断,若单片机外接24MHZ晶振,则计数一次对应0.5μs,即计数1136μs

本科毕业设计说明书(论文)

第 20 页 共 41页

后溢出。一个音阶周期为1136μs×2 = 2272μs,对应频率为1 / 2272μs = 440Hz。次频率为音阶“1”所对应的频率值。其他频率对应的计数初值可按照此方法推算出来,具体见表3.1 [17]。

表3.1 不同音阶所对应频率、计数初值

音阶 频率/Hz 计数初值 1 440 0xF720 2 494 0xF888 3 523 0xFC44 4 587 0xF959 5 659 0xFA13 6 698 0xFA67 7 784 0xFB04 由此,可得到报警声音模块的代码如下:

sbit Beep = P3^1;

uchar code scalesH[] = {0xf7,0xf8,0xfc,0xf9,0xfa,0xfa,0xfb}; //7个音符所对应的计数器初值

uchar code scalesL[] = {0x20,0x88,0x44,0x59,0x13,0x67,0x04}; uchar note;

//初始化函数

void AlarmInit()

{ TMOD = 0x01; //T/C0工作在方式一 ET0 = 1; //开定时器中断 EA = 1; //开总中断

TR0 = 0; //关闭定时器0 }

//播放声音

void play(uchar c) {

uint i; switch( c ) {

case 0 : note = 6;

for(i=0;i<3;i++) {

TR0 = 1; delay(300); TR0 = 0; delay(300); } break;

case 1 : for(note=2;note<6;note++) {

TR0 = 1;

本科毕业设计说明书(论文)

delay(300); TR0 = 0; delay(300); } break; }

Beep = 1; }

//定时器0的中断服务函数 void time0() interrupt 1 {

TH0 = scalesH[note]; TL0 = scalesL[note]; Beep = ~Beep; }

第 21 页 共 41页

本科毕业设计说明书(论文)

4 仿真调试

4.1 Proteus ISIS简介

第 22 页 共 41页

本设计硬件原理图的绘制使用了Proteus软件,Proteus软件是一款电路设计与仿真软件,它基于VSM技术,相比其他软件有着诸多优点:它支持仿真的单片机型号很多,像MCS-51系列、PIC系列等均可,同时集成了多样的单片机外围电路,比如键盘、LED、LCD等等。Proteus软件使我们可以比较容易地获得一个功能多、易使用的单片机仿真平台。

4.2 软件调试

4.2.1 Keil软件简介

本设计的软件编译环境使用了Keil uVision4,这是一款基于C语言的51系列兼容单片机软件开发系统。相比于汇编而言,C语言无论是在在功能上、结构性上,还是在可读性、可维护性上都有着巨大的优势,使人们得以编制更加复杂、精致的程序。除了语言优势,Keil C51软件生成的目标代码很紧凑,这加快了运行速度,提高了效率。

使用者可以用任意编辑器编写代码源文件,添加到C51及A51编译器中就可以编译生成OBJ文件,然后连接定位库文件后生成ABS文件。ABS文件经过OH51的转换就可以得到标准的Hex文件,可以使用仿真器直接对目标进行调试[18]。

4.2.2 程序调试

在Keil软件上进行程序的调试,首先新建工程,在空白的代码编辑页输入程序,保存后进行程序编译,若报错修改报错处。经反复修改后,程序会提示编译成功,编译成功的画面如图4.1所示:

本科毕业设计说明书(论文)

第 23 页 共 41页

图4.1 Keil编译成功

Keil中的程序需生成51单片机可执行的HEX文件,需要对“目标1”的属性进行如图4.2和图4.3所示的操作。

图4.2 目标1的选项(1)

图4.3 目标1的选项(2)

本科毕业设计说明书(论文)

4.3 Proteus仿真

第 24 页 共 41页

在Proteus中打开前面所制作的工程,双击单片机芯片,在其属性中填入上一部所生成的 E-lock.hex 文件,如图6.4所示:

图4.4 AT89C51的属性

点击“开始仿真”按钮后,就可以看到最终的制作成果了。初始状态如图6.5所示。

图4.5 仿真初始状态

现在就可以逐一实现电子密码锁的各种功能。以下是电子密码锁各种功能实现的具体仿真过程:

本科毕业设计说明书(论文)

反应出来,仿真效果图如图6.6所示。

第 25 页 共 41页

(1)本电子密码锁在密码输入过程中,每输入一位密码,都会在显示屏上

图4.6 输入密码时的仿真图

(2)本设计设定的初始密码为111222,当在4*3矩阵键盘上输入111222并按下确认键后,显示屏上将显示 “Unlock Succeed”,同时播放音乐,实现开锁功能。在本设计的仿真中使用发光二极管代替实际产品中的电磁锁,以发光二极管D1的发光代表锁打开。密码输入正确,实现开锁的仿真图如图6.7。

图4.7 密码正确实现开锁的仿真图

(3)当密码输入有误时,显示屏上将会显示“Wrong Password, Unlock Failed !”,同时播放短促的报警声,锁保持关闭,发光二极管D1不发光。密码输入错误,锁不打开的仿真图如图6.8所示。

图4.8 密码错误不能开锁的仿真图

本科毕业设计说明书(论文)

第 26 页 共 41页

(4)电子密码锁的密码可修改。用户确认修改后会提示用户输入旧密码,当旧密码输入正确并验证通过后,即可设置新的密码。按下“修改密码”键后显示屏的显示情况如图6.9所示。

图4.9 询问用户是否要修改

图4.10 确认修改后画面

(5) 如果旧密码输入错误则不能进行新密码的设置,显示屏上会显示“Wrong Password, Match Failed!”并于3秒后要求重新输入。显示屏显示如图6.11所示。

图4.11验证原密码失败的仿真图

(6)只有当输入的旧密码正确时,方可输入新密码,显示如图6.12所示。

本科毕业设计说明书(论文)

第 27 页 共 41页

图4.12 新密码输入界面

(7)只有当输入新的密码是6位时,电子密码锁的密码才会更新,否则发出错误警告,要求重新输入,显示图如图6.13所示。

图4.13 新密码不足6位的提示

(8)密码若成功更新,显示屏将显示提示信息“The password has changed!”。如图6.14所示。

图4.14 新密码设定成攻的提示

本科毕业设计说明书(论文)

5 结论

第 28 页 共 41页

进行本次毕业设计的过程中,通过网络与图书馆查阅了诸多资料,在老师的提点下,结合实际,制作了一款功能较为齐全的电子密码锁,实现了报警、密码修改等核心设计。本设计在充分探究实用性、经济性的基础上,主控芯片选择了单片机AT89S51,显示模块选择了LCD1602,结合了自行设计的矩阵键盘、报警模块等外围电路,主控芯片的控制程序则使用C语言编写而成,简洁而注释充分条理,完成了课题的要求。

本设计在Proteus软件中设计了以AT89C51单片机为核心,拥有矩阵键盘、显示、报警、复位、晶振等诸多模块的完整电路,并在Keil中编写了全套程序,程序中添加了较为详细的注释,便于阅读、修改与维护。由Keil获取Hex文件后,在Proueus进行了成功的仿真,得到了完整的设计。

本设计最终的电子密码锁成品具有以下功能:

(1)当通过4*3矩阵键盘输入正确密码时,密码锁正常开锁,同时显示屏出现相应的显示信息,蜂鸣器播放开锁音。

(2)当输入密码不正确时,不能开锁,系统报警,同时显示屏出现相应显示信息。

(3)本设计系统中,密码锁的密码可以通过矩阵键盘更改,但只有在输入原始密码正确的前提下方可设置新密码,同时显示器的显示屏出现相应显示信息。

在这次毕业设计中,从定下课题、查阅资料,到着手制作、修改完善,每一步都令我受益匪浅,不仅巩固了大学期间学到的知识,又增加了许多工程实践经验。纸上得来终觉浅,很多时候,不亲手去做一件事,就无法真正了解其中的关键、困难,多多实践动手,才能理论联系实际,增强自身能力。

本科毕业设计说明书(论文)

第 29 页 共 41页

致 谢

在**老师的悉心指导下,本设计终于得以完成,在此,我衷心的感谢马玲老师对我的关心与帮助。**老师对工作的认真负责、严谨求是,令我感悟良多,引以为准绳。**老师在整个毕业设计的过程中,多次询问进度情况与所遇困难,督促、引领着我,没有**老师,我就无法高质量的完成此做,在此,谨向我的导师马玲老师表示我内心最诚挚的谢意!

与此同时,我还要感谢四年来我的任课老师们,没有诸位老师的悉心教导,我断然无法达到今日的学术水平,遑论完成这个毕业设计。谢谢你们!

最后,再一次感谢我周围的朋友们,是你们在我遇到困难时伸出援手,是你们与我相互扶持。还要感谢我论文中所引用、参考的文献的作者,正式站在你们的肩膀上,我才能看得更远。

谢谢大家!

本科毕业设计说明书(论文)

参 考 文 献

第 30 页 共 41页

[1] 杨茂涛.一种电子密码锁的实现[J].福建电脑,2004,(08)

[2] 郭海英.基于单片机的电子安全密码锁的设计[M].现代电子技术,2005,(13) [3] 李明喜.新型电子密码锁的设计[J].机电产品开发与创

新,2004,2(3):22-28.

[4] 祖龙起,刘仁杰.一种新型可编程密码锁[J].大连轻工业学院学

报,2002,(01)

[5] 郭海英.基于单片机电子安全密码锁设计[J].现代电子计术,2005,1(13):57-58.

[6] 瞿贵荣.实用电子密码锁[J].家庭电子,2000,3(7):77-82.

[7] 石文轩,宋薇.基于单片机MCS一51的智能密码锁设计[M].武汉工程职业技

术学院学报,2004,(01)

[8] 叶启明.单片机制作的新型安全密码锁[J].家庭电子,2005,(10)

[9] 闫玉德等.单片微型计算机原理与设计[M].北京:中国电力出版社,2010. [10] 张毅刚等.MSC-51单片机应用设计[M].黑龙江:哈尔滨工业大学出版社,

2004.

[11] 李鹏飞. AVR单片机与4*4小键盘的使用[M]. 北京:走进精彩的AVR单片

机世界, 2006. [12] 徐明.王云山基于指纹模块SM-2B的指纹锁的设计.机械设计与制造

2005(6)

[13] 常薇等. AVR单片机接口研究. 山西: 中北大学,科技情报开发与经济,

2006年第16卷第18期, 2006.

[14] 沙占友,王彦朋,孟志永.单片机外围电路设计[M].北京:电子工业出版社,

2003.

[15] 郭天祥.新概念51单片机C语言教程,北京:电子工业出版社,2009.1 [16] 张毅刚.新编MCS-51单片机应用设计,哈尔滨:哈尔滨工业大学出版社2003 [17] 朱红,赵琦,王庆宝.C++程序设计教程,北京:清华大学出版社,2009 [18] Proteus辅助的单片机原理实践,北京:北京航空航天大学出版社,2013

附录A 电子密码锁程序源代码

本科毕业设计说明书(论文)

#include #define uchar unsigned char #define uint unsigned int

#define LCDDataBus P2 //定义LCD数据总线 sbit RS = P0^1; sbit RW = P0^2; sbit EP = P0^3; sbit unlock = P3^0;

uchar Keyword[6]=\

// 延时函数 void delay(uint k) { }

//=================================== // LCD部分

//===================================

// 写数据函数

void LCDWriteData(uchar Data) { }

// 写指令函数

void LCDWriteCmd(uchar Cmd) {

RS=0; //传输指令 RS=1; //传输数据 RW=0; //写 LCDDataBus=Data; EP=1; delay(1); EP=0; unsigned char i; for(i = 121; i > 0; i--); for(; k > 0; k--)

//初始密码

第 31 页 共 41页

本科毕业设计说明书(论文)

}

// ========将坐标转换为LCD的坐标=========== void LCDPosition(uchar row,uchar column) { 示 }

// ==========在指定位置写数据函数===========

void writeChar(uchar row,uchar column, char c) c为待写入的数据。 { }

// ============写字符串函数=================

void writeString(uchar row,uchar column1,uchar column2, char *s) {

LCDPosition(row,column); LCDWriteData(c); delay(200);

LCDWriteCmd(position); delay(10); else if(row == 2)

position = 0xC0 + column - 1; char position; if(row == 1)

//

RW=0;

LCDDataBus=Cmd; EP=1; delay(1); EP=0;

第 32 页 共 41页

row = 0x00在第一行显示,row

= 0x01在第二行显示

position = 0x80 + column - 1;

//

column = 0~15在LCD上的可见域显

// row指定行,column指定列位置,

// row表示行,

column1表示第一行起始地址,column2表示下一行起始地址,均从1开始。

本科毕业设计说明书(论文)

}

// 移动字符串函数 void moveString(char *s) { }

// 液晶初始化函数 void LCDInit(void) {

LCDWriteCmd(0x38); //设置16*2显示,5*7点阵,8位数据接口

uchar i;

writeString(1,25,25,s); for(i = 16; i > 0; i--) { }

LCDWriteCmd(0x18); //屏幕移动 delay(900);

char i; if((*s)=='\\0') { }

if((*(s+i)) == '\\0') { }

if(i > 15 && i< 32) { }

writeChar(row + 1,column2,*(s+i)); delay(2); column2++;

writeChar(row,column1,*(s+i)); delay(2); column1++; break; if(i <= 15) return; for(i = 0; ; i++)

第 33 页 共 41页

本科毕业设计说明书(论文)

delay(30);

LCDWriteCmd(0x01);//清屏 delay(30);

LCDWriteCmd(0x06);//地址加一,整屏右移 delay(30);

LCDWriteCmd(0x0f);//开显示,光标闪烁,显示光标 }

//外部中断初始化 void InuptInit(void) { IT0=1; }

//=================================== // 键盘部分

//===================================

uchar code rowScan[]={0xFE,0xFD,0xFB,0xF7}; uchar

//行扫描码

//uchar code columnScan[]={0xEF,0xDF,0xBF,0x7F};

EX0=1; EA =1;

第 34 页 共 41页

code

key12[]={0xEE,0xDE,0xBE,0xED,0xDD,0xBD,0xEB,0xDB,0xBB,0xE7,0xD7,0xB7}; // 1 2 3 4 5 6 7 8 9 * 0 # uchar code keyValue[]=\

#define KEY P1

//=====键盘扫描函数========== uchar keyScan(void) 键按下时返回字符?$? {

uchar k = 0,flag = 0; for(k = 0;k < 4; k++) {

KEY = rowScan[k];

//逐行扫描

//返回值:有键按下时获得的键盘值(1234567890*#),无

本科毕业设计说明书(论文)

}

//=================================== // 警铃部分

//==================================== sbit Beep = P3^1;

} return '$';

delay(10); { }

uchar i=0;

for(i = 0; i < 12; i++) { }

while(KEY != rowScan[k]); //等待按键释放 if(flag)

return keyValue[i]; if(KEY == key12[i]) { }

//比较键码 flag=1; break;

//按键扫描

if(KEY != rowScan[k])

第 35 页 共 41页

uchar code scalesH[] = {0xf7,0xf8,0xfc,0xf9,0xfa,0xfa,0xfb}; //7个音符所对应的计数器初值 uchar code scalesL[] = {0x20,0x88,0x44,0x59,0x13,0x67,0x04}; uchar note;

//初始化函数 void AlarmInit()

{ TMOD = 0x01; //T/C0工作在方式一 ET0 = 1; EA = 1; }

//播放声音 void play(uchar c)

TR0 = 0;

//开定时器中断 //开总中断 //关闭定时器0

本科毕业设计说明书(论文)

{ uint i; }

//定时器0的中断服务函数 void time0() interrupt 1 {

TH0 = scalesH[note]; TL0 = scalesL[note]; Beep = ~Beep; }

//==================================== // 主函数

//====================================

switch( c ) {

case 0 : note = 6;

for(i=0;i<3;i++) {

TR0 = 1; delay(300); TR0 = 0; delay(300); }

break;

for(note=2;note<6;note++)

case 1 :

第 36 页 共 41页

{

TR0 = 1; delay(300); TR0 = 0; delay(300); } }

Beep = 1;

break;

本文来源:https://www.bwwdw.com/article/hta6.html

Top