摘要
本次设计使用AT89S52实现一基于单片机的电子密码锁。本系统由单片机系统、矩阵键盘、LCD显示和报警系统组成。系统能完成开锁、超次锁定、修改用户密码基本的密码锁的功能。本系统成本低廉,功能实用。
目录
1 前言 4
1.1 数字随机键盘的来源和意义 4
1.2单片机概述 4
2 数字密码锁总体设计说明 5
2.1 总体开发计划 5
2.1.1 基本功能 5
2.1.2 扩展功能 5
2.2 总体设计方案 5
2.2.1 单片机的选择 5
2.2.2 键盘的选择 6
2.2.3 显示模块的选择 6
2.2.4 报警模块的选择 6
3 硬件设计说明 7
3.1 硬件总体设计方案 7
3.1.1 硬件功能模块的划分 7
3.1.2 硬件设计目标 7
3.2 硬件单元设计 7
3.2.1 主控电路 7
3.2.2 显示电路 8
3.2.4 键盘电路 10
3.2.5 报警电路 10
4 软件设计说明
4.1 软件设计总体方案
4.1.1 软件设计目标
4.1.2 软件功能模块划分
4.2 软件设计
4.2.1 主函数的程序设计
4.2.2 系统初始化的程序设计
5 系统调试
6 总结 19
参考文献
附件 21
1 前言
1.1 数字密码锁的来源和意义随着人们生活水平的提高,电子密码防盗锁作为防盗卫士的作用日趋重要。电子密码防盗锁用密码代替钥匙,不但省去了佩戴钥匙的烦恼,也从根本上解决了普通门锁保密性差的缺点。随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,机械锁的这些弊端为一种新型的锁---电子密码锁,提供了发展的空间。
电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的欢迎。鉴于目前的技术水平与市场的接收程度,电子密码锁是电子防盗产品的主流。
1.2 单片机概述单片机,亦称单片微电脑或单片微型计算机。它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口 (I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。 计算机的产生加快了人类改造世界的步伐,但是它毕竟体积大。微计算机(单片机)在这种情况下诞生了,它为我们改变了什么?纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC 卡、电子宠物等,这些都离不开单片机。以前没有单片机时,这些东西也能做,但是只能使用复杂的模拟电路,然而这样做出来的产品不仅体积大,而且成本高,并且由于长期使用,元器件不断老化,控制的精度自然也会达不到标准。在单片机产生后,我们就将控制这些东西变为智能化了,我们只需要在单片机外围接一点简单的接口电路,核心部分只是由人为的写入程序来完成。这样产品的体积变小了,成本也降低了,长期使用也不会担心精度达不到了,且容易升级改善。
目前,在低端工控领域使用最多的单片机是51系列单片机,该型号单片机最初是由INTEL公司推出的,后来因其优异的特性,使得其他公司也开始开发基于51内核的单片机,目前在国内比较通用的51内核单片机有ATMEL公司的AT89系列、STC公司的STC89系列等。其中AT89系列以其超强的稳定性,在国内工控领域占领了很大市场。此外在实验室以及大学单片机课程教育中,该型号单片机也得到了普遍的使用。
2 数字随机键盘总体设计说明
2.1 总体开发计划2.1.1实现的功能
本次设计研制了一款具有防盗自动报警功能的电子密码锁。该密码锁设计方法合理,简单易行,成本低,符合住宅、办公室用锁要求,具有一定的推广价值。
可以实现的功能包括:
(1)系统设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。
(2)密码由用户自己设定,在开锁状态下,用户可自行修改密码。
(3)具有自动报警功能。输入密码错误时,由扬声器发出报警声。
(4)当输入三次错误密码时,键盘锁住,并长时间报警。
(5) 在用户按下按键之后,系统自动记录时间,如果两个按键按下间隔时间大于20S时,当前输入密码失效,系统重新复位,需要用户再次输入密码。此外,如果用户在按下六个数字键后,如果超过20S没有按下确认键,则当前输入也无效,系统会自动复位。通过这个功能,可以更好的实现密码锁的额防护功能。
2.2 总体设计方案2.2.1 控制芯片的选择
控制芯片采用AT89S52单片机。AT89S52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89S52单片机在电子行业中有着广泛的应用。[3]
AT89S52为8 位通用微处理器,采用工业标
准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外部可接0~33MHz的晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0~P3是AT89S52单片机与外界联系的4个8位双向并行I/O端口。P0口为一个8位漏级开路双向I/O口,能够用于外部程序数据存储器,它可以被定义为数据/地址的低8位。P1口是一个准双向并行口,主要作用为通用I/O口。P2口石一个准双向的8位并行端口,既可以作为通用I/O口使用,也可以作为高8位地址线使用。P3口是一个多功能的准双向8位并行口,它的每一位既可以作为通用I/O口使用,又都具有第二输出功能。如图2-2-1所示。
图2-2-1 AT89S52管脚图
2.2.2 键盘的选择方案一:独立式键盘
独立式按键电路配置灵活,硬件结构简单,但每个按键必须占用一根I/O口线。在按键数量较多时,I/O口的利用率不高。但程序的编写较简单,适用于所需按键较少的场合,
方案二:矩阵式键盘
电路连接复杂,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。但是提高了I/O口的利用率,适用于所需要按键较多得场合。
因为本系统的设计需要12个按键,为了减少I/O口的使用,故采用方案二。
2.2.3 显示模块的选择方案一:数码管显示
七段LED数码管内部由7个条形发关二极管和一个圆形发光二极管组成的“字段”,可用于显示数字0~9和部分简单字符。
方案二:液晶显示
液晶显示器LCD(Liquid Crystal Display)是一种低功耗的显示器,它是一种专门用于显示字母、数字、符号等点阵式LCD。其有显示质量高、数字接口、功耗低、体积小等优点。
因为数码管能只能显示数字和简单的字母,LCD可以显示字符,图形等,并能更形象的体现出字符与图像。故本系统采用方案二。
3 硬件设计说明
3.1 硬件总体设计方案
3.1.1硬件功能模块划分图3-1-1 硬件模块图
(1)AT89S52:实现对整个系统的控制。
(2)键盘模块:用作密码的输入和密码的重新输入,以及每次输入密码前0~9这十个按键值可以随机产生。
(3)显示模块:显示字符,提醒用户注意操作。用“*”显示输入密码,保护用户输入密码的安全
(4)报警模块: 当输入密码错误时,自动报警。
3.1.2 硬件设计目标(1)本系统采用AT89S52单片机作为控制核心,P0.0-PO.3端口与矩阵式的行相接,P3.4-P3.7端口与矩阵式的列相接。第1个按键到第10个按键的键盘值是数字0~9随机,第11个按键的功能是输入数字键的清除,第12个按键的功能是输入键值的确认,第13个按键的功能是密码重新设定。第14个按键的功能是密码重新输入。
(2)蜂鸣器接到单片机的P2.4,当输入密码错误时,系统会自动报警。
(3)LCD1602的8位数据线DB0~DB7接到单片的P0口,数据和指令选择控制端RS接到单片机的P2.5,读写控制端R/W接到单片的P2.6,数据读写操作控制位E接到单片的P2.7。按下数字键后,屏幕上会用“*”显示,保护用户的密码不被窃取。
3.2 硬件单元设计3.2.1 主控电路主控电路是以AT89S52单片机为核心,包括复位电路、晶振电路、以及电源的指示灯电路,这4部分构成单片机的最小系统,作为整个设计的控制核心,实现对整个系统进行控制。主要控制电路如图3-2-1所示。
图3-2-1 主控电路
3.2.2 键盘电路本设计需要12个按键,但为了方便以后的扩展采用了4x4矩阵键盘(电路图如图3-2-5所示)。矩阵键盘的行分别与单片机的P0.0~P0.4端口相接,列分别与单片机的P3.4~P3.7端口相接。
图3-2-2 键盘电路
各个按键对应的功能如表1所示 。
表3-1-1
3.2.5 报警电路蜂鸣器的控制端口连接P2.4,具体工作电路图如图3-2-3所示。
图 3-2-3 报警电路
4 软件设计说明
4.1 软件设计总体方案
4.1.1 软件设计目标编写的程序能够必须能够实现基本功能的密码输入和输入密码正确有否的判断。此外,还要处理修改密码的操作。并且及时的再液晶上显示提示字符,从而方便用户的使用。在程序编写时必须做到:
(1)结构合理
程序应该采用结构模块化设计。这不仅有利于程序的进一步扩充,而且也有利于程序的修改和维护。在程序编程时,要尽量使得程序的层次分明。易于阅读和理解,同时还可以简化程序减小程序对于内存的使用量,当程序中有经常需要加以修改或变化的参数时,应该设计成独立的参数传递群序,避免程序的频繁修改。
(2)操作性能好
操作性能好是指使用方便。这点是、对数据采集系统来说是很重要的。在开发程序时,应该考虑如何降低对操作人员专业知识的要求。
(3)系统应设计一定的检测程序
例如状态检测利于诊断程序,以便系统发生故障时容易确定故障部位,对于重要的参数要定时存储,以防止因掉电而丢失数据。
(4)提高程序的执行速度
4.1.2 软件功能模块划分表4-1-1 程序模块划分
4.2 软件设计
4.2.1 主函数的程序设计首先,调用系统初始化函数sys_init(),初始化液晶和定时器。然后扫描键盘,读取用户按下的键值,并调用光标闪烁函数,提醒用户当前输入键值的位置。
主函数流程图如图4-2-1所示。
4-2-1 主函数流程图
4.2.2 系统初始化的程序设计首先,调用LCD初始化函数lcd_init,对LCD1602进行初始化配置。然后调用字符显示函数,提醒用户输入密码。最后调用定时器1初始化函数。系统初始化的流程图如图4-2-2所示。
图4-2-2 系统初始化流程图
4.2.3 键盘扫描的程序设计首先,设置行线和列线分别为4,。其次,开始键盘是扫描,判断有无按键按下,如果有按键按下就延时15ms后,再次判断有无按键按下,如果还是有键按下就计算出相应的按键值,如果没键按下就返回继续键盘扫描。最后,将计算出的键值返回。键盘扫描的流程图如图4-2-3所示。
图4-2-3 键盘扫描流程图
4.2.4 输入密码判断函数输入密码判断函数主要包括了两个功能。其一是在开锁阶段,当输入了六位数字按键之后,如果按下了确认键,则比较输入的密码是否与真实的密码相同。如果不相同则提示输入错误,如果相同则提示开锁成功。其二是处于设置密码阶段,第一次设置的密码会被保存。同时,提醒用户再次输入确认密码,如果两次密码一样,则将新的密码保存。否则,提醒用户再次输入新的密码。程序流程图如图所示。
图4-2-4 输入密码判断函数流程图
5 系统调试
5.1 硬件调试
5.1.1 显示电路调试编写一个简单的程序,在LCD1602的指定位置显示一个字符,将程序下载到单片机的最小系统,LCD1602能正常显示字符,并且调节与LCD1602相连的可调电阻,能使LCD1602的显示亮度发生变化,说明LCD1602显示电路与单片机最小系统的电路可用。
5.1.2 键盘与报警电路调试分别编写简单的键盘每个按键按下时控制蜂鸣器响序,将程序下载到单片机最小系统,可观察到每次按下一个按键时能够使蜂鸣器响的效果,说明键盘与报警电路能够正常工作。
5.2 软件调试首先,在protues里画好智能数字随机键盘的基本功能电路(如图5-2-1所示)。其次,将编写好的程序用 Keil uVision4 软件进行编译,生成.hex文件。最后,将生成的.hex文件加载到单片机上,点开始按钮,可观察到以下所示的仿真效果。
- 系统整体工作图:系统整体主要包括单片机、LCD、矩阵键盘、存储器和报警电路等。如图5-2-1所示。
图5-2-1 基本功能电路
(2)开机画面:开始启动后,LCD1602的第一行提示字符,第二行显示输入键值。如图5-2.2所示。
图5-2-2 启动后画面
(3)输入密码后,使用“*”代替具体的键值,系统工作界面如图5-2-3所示。
图5-2-3 首次输入密码时的画面
(4)输入密码正确后,显示“PASSWORD OK!”输入成功后界面显示如图5-2-4
图5-2-4 输入密码成功
(5)当开锁成功时,如果按下“设置密码”键,则显示“NEW PASSWORD”,提醒用户输入新的密码。显示界面如图5-2-5所示。
图5-2-5 设置新的密码
(6)设置新的密码时,需要输入两次,并且只有这两次输入数据一样时,系统才会保存新的密码。否则设定的新密码无效。显示界面如图5-2-6所示。

图5-2-6 再次输入新的密码
(7)输入密码错误:当用户输入密码错误时,系统会显示“PASSWORD ERROR”,并且发出报警声。显示界面如图5-2-7所示。
图2-5-7 输入密码错误
(7)输入密码错误等于三次:当用户第三次输入错误的密码时,系统会显示“KEY IS LOCK”,并且发出报警声。显示界面如图5-2-5所示。
图2-5-7 第三次输入密码错误
5.3 软硬件联合调试首先,将硬件电路板接上DC+5V的电源。其次,将程序下载到单片机上,就可以看到本设计最终的产品效果如下所示。
(1)输入密码。
图5-3-1 输入密码
(2)输入密码成功。
图5-3-2 输入密码成功
(3)设置新的密码。
图5-3-3 设置新的密码
6 总结
本设计包括单片机最小系统电路、键盘电路、LCD1602显示电路以及蜂鸣器电路。经过单片机的处理,在LCD1602的第一行上显示提示信息,LCD1602第二行用“*”显示的是当前的输入的密码。当输入密码错误时,系统会自动报警。如果连续三次输入密码错误时,键盘会锁住,并长时间报警。智能数字随机键盘不仅可以应用于ATM机的键盘输入和密码防盗,还可以广泛应用于其他各种需要应用键盘输入密码的设备,如储物货仓、保险柜、机关防盗门等。此产品将以其设计巧妙,灵活多变,成本低廉,操作简单,便捷实用,保密安全等优点,拥有广阔的市场前景和发展空间。
附录:
(1)原理图


代码:
- #include<AT89X52.h>
- #include "液晶.h"
- #include "stdlib.h"
- #include<Function.h>
- #include "fun_char.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit beep=P2^4; //警铃
- uint TIM=0;
- uchar mydata[6]; //输入密码
- uchar testdata[6];//存储器保存的密码
- uchar ok_stop=0;
- struct key
- {
- uchar time; //按键时间控制
- uchar down; //输入次数
- uchar open; //键盘打开
- uchar close;//键盘关闭
- uchar setnew;//设置新的密码
- uchar error; //输入密码错误次数
- uchar reset_num; //设置密码次数记录(输入新的密码,需要输入两次,在第二次输入后开始比较)
- uchar reset; //设置新的密码标志位
- uchar disclose; //关闭显示
- uint time_n; //定时器中断次数
- }key={0,0,0,0,0,0,0,0,0,0};
- unsigned char code KEYTAB[16] ={0x7e,0xBE,0XBD,0xBB,0xDE,0xDD,0xDB,0xEE,0xED,0xEB,0x7D,0x7B,0x77,0xb7,0xd7,0xe7};
- void clear_all();//
- /*******************************************
- *函数名称:delay(uint t)延时函数
- *函数作用:延时1ms左右
- *
- *********************************************/
- void delay(uint t)
- {
- uint i,j;
- for(i=0;i<t;i++)
- for(j=0;j<110;j++);
- }
- /*******************************************
- *函数名称:check_code( )
- *函数作用:1、对比输入的密码和存储器中的密码是否一致,一致
- 则开锁。不一致,则记录错误次数,如果次数大于3次,
- 则锁键盘,并报警
- 2、当设置新的密码时,检测两次输入的密码是否一致
- 一致则保存,
-
- *********************************************/
- void code_test(void)
- {
- unsigned char i=0;
- unsigned char dif_label=0;
- if(key.setnew==0||key.reset_num==1) //正处于开锁状态时输入6位完成或者是设置新的密码时第二次输入完成
- {
- for(i=0;i<6;i++) //对这六位和实际的密码进行比较
- {
- if((mydata[i]!=testdata[i]))//如果有一位不同
- {
- if(key.setnew==0) //如果现在正处于开锁状态
- {
- key.error++;//输入密码错误次数记录
- if(key.error>2)//如果大于2次
- {
- if(key.open==0)//如果现在没有锁键盘
- {
- lock_char(); //显示KEY IS LOCK
- key.open=1; //锁键盘
- TR1=1; //定时器启动
- key.disclose=1; //关闭显示
- key.error=0; //错误清楚
- key.time=0; //按键时间清零
- }
- }
- else //如果没有超过2次
- {
- error_char(); //显示输入密码错误
- beep=0;
- delay(1500);//延时3s左右
- beep=1;
- clear();// 变量清零
- }
- }
- else //如果处于设置密码状态,但是设置的密码两次输入不一样
- {
-
- different_char(); //输出it's different
- delay(1000); //延时2s
- key.down=0; //变量清除
- reset_char();//重新输入新的密码,这个地方最好有个时间记录
- dif_label=1; //
- key.reset_num=0;// 提示重新输入密码
- }
- break;//退出循环
- }
- }
- }
-
- if(key.setnew==1)//如果正输入新的密码
- {
- if(key.reset_num==0) //如果是第一次输入新的密码,则i=6,主要是为了下面好判断
- {
- i=6;//自动保存了
- }
-
- }
- if(i==6&&dif_label==0) //如果输入密码正确,
- {
-
- if(key.setnew==0)//输入密码正确
- {
- key.error=0; //清零
- key.down=0;//复位
- ok_char(); //显示PASSWORD OK
- key.disclose=1;// 停止显示光标闪烁
- key.reset=1;// 允许设置新的密码
- ok_stop=1;//
-
- }
- else//如果现在正处于输入新的密码状态
- {
-
- if(key.reset_num==0) //如果是第一次输入
- {
-
- for(i=0;i<6;i++) //保存密码到testdata中
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
完整的Word格式文档51黑下载地址: