基于AT89C51的电子密码锁设计
单片机课程设计基于C5的电子密码锁设计
单片机系统课程设计成绩评定表设计课题基于89C51的电子密码锁设计学院名称:电气工程学院专业班级:学生姓名:学号:指导教师:设计地点:设计时间:指导教师意见:成绩:签名:年月日单片机系统课程设计课程设计名称:基于89C51的电子密码锁设计专业班级:学生姓名:学号:指导教师:课程设计地点:课程设计时间:单片机系统课程设计任务书学生姓名专业班级学号题目课题性质工程设计课题来源自拟指导教师主要内容(参数)利用89C51设计电子密码锁,实现以下功能:1.使用LED显示密码输入的相关信息;2.通过键盘0~9设置4位数字的密码;3.实现密码的输入、清除、更改、开锁、报警等功能。
任务要求(进度)第1-2天:熟悉课程设计任务及要求,查阅技术资料,确定设计方案。
第3-4天:按照确定的方案设计单元电路。
要求画出单元电路图,元件及元件参数选择要有依据,各单元电路的设计要有详细论述。
第5-6天:软件设计,编写程序。
第7-8天:实验室调试。
第9-10天:撰写课程设计报告。
要求内容完整、图表清晰、文理流畅、格式规范、方案合理、设计正确,篇幅不少于6000字。
主要参考资料[1]王迎旭.《单片机原理及及应用》,机械工业出版社,2001[2]周航慈.《单片机应用程序设计技术》,北京航空航天大学出版社[3]张洪润. 《单片机应用技术教程》.北京:清华大学出版社,1997[4]宋彩利.《单片机原理与C51接口编程》,西安交通大学出版社,2008.6 [1]夏继强,沈德金等.《单片机实验与实践教程》,北京航天大学出版社,2004年1月出版审查意见系(教研室)主任签字:年月日目录1 概述 (4)2 系统总体方案设计 (6)2.1 任务分析 (6)2.2 方案设计 (6)3 硬件电路设计 (7)3.1 键盘电路设计 (7)3.2 LED显示电路 (8)3.3 开锁电路 (10)3.4 报警电路 (10)4 软件设计 (11)4.1 软件设计思路 (11)4.1 键盘扫描子程序 (11)4.2 LED显示子程序 (13)4.3 密码比较和报警程序 (14)5 系统调试 (16)6 总结 (17)参考文献 (17)附录 (18)附录A 硬件原理图 (18)附录B 源程序清单 (19)1 概述随着科技的发展,单片机已不是一个陌生的名词,它的出现是近代计算机技术发展史上的一个重要里程碑,因为单片机的诞生标志着计算机正式形成了通用计算机系统和嵌入式计算机系统两大分支。
基于AT89C51的电子号码锁方案设计书
学生姓名:2B专业名称:测控技术与仪器指导教师:2B 讲师摘要随着人们的生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统机械锁由于结构简单,被撬事件屡见不鲜;电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐,本课题具有实际应用价值。
本设计以单片机AT89C51作为密码锁监控装置的检测和控制核心,分为主机控制和从机执行机构(本设计重点介绍主机控制),实现钥匙信息在主机上的初步认证注册、密码信息的加密、钥匙丢失报废等功能。
根据51单片机之间的串行通信原理,这便于对密码信息的随机加密和保护。
而且采用键盘输入的电子密码锁具有较高的优势。
采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,提高信号传输的抗干扰性,减少错误动作,而且功率消耗低;反应速度快、传输效率高、工作稳定可靠等。
软件设计采用自上而下的模块化设计思想,以使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。
测试结果表明,本系统各项功能已达到本设计的所有要求。
经实验证明,该密码锁具有设计方法合理,简单易行,成本低,安全实用等特点,符合住宅、办公室用锁要求,具有推广价值。
关键词: 单片机密码锁单片机设计电子锁AbstractAs people's living standard enhancement, how to realize the family guard against theft has become a particularly prominent, the traditional mechanical lock because of its simple structure, prizing events it is often seen.。
electronic lock high because of their confidentiality, the use of flexibility good, high safety factor, by the favor of the majority of users, this paper has practical value.The design of single-chip AT89C51 as cipher lock monitoring device for the detection and control of the core, the host is divided into control and the slave actuator ( this set focuses on control of the host ), realize the key information in a host of preliminary registration, password information encryption, key loss and function. According to the51 single-chip serial communication between the principle, it is convenient for the password information random encryption and protection. And the use of keyboard input of the electronic code lock has high advantage. Digital signal encoding and the two modulation modes, which can not only realize the multiplexed information control, to improve anti-interference signal transmission, reduce the mistake action, and low power consumption。
基于AT89C51单片机的密码锁设计
基于AT89C51单片机的密码锁设计摘要:前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。
本系统由AT89C51单片机系统(主要是AT89C51单片机最小系统)、4×4矩阵键盘、LCD1602显示和报警系统等组成,具有设置、修改六位用户密码、超次报警、超次锁定、密码错误报警等功能(本设计由P0口控制LCD显示,密码正确显示password ok!密码错误显示password error!超过三次输入错误自动锁定。
由P1口控制矩阵键盘含有0-9数字键和A-F功能键。
)。
除上述基本的密码锁功能外,依据实际的情况还可以添加遥控功能。
本系统成本低廉,功能实用。
关键词:单片机;密码锁;单片机设计;电子锁Electronic Lock Design with 51 Serires Single Chip ControllerAbstract:At present the use of electronic locks are mostly based on microprocessor, main devices MCU, the encoder and decoder built into software.SCM system from the system(Mainly AT89C51 microcontroller minimum system), 4×4 Matrix keyboard, LCD display and alarm system, With the settings, modify the eight user password, Ultra alarm, Ultra Lock, Password error alarm and other functions(P0 port to control the design of the LCD display, Password correctly display password ok!Password error display password error! For more than three times to enter the error automatically lock. The P1 port control keyboard matrix containing the number keys 0-9 and A-F function keys). The system cost-effective, practical functionkeywords:singlechip;cryptogram lock;singlechip design; electronics lock.目录1 绪论 (1)1.1 背景 (1)1.2 电子锁 (1)1.3 电子密码锁的特点 (1)1.4 电子密码锁的的发展趋势 (1)2 总体方案 (2)2.1 系统结构 (2)2.2 总体方案比较与论证 (3)2.3各方案比较显示方案的选择 (3)3 硬件设计 (5)3.1 单片机AT89C51简介 (5)3.2 输入键盘 (5)3.3 显示部分 (6)3.4 震荡电路 (7)4 软件设计 (7)4.1 软件设计方案 (7)4.2 软件设计总流程图 (8)4.3 具体功能软件实施 (8)4.3.1 键盘扫描 (8)4.3.2 密码修改 (11)5 调试 (12)5.1 调试前的准备 (12)5.2 硬件调试 (12)5.2.1 液晶显示模块的硬件调试 (12)5.2.2 按键测试 (13)5.3 软件调试 (13)5.4 调试心得 (14)总结 (15)参考文献 (16)致谢 (17)附录 (18)附录一、硬件原理图 (18)附录二、源程序 (18)1 绪论1.1 背景随着社会物质财富的日益增长,安全防盗已成为社会问题。
基于AT89C51单片机的电子密码锁系统设计
基于AT89C51单片机的电子密码锁系统设计作者:姜彬居小琴来源:《无线互联科技》2014年第12期摘要:随着电子技术的不断发展和电子产品的智能化进步,电子密码锁在市场各领域的运用也变得越来越广泛,对于电子密码锁相关性能的研究也具有了极其重要的意义。
本文提出的基于AT889C51单片机电子密码锁系统,采用了单片机AT89C51作为系统核心组件,并通过电源电路、矩阵电路、LCD显示电路以及报警电路构成密码锁系统,实现了安全、便捷的密码锁读取功能,确保了密码锁的安全,具有较高的市场推广价值。
关键词:AT89C51单片机;电子密码锁;C语言电子密码锁在当前市场运用较为广泛,其主要通过对外接密码输入来实现对系统或电路的控制,并进一步控制系统机械开关的操作。
相关电子产品通过系统编程控制能够以电子密码锁的形式来实现系统的开关,尤其是对机械产品而言具有较高的安全性与可靠性。
本文提出的电子密码锁系统设计主要以AT89C51单片机为基础,通过矩阵式键盘、LCD显示、蜂鸣器以及二极管等部件组成主系统。
该系统设计编程方便、操作性强、具有较高的实用性,且耗能较低,在市场具有广阔的应用范围。
1 电子密码锁的总体设计本设计采用了AT89C51单片机电子锁系统,进行初始化设置,启动密码锁功能,密码输入显示屏幕采用了七段数码管半导体发光器件。
该系统的总电系统控制指令通过单片机进行实现,单片机根据实际操作情况分配部件工作内容,程序操作性强、方便简洁。
在用户输入密码过程中,单片机将会采用矩阵按键布局模式记录当前输入密码,并将该密码与系统设置密码进行比对,若密码匹配则开启密码锁,若密码错误则需要用户按下删除键重新输入密码。
当用户输入密码错误次数超过3次,电子密码锁将会自动锁定,需要用户切换管理员模式输入管理员密码才可解锁当前状态,并重新输入解锁密码。
2 电子密码锁的模块设计电子密码锁模块由系统主控模块、键盘输入模块、显示模块、声音控制模块、报警电路模块组成。
基于89c51电子密码锁设计报告
目录1设计任务 (2)2设计方案 (2)2.1任务分析 (2)2.2方案设计 (2)3系统硬件设计 (4)3.1键盘电路设计 (4)3.2 LCD电路设计 (6)3.3 开锁电路设计 (7)3.4 报警电路设计 (8)4系统软件设计 (8)4.1键盘扫描程序设计 (9)4.2 LCD程序设计 (10)4.3 密码比较和报警程序设计 (12)5调试 (13)5.1 调试效果图 (13)6总结 (15)参考文献 (16)附录1:系统原理图 (18)附录2:程序清单 (20)1 设计任务根据所学课程《单片机微型计算机原理,应用及接口技术》设计一个基于89C51的电子密码锁,程序语言自行选择。
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替了传统的机械式密码锁,电子密码锁具有安全性高、成本低、功耗低、易操作等优点。
本次基于89c51设计的电子密码锁,应具有以下基本功能:1,该电子密码锁能实现开锁功能2,该电子密码锁能实现超时报警功能3,该电子密码锁能实现修改用户密码功能2 设计方案2.1任务分析根据设计要求,电子密码锁可以有数字电路控制完成,还可以由采用一种是用以AT89S51为核心的单片机控制方案。
相比之下,单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。
2.2方案设计采用一种是用以AT89S51为核心的单片机控制方案。
利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。
具体方案如图2.1。
图2.1单片机控制方案本方案采用一种是用以89S51为核心的单片机控制方案。
基于AT89C51的电子密码锁源程序
uchar key_tran()
{
switch(w)
{
case 0xEE: return(tab[0]);break;
case 0xED: return(tab[1]);break;
case 0xEB: return(tab[2]);break;
LCD_write_string(" error!!!");
ErrFlag=1; // 错误标志判断
w=0xff;
while(w==0xff)
{
key_pro();
void SetCode() //进入系统设置密码
{
bit ErrFlag=1;
uchar i;
while(ErrFlag)
{
num=0;
Sendcom_1602(0x01); //清除LCD的显示内容
Sendcom_1602(0x80);//定在第一行
w=(w1|w2);
while(key!=0xf0);//等待释放按键
}
else
w=0xff;
}
/********************************************************************************************/
w=0xff;
while(w==0xff)
{
key_pro();
}
break;
}
}
}
{
Sendcom_1602(0x01); //清除LCD的显示内容
Sendcom_1602(0x80);//定在第一行
基于AT89C5的电子密码锁设计设计7806248
基于AT89C5的电子密码锁设计设计7806248基于单片机的电子密码锁设计摘要本次设计使用AT89C51实现一基于单片机的电子密码锁。
本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。
系统能完成开锁、超次锁定、修改用户密码基本的密码锁的功能。
除上述基本的密码锁功能外,还具有温度显示、时间显示等功能,依据实际的情况还可以添加遥控功能。
本系统成本低廉,功能实用。
关键词:单片机AT89C51 LED显示矩阵键盘自动报警目录1引言 (1)2方案的比较与论证 (2)3系统模块电路的设计 (4)3.1系统总框图 (4)3.2系统的模块电路设计 (4)3.2..1单片机的最小系统模块 (4)3.2..2波形产生模块 (5)3.2..3键盘模块 (8)3.2..4显示模块 (9)3.2..5电源模块 (11)3.2..6温度检测模块设计 (13)3.2..7开锁电路和报警电路模块 (14)4系统的软件设计 (15)4.1软件设计思路 (15)4.2系统主流程图 (15)5总结 (16)6致谢 (18)7参考文献 (18)8附录 (19)1引言目前,最常用的锁是20世纪50年代意大利人设计的机械锁,其机构简单、使用方便、价格便宜。
但在使用中暴露了很多缺点:一是机械锁是靠金属制成的钥匙上的不同齿形与锁芯的配合来工作的。
据统计,每4000把锁中就有两把锁的钥匙齿牙相同或类似,故安全性低。
二是钥匙一旦丢失,无论谁捡到都可以将锁打开。
三是机械锁的材料大多为黄铜,质地较软,容易损坏。
四是机械锁钥匙易于复制,不适于诸如宾馆等公共场所使用。
由于人们对锁的安全性,方便性等性能有更高的要求,许多智能锁也相继问世,但这类产品的特点是针对特定指纹或有效卡,但能适用于保密要求高且仅供个别人使用的箱、柜、房间,其成本一般较高,在一定程度上限制了这类产品的普及和推广。
随着人们生活水平的提高,电子密码防盗锁作为防盗卫士的作用日趋重要。
基于at89c51密码锁毕业设计
基于at89c51密码锁毕业设计篇一:基于AT89C51密码锁毕业设计江阴职业技术学院毕业论文课题:电子密码锁的设计与仿真专业电子信息工程学生姓名顾晓涛班级 09电子(1)班学号 09030509指导教师包军卫完成日期 XX年12月16号摘要在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。
随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。
随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。
但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。
而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。
加上其成本较高,一定程度上限制了这类产品的普及和推广。
鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。
基于以上思路,本次设计使用ATMEL公司的AT89C51实现一基于单片机的电子密码锁的设计,其主要具有如下功能:(1)设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。
(2)密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。
基于AT89C51的电子密码锁设计_毕业设计1 精品推荐
基于单片机的电子密码锁设计摘要本次设计使用AT89C51实现一基于单片机的电子密码锁。
本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。
系统能完成开锁、超次锁定、修改用户密码基本的密码锁的功能。
除上述基本的密码锁功能外,还具有温度显示、时间显示等功能,依据实际的情况还可以添加遥控功能。
本系统成本低廉,功能实用。
关键词:单片机AT89C51 LED显示矩阵键盘自动报警目录1引言 (1)2方案的比较与论证 (2)3系统模块电路的设计 (4)3.1系统总框图 (4)3.2系统的模块电路设计 (4)3.2..1单片机的最小系统模块 (4)3.2..2波形产生模块 (5)3.2..3键盘模块 (8)3.2..4显示模块 (9)3.2..5电源模块 (11)3.2..6温度检测模块设计 (13)3.2..7开锁电路和报警电路模块 (14)4系统的软件设计 (15)4.1软件设计思路 (15)4.2系统主流程图 (15)5总结 (16)6致谢 (18)7参考文献 (18)8附录 (19)1引言目前,最常用的锁是20世纪50年代意大利人设计的机械锁,其机构简单、使用方便、价格便宜。
但在使用中暴露了很多缺点:一是机械锁是靠金属制成的钥匙上的不同齿形与锁芯的配合来工作的。
据统计,每4000把锁中就有两把锁的钥匙齿牙相同或类似,故安全性低。
二是钥匙一旦丢失,无论谁捡到都可以将锁打开。
三是机械锁的材料大多为黄铜,质地较软,容易损坏。
四是机械锁钥匙易于复制,不适于诸如宾馆等公共场所使用。
由于人们对锁的安全性,方便性等性能有更高的要求,许多智能锁也相继问世,但这类产品的特点是针对特定指纹或有效卡,但能适用于保密要求高且仅供个别人使用的箱、柜、房间,其成本一般较高,在一定程度上限制了这类产品的普及和推广。
随着人们生活水平的提高,电子密码防盗锁作为防盗卫士的作用日趋重要。
电子密码防盗锁用密码代替钥匙,不但省去了佩戴钥匙的烦恼,也从根本上解决了普通门锁保密性差的缺点。
基于AT89C51的密码锁设计
基于AT89C51的密码锁设计作者:孙韩来源:《智能计算机与应用》2015年第04期摘要:本文采用ATMEL公司的AT89C51 MCU为主控芯片,开发设计了E2PROM、晶振、矩阵按键键盘、报警、开锁等外围功能模块,用C语言编写了系统主控程序和各功能模块执行程序,完成了电子密码锁控制系统硬件设计、软件编程和系统调试。
该密码锁控制系统密码6~12位长度可变、可反复修改;密码编码量大,安全性能高;能实现智能上锁、开锁;具备防试探性密码输入开锁,误码报警等功能。
有一定的学术和应用价值。
关键词:密码锁;AT89C51 MCU;报警;矩阵键盘中图分类号: TP391 文献标志码: A 文章编号:2095-2163(2015)04-The Design of Combination Lock based on AT89C51 MCUSUN Han(School of Electronic Information Engineering, Anhui University, Hefei 230601, China)Abstract: This paper adopts AT89C51 MCU as main control chip of ATMEL company,develops and designs E2PROM chips, the crystals, matrix keyboard, alarm, lock and unlock,and other peripheral function module. After that, the paper also uses the C language to write the program of the master control system and each function module, completes the hardware design of control system, software programming and debugging of electronic combination lock. The well-designed password length can be 6 ~ 12, and can be changed; Large amount of password code,safety performance is high; To realize intelligent lock and unlock; Had prevent tentative password input, Password input error reporting alarm, etc. The design in this paper has high academic and application value.Key word: Combination Lock; AT89C51 MCU; Alarm; Matrix Keyboard传统机械锁具由于机构简单、安装便捷、价格便宜、使用方便等特点,在家庭门锁中占据绝对优势。
毕业设计-基于AT89C51单片机的电子密码锁的设计
毕业设计(论文)题目:电子密码锁的设计学院:电气与信息工程学院专业:电子信息工程姓名:学号: ********* 指导老师:**完成时间: 2013年5月28日摘要随着经济社会发展,人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出。
传统的机械锁,由于其构造简单,安全性能低,无法满足人们的需要。
随着电子产品向智能化和微型化的不断发展,数字密码锁作为防盗卫士的作用显得尤为重要。
而单片机以其实用,功能强大,价格低廉等功能,已成为电子产品研制和开发中首选的控制器。
本文从经济实用的角度出发,阐述一个基于单片机的液晶显示电子密码锁的设计与实现。
系统采用ATMEL公司的AT89C51单片机作为系统核心,液晶显示器LCD1602作为输出设备显示系统提示信息,4*4矩阵键盘作为输入设备,CMOS串行E2PROM存储器AT24C02作为数据存储器,配合蜂鸣器、继电器等电路构成整个系统硬件;系统软件采用C语言编写。
设计的系统液晶显示,密码修改方便,具有报警、锁定等功能,使用便捷简单,符合住宅、办公用锁需求,具有一定的实用价值。
关键词:单片机,密码锁,AT89C51,LCD1602,AT24C02AbstractWith the development of our society and the i mprovement of people’s living standard, how to ensure the family security is becoming more and more important in particular. Traditional mechanical lock is unable to meet the need of us because of its simple structure and low security. Nowadays, electronic products become smarter and smaller, electronic password anti-theft lock plays a more important role as the security guards. The MCU with its practical, strong function, low price and other functions , has become the preferred controller in electronic product research and development.This article is written from the economic perspective, elaborates the design and implementation of a LCD electronic password anti-theft lock which is based on MCU. This system is composed of AT89C51 which is designed as the core of this system, LCD1602 as the output device to display the message of this system, 4 * 4 matrix keyboard as the input device, a CMOS serial E2PROM AT24C02 as the data storage, and a buzzer, relay circuit.The software of the system is written in C language. The system displays in a LCD, it can change password easily, and has the function of alarming, locking, and so on. This system has some practical value, and it is simple and easy to use, meets the demand of residential and the need of office lock.Key Words: MCU, Password-Lock, AT89C51, LCD1602, AT24C02目录摘要 (I)Abstract ............................................................................................................................. I I 目录 ................................................................................................................................. I II 1引言 . (1)1.1课题的背景和意义 (1)1.2课题的研究现状 (1)1.3课题研究内容 (2)2 数字密码锁总体设计 (3)2.1 系统方案论证 (3)2.1.1 采用数字电路的设计方案 (3)2.1.2 采用以单片机为核心设计方案 (4)2.2 基于单片机的数字密码锁的设计原理 (5)3 系统硬件设计 (6)3.1 主要元器件介绍 (6)3.1.1 主控芯片AT89C51的的介绍 (6)3.1.2 继电器的介绍 (9)3.1.3 存储芯片AT24C02的介绍 (10)3.1.4 LCD1602显示器的介绍 (10)3.1.5 矩阵键盘模块的介绍 (11)3.2 系统硬件部分 (12)3.2.1 系统电源部分 (12)3.2.2 键盘输入部分 (13)3.2.3 密码存储部分 (14)3.2.4 显示部分 (14)3.2.5 报警部分 (15)3.2.6开锁部分 (16)4 系统软件设计 (17)4.1 系统程序流程图 (17)4.1.1主程序流程图 (17)4.1.2 键功能程序流程图 (18)4.1.3 修改密码程序流程图 (19)4.1.4 开锁程序流程图 (20)4.2 子程序举例 (21)4.2.1 按键扫描子程序 (21)4.2.2 显示子程序 (22)4.2.3 开锁子程序 (22)4.3 系统软件调试及结果 (24)4.3.1 Proteus软件介绍 (24)4.3.2 系统软件调试 (25)4.3.3 仿真结果 (25)5 硬件系统制作及调试 (29)5.1焊接注意事项 (29)5.2硬件调试问题及解决办法 (30)5.3硬件调试效果 (31)总结 (34)致谢 (35)参考文献 (36)附录 (37)附录A 电路原理图 (37)附录B 系统总体程序 (38)1引言1.1课题的背景和意义随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤为突出,传统的机械锁由于其构造简单,被撬的事件屡见不鲜。
应用AT89C单片机设计电子密码锁
应用AT89C单片机设计电子密码锁1. 本文概述随着现代科技的发展,电子密码锁因其安全、便捷的特性在各个领域得到了广泛应用。
本文旨在探讨如何利用AT89C单片机设计一种高效、可靠的电子密码锁系统。
文章将介绍AT89C单片机的基本特性及其在电子密码锁设计中的优势。
接着,我们将详细阐述电子密码锁的系统设计,包括硬件设计(如键盘输入、显示模块、存储模块等)和软件设计(如密码验证算法、系统安全机制等)。
文章还将讨论系统的测试与优化过程,确保设计的电子密码锁在实际应用中具备良好的性能和稳定性。
本文将总结AT89C单片机在电子密码锁设计中的应用,并对未来的发展趋势进行展望。
2. 89单片机概述定义与背景:AT89C单片机是一种基于Intel 8051微控制器架构的微控制器,由Atmel公司生产。
它广泛应用于工业控制、消费电子、汽车电子等领域。
特点:AT89C单片机以其高性能、低功耗、可编程性和高可靠性而著称。
它集成了多种功能,包括定时器计数器、串行通信接口、中断系统等。
中央处理单元(CPU):介绍CPU的结构和性能,如处理速度、指令集等。
存储器组织:详细描述内置的ROM、RAM结构及其在程序存储和数据存储中的应用。
输入输出(IO)端口:阐述IO端口的配置和使用方法,以及它们在电子密码锁设计中的角色。
控制核心:解释AT89C单片机如何在电子密码锁系统中充当控制核心,处理输入信号、执行密码比对和驱动输出设备。
系统集成:探讨如何利用AT89C单片机的集成功能(如定时器、中断系统)来增强电子密码锁的性能和安全性。
编程与定制:强调AT89C单片机的可编程性,以及如何通过编程实现密码锁的特定功能和定制需求。
总结AT89C单片机的重要性:强调AT89C单片机在电子密码锁设计中的关键作用,及其在现代电子系统中的广泛应用前景。
3. 电子密码锁系统设计电子密码锁系统的设计主要围绕AT89C单片机展开,通过结合适当的硬件电路和软件编程,实现安全、可靠的密码锁功能。
基于89c51电子密码锁设计
目录1设计任务 (2)2总体方案设计 (3)2.1硬件组成 (3)2.2 方案论证 (7)2.3 总体方案 (7)3硬件电路设计 (8)3.1晶振电路 (8)3.2复位电路 (9)3.3显示电路 (10)4系统设计 (13)4.1主程序设计 (13)4.2键盘子程序图 (14)4.3 密码设置软件设计 (15)4.4开锁软件设计 (16)5调试 (18)5.1 硬件调试 (18)5.2 软件调试 (18)6总结 (19)参考文献 (19)附录1:系统原理图 (24)附录2:程序清单 (25)1设计任务根据所学课程《单片机微型计算机原理,应用及接口技术》设计一个基于89C51的电子密码锁设计,程序语言自行选择。
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。
其性能和安全性已大大超过了机械锁。
日常生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
目前门锁主要用弹子锁,其钥匙容易丢失;保险箱主要用机械密码锁,其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。
针对这些锁具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
由于电子器件所限,以前开发的电子密码锁,其种类不多,保密性差,最基本的就是只依靠最简单的模拟电子开关来实现的,制作简单但很不安全,在后为多是基于EDA来实现的,其电路结构复杂,电子元件繁多,也有使用早先的20引角的2051系列单片机来实现的,但密码简单,易破解。
随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了真真的电子加密,用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码锁。
基于89C51电子密码锁设计程序
/*连接线图:---------------------------------------------------| LCM-----51 | LCM-----51|LCM------51 || ----------------------------------------------- || DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 || DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 || DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 || DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |---------------------------------------------------接口说明:1. P1口: 4x4矩阵键盘2. P2.4 工作指示灯3. P2.5 继电器控制端4. P3.7 蜂鸣器控制端5. P3.3 24c02时钟端SCL6. P3.4 24c02数据端SDA/*接盘按键说明:--------------------------------------------------| 1 | 2 | 3 | A |- - - - - - - - - - - - -| 4 | 5 | 6 | B |- - - - - - - - - - - - -| 7 | 8 | 9 | C |- - - - - - - - - - - - -| * | 0 | # | D |--------------------------------------------------[注:AT89S51使用12M晶振]==========================定义与申明=============================================================*/#include "regx52.h"#include "string.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int//*********** 引脚定义引脚#define LCM_RS P2_0 // 数据/命令选择信号#define LCM_RW P2_1 // 读/写选择信号#define LCM_E P2_2 // 使能信号#define WLED P2_4 // 工作指示灯#define REL P2_5 // 继电器#define BELL P3_7 // 蜂鸣器#define SCL P3_3 // 模拟I2C串行时钟控制#define SDA P3_4 // 模拟I2C串行数据传输#define LCM_Data P0 // 显示数据端口#define AddWr 0xa0 // "1010 0000B"器件地址选择及写标志#define AddRd 0xa1 // "1010 0001B"器件地址选择及读标志//控制字格式:/*- - - - - - - - - - -1 0 1 0 A2 A1 A0 R/W- - - - - - - - - - - *//*注:1. 前4位为I2C总线特征编码:10102. A2 A1 A0为24c02的地址3. R/W=0:表示写入;R/W=1:表示读出*///*********** 变量定义#define Busy 0x80 // 用于检测LCM状态字中的Busy标识uchar Count,num; // 计数器uint con_30m; // 30min计数器uchar con_20s; // 10s计数器bit flag,mark,sign,mark0;// 常用标志位bit flag1; // Choice_menu()调用标志bit signx; // 循环标志bit markx;//************ 数组定义uchar code O_Password[]={0x30,0x30,0x30,0x30,0x30,0x30};// 原始密码"000000"uchar data N_Password[]={0x00,0x00,0x00,0x00,0x00,0x00};// 新密码uchar data T_Password[]={0x00,0x00,0x00,0x00,0x00,0x00};// 输入密码暂存//*********** 函数声明void Start(void); // 开始总线函数void Stop(void); // 结束总线函数uchar Read(void); // 读一字节数据bit Send(uchar Data);// 发送一字节数据uchar ReadCurrent(uchar Address);// 从指定处读出一字节void WriteCurrent(uchar Data,uchar Address);// 在指定地址处写入一字节void ReadFromROM(uchar Data[],uchar Address,uchar Num);// 从指定地址读出Num个数据void WriteToROM(uchar Data[],uchar Address,uchar Num); // 从指定地址写入Num个数据uchar ReadStatusLCM(void); // 读状态void LCMInit(void); // LCM初始化void WriteDataLCM(uchar WDLCM); // 写数据void WriteCommandLCM(uchar WCLCM,BuysC); // 写指令void DisplayOneChar(uchar X, uchar Y, uchar DData); // 按指定位置显示一个字符void DisplayListChar(uchar X, uchar Y, uchar code *DData); // 按指定位置显示一串字符void PasswordComparison(bit mark);//密码比较void Scan_starnumber(void);void Delay5Ms(void); // 5ms延时void Delay400Ms(void); // 400ms延时void Delay1s(void); // 1s延时void Delay_bell(void); // 蜂鸣器发音延时void DelayMs(uchar ms); // 延时uchar Key_scan(void); // 按键扫描uchar Key_switch(void); // 按键转换函数void Choice_menu(void); // 选择菜单界面void Reset_success(void); // 复位成功提示void Pass_face(void); // 密码输入提示void Password_OK(void); // 密码输入正确提示void Welcome_face(void); // 欢迎界面void Password_ERROR(void); // 密码输入错误提示void Password_importation(void); // 密码输入void NewPassword_face(void); // 输入新密码提示void NewPassword_again(void); // 再次输入新密码提示void NewPassword_set(void); // 新密码输入void NewPassword_set_again(void); // 再次输入新密码void Newpassword_OK(void); // 新密码设置成功提示void Newpassword_ERROR(void); // 新密码设置失败提示void Newpassword_comparison(void); // 新密码设置比较void Beep(void); // 蜂鸣器发音void Led_hint(void); // LED工作指示//========================================== 主函数部分==================================================/*****************************************************函数名:void clearmen(void)功能:系统初始化说明:对系统用的标志位和定时器进行初始化入口参数:无返回值:无*****************************************************/void clearmen(void){flag1= 1; // Choice_menu()调用标志signx= 1; // 循环标志flag = 1; // 调用输入新密码提示标志位mark = 1; // 循环标志位markx= 1;num = 0; // 按键错误计数器WriteToROM(O_Password,0,6);TH0=0x3C;TL0=0xB0; // 50ms定时初值TH1=0x3C;TL1=0xB0; // 50ms定时初值TMOD=0x11;ET0=1;TR0=0;ET1=1;TR1=0;EA=1;}/*****************************************************函数名:main()功能:主函数说明:对按键和显示进行控制入口参数:无返回值:无*****************************************************/void main(void){uchar Key_value;Delay400Ms(); // 启动等待,等LCM讲入工作状态LCMInit(); // LCM初始化Delay400Ms();clearmen(); // 系统初始化while(1){P1=0xf0;if(((P1&0xf0)!=0xf0)&(flag1==1)&(num<3)) // 有键按下{Key_value=Key_switch(); // 按键扫描if(Key_value!=0) // 的确有键按下{Choice_menu(); // 调用选择程序flag1=0; // Choice_menu()调用标志signx=1; // 循环标志}while(signx==1){TR0=0; // 定时器0关,从先开始计时TR0=1; // 定时器0开P1=0xf0; // P1口赋值,从而判断有无按键if((P1&0xf0)!=0xf0){Key_value=Key_switch(); // 按键扫描if(Key_value==65) // 如果按键是"A",则输入密码{markx=1; // 显示密码输入正确或错误提示while(mark==1){Password_importation(); // 密码输入}flag1=1; // Choice_menu()调用标志signx=0; // 循环标志}if(Key_value==66) // 如果按键是"B",则输入新密码{markx=0; // 不显示密码输入正确或错误提示while(mark==1) // 输入前比较秘密,密码正确进入新密码设置{ // 密码错误退出密码设置Password_importation(); // 密码输入}//-------------------------------if(mark0!=0) // mark0=1:密码比较正确可以输入新密码{ // mark0=0:密码比较错误不能输入新密码mark=1; // 进入循环标志while(mark==1){NewPassword_set(); // 新密码设置函数}mark=1; // 进入循环标志while(mark==1){NewPassword_set_again(); // 再次输入密码}}flag1=1; // Choice_menu()调用标志signx=0; // 循环标志mark0=1;flag= 1;}if(Key_value==67) // 如果按键是"C",则密码复位{markx=0; // 不显示密码输入正确或错误提示mark=1; // 进入循环标志while(mark==1){Password_importation();}if(mark0!=0){Reset_success();Delay1s();Delay1s();WriteToROM(O_Password,0,6);sign=0;WriteCurrent((uchar)sign,10); // 存入标志位Reset_success();}}}}}else{Welcome_face(); // 欢迎界面mark = 1; // 循环标志mark0= 0; // 是否输入新密码标志位flag1=1; // Choice_menu()调用标志WriteCommandLCM(0x0C,1); // 关光标显示sign=(bit)ReadCurrent(10); // 密码比较标志位}if(num==3) // 3次输入错误密码,系统锁定30min{ET1=1;TR1=1; // 开定时器T1,定时30分钟}}}//================================================= 24c02部分函数========================================/*****************************************************函数名:void Start(void)功能:开始总线函数说明:启动I2C总线,即发送I2C起始条件入口参数:无返回值:无*****************************************************/void Start(void){SDA = 1; // 发送起始条件的数据信号SCL = 1;_nop_();_nop_();SDA = 0; // 发送起始信号_nop_(); // 起始条件锁定时间大于4us_nop_();_nop_();_nop_();SCL = 0; // 钳住I2C总线准备发送或接受数据}/*****************************************************函数名:void Stop(void)功能:结束总线函数说明:结束I2C总线,即发送I2C结束条件入口参数:无返回值:无*****************************************************/void Stop(void){SDA = 0; // 发送结束条件的数据信号_nop_();_nop_();SCL = 1; // 发送I2C总线结束信号_nop_(); // 结束条件锁定时间大于4us_nop_();_nop_();_nop_();SDA = 1;}/***************************************************** 函数名:bit Send(uchar Data)功能:发送一字节数据说明:向24c02中写入数据入口参数:Data返回值:无*****************************************************/ bit Send(uchar Data){uchar i;bit ack_bit;for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(Data & 0x80);_nop_();SCL = 1;_nop_();_nop_();SCL = 0;Data <<= 1;}SDA = 1; // 读取应答_nop_();_nop_();SCL = 1;_nop_();_nop_();_nop_();_nop_();ack_bit = SDA;SCL = 0;return ack_bit; // 返回A T24Cxx应答位}/*****************************************************函数名:void WriteCurrent(uchar Data,uchar Address)功能:在指定地址Address处一个数据Data说明:在指定地址处写入一字节的数据入口参数:Data,Address返回值:无*****************************************************/ void WriteCurrent(uchar Data,uchar Address){Start();Send(AddWr);Send(Address);Send(Data);Stop();DelayMs(10); // 写入周期}/*****************************************************函数名:void WriteToROM(uchar Data[],uchar Address,uchar Num) 功能:在指定地址Address处写入Num个数据Data[]说明:在指定地址处写入一字节的数据入口参数:Data[],Address,Num返回值:无*****************************************************/ void WriteToROM(uchar Data[],uchar Address,uchar Num){uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(AddWr);Send(Address+i);Send(*(PData+i));Stop();DelayMs(10); // 写入周期}}/*****************************************************函数名:uchar Read(void)功能:读一字节数据说明:从24c02中读出数据入口参数:无返回值:Read_data*****************************************************/ uchar Read(void){unsigned char i,Read_data;Start();Send(AddRd);for(i = 0; i < 8; i++){SCL = 1;Read_data <<= 1;Read_data |= (uchar)SDA;SCL = 0;}Stop();return(Read_data);}/*****************************************************函数名:uchar ReadCurrent(uchar Address)功能:从指定地址读一字节数据说明:从24c02中读出数据入口参数:Address返回值:Read()*****************************************************/ uchar ReadCurrent(uchar Address){Start();Send(AddWr);Send(Address);return Read();}/*****************************************************函数名:void ReadFromROM(uchar Data[],uchar Address,uchar Num) 功能:从24C02中读出一字节的数据说明:在指定地址读取入口参数:Data[],Address,Num返回值:无*****************************************************/void ReadFromROM(uchar Data[],uchar Address,uchar Num){uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(AddWr);Send(Address+i);*(PData+i)=Read();}}//========================================== 密码控制部分==================================================/*****************************************************函数名:void Newpassword_comparison(void)功能:第二次输入密码比较说明:对第一次输入的密码与第二次输入的密码进行比较入口参数:无返回值:无*****************************************************/void Newpassword_comparison(void){uchar Number=0;while((T_Password[Number]==N_Password[Number])&(Number<6))// 密码比较{Number++; // 计数值加1}if(Number>=6) // 密码正确{Newpassword_OK(); // 新密码设置成功提示WriteToROM(T_Password,0,6); // 密码设置成功,则把密码存入24c02中sign =1; // 比较新密码标志WriteCurrent((uchar)sign,10); // 存入标志位Delay400Ms();Beep(); // 正确提示音Delay400Ms();Beep();mark=0;}else // 密码错误,报警{Newpassword_ERROR(); // 新密码设置失败提示num=0;sign =0; // 比较旧密码标志Delay400Ms();Beep();Beep();Beep(); // 错误提示音Delay400Ms();Beep();Beep();Beep();Delay1s(); // 延时1smark=0;}}/*****************************************************函数名:void NewPassword_set_again(void)功能:第二次输入密码说明:第二次输入密码并存入暂存器,再调用比较程序入口参数:无返回值:无*****************************************************/void NewPassword_set_again(void){bit sign1;uchar key_data;P1=0xf0; // 判断是否有键按下if(flag==1){NewPassword_again(); // 显示密码输入界面Delay400Ms();flag=0; // 调用输入新密码提示标志位Count=0; // 按键次数计数器置0Delay400Ms();}if((P1&0xf0)!=0xf0) // 判断是否有键按下{key_data=Key_switch(); // 调用按键转换程序if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data !=42)){//按键不能为数字(0~9)以外.A B C D # *Count++; // 按键次数器加1Led_hint(); // 按键指示Beep(); // 按一下键发一音sign1=1; // 有键按下标志位}}if((sign1==1)&(flag==0)) // 有键按下{Scan_starnumber(); // 在密码显示区显示" ****** "sign1=0; // 按键标志位清0T_Password[Count-1]=key_data; // 按键值放入密码暂存器}if(Count==6) // 6次按键则进行密码比较{Count=0; // 计算清0,从先计数flag =1; // 调用输入新密码提示标志位mark =0; // 循环标志位WriteCommandLCM(0x0C,1); // 关光标显示Newpassword_comparison(); // 新密码设置比较}}/*****************************************************函数名:void NewPassword_set(void)功能:新密码设置说明:修改密码入口参数:无返回值:无*****************************************************/void NewPassword_set(void){bit sign1;uchar key_data;P1=0xf0; // 判断是否有键按下if(flag==1){NewPassword_face(); // 显示密码输入界面flag=0; // 调用输入新密码提示标志位Count=0; // 按键次数计数器置0Delay400Ms();}if((P1&0xf0)!=0xf0) // 判断是否有键按下{key_data=Key_switch(); // 调用按键转换程序if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data !=42)){//按键不能为数字(0~9)以外.A B C D# *Count++; // 按键次数器加1Led_hint(); // 按键指示Beep(); // 按一下键发一音sign1=1; // 有键按下标志位}}if((sign1==1)&(flag==0)) // 有键按下{Scan_starnumber(); // 在密码显示区显示" ****** "sign1=0; // 按键标志位清0N_Password[Count-1]=key_data; // 按键值放入密码暂存器}if(Count==6) // 6次按键则进行密码比较{Count=0; // 计算清0,从先计数flag =1; // 调用输入新密码提示标志位mark =0; // 循环标志位WriteCommandLCM(0x0C,1); // 关光标显示}}/*****************************************************函数名:void Password_importation(void)功能:密码输入说明:输入密码并调用密码比较函数进行比较入口参数:无返回值:无*****************************************************/void Password_importation(void){bit sign1;uchar key_data;P1=0xf0; // 判断是否有键按下if(((P1&0xf0)!=0xf0)&(flag==1)) // 有键按下,且是第一次{key_data=Key_switch();if(key_data!=0){Pass_face(); // 显示密码输入界面Delay400Ms();flag=0; // 调用密码输入提示标志位Count=0; // 输入密码个数计数器置0Delay400Ms();}}if((P1&0xf0)!=0xf0) // 判断是否有键按下{key_data=Key_switch(); // 调用按键转换程序if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data !=42)){//按键不能为数字(0~9)以外.A B C D # *Count++; // 按键次数器加1Led_hint(); // 按键指示Beep(); // 按一下键发一音sign1=1; // 有键按下标志位}}if((sign1==1)&(flag==0)) // 有键按下{Scan_starnumber(); // 在密码显示区显示" ****** "sign1=0; // 按键标准位清0T_Password[Count-1]=key_data; // 按键值放入密码暂存器}if(Count==6) // 6次按键则进行密码比较{Count=0; // 计算清0,从先计数flag =1; // 调用密码输入提示标志位mark =0; // 循环标志位WriteCommandLCM(0x0C,1); // 关光标显示if(sign==0)PasswordComparison(0); // 输入按键与原始密码比较else PasswordComparison(1); // 输入按键与新密码比较}}/*****************************************************函数名:void Scan_starnumber(void)功能:显示密码位为星号说明:在密码显示区显示" ****** "入口参数:无返回值:无*****************************************************/void Scan_starnumber(void){switch(Count) // 在相应的地方显示"*"{case 1:DisplayOneChar(5,1,42);break; //-----*-----------//case 2:DisplayOneChar(6,1,42);break; //------*----------//case 3:DisplayOneChar(7,1,42);break; //-------*---------//case 4:DisplayOneChar(8,1,42);break; //--------*--------//case 5:DisplayOneChar(9,1,42);break; //---------*-------//case 6:DisplayOneChar(10,1,42);break; //----------*------//} //-----*******-----//}/*****************************************************函数名:void PasswordComparison(bit mark)功能:密码比较程序说明:对输入密码进行比较入口参数:mark:当mark=1时,对原始密码进行比较;当mark=0时,对原始密码进行比较返回值:无*****************************************************/void PasswordComparison(bit mark1){uchar Number=0;if(mark1==0) // 输入按键与原始密码比较{while((T_Password[Number]==O_Password[Number])&(Number<6)) // 密码比较{Number++; // 计数值加1}}else // 输入按键与新密码比较{ReadFromROM(N_Password,0,6);while((T_Password[Number]==N_Password[Number])&(Number<6)) // 密码比较{Number++; // 计数值加1}}if(Number>=6) // 密码正确{mark0=1; // 进入新密码设置mark=0; // 退出循环num=0; // 密码错误输入计数器置0if(markx==1){Password_OK(); // 调用密码输入正确提示函数REL=0; // 继电器开启,即密码锁开启Delay400Ms();Beep();Beep(); // 正确提示音Delay400Ms();Beep();Beep();Delay1s(); // 延时2sDelay1s();REL=1; // 继电器关闭,即密码锁开启}else{Delay400Ms();Beep();Beep(); // 正确提示音Delay400Ms();Beep();Beep();Delay1s(); // 延时2sDelay1s();}}else // 密码错误,报警{mark0=0; // 新密码输入控制位Password_ERROR(); // 调用密码输入错误提示函数Delay400Ms();Beep();Beep();Beep();Beep(); // 错误提示音Delay400Ms();Beep();Beep();Beep();Beep();Delay1s(); // 延时1smark=0; // 退出循环num++; // 密码错误输入计数器}}//======================================= 指示函数部分===============================================/*****************************************************函数名:void Led_hint(void)功能:LED工作指示程序说明:对按键及密码的输入结果进行指示入口参数:无返回值:无*****************************************************/void Led_hint(void)WLED=0;Delay400Ms();WLED=1;}/*****************************************************函数名:void Beep(void)功能:蜂鸣器发音程序说明:对密码输入正确与否、按键等的提示入口参数:无返回值:无*****************************************************/void Beep(void){BELL=0; // 灯亮Delay_bell(); // 延时BELL=1; // 灯灭Delay_bell(); // 延时}//======================================= 按键函数部分===============================================/*****************************************************函数名:uchar Key_scan(void)功能:4x4按键,按键扫描说明:对按键进行扫描,从而得到键编码入口参数:无返回值:有键按下返回:键编码=行扫描值+列扫描值;无按键返回0*****************************************************/uchar Key_scan(void){uchar key; // 存放键编码P1=0xf0; // 取高4 位值.即:列扫描值key=P1&0xf0; // 存放键编码的高4位P1=0x0f; // 取低4 位值.即:行扫描值key=(P1&0x0f)|key; // 低4位与高4位进行合并if(key!=0xff){return(key); // 有键按下,返回键编码}return(0); // 无键按下,返回0}/*****************************************************函数名:uchar Key_switch(void)功能:按键转换程序说明:对按键码进行转换入口参数:无返回值:ASCII码*****************************************************/uchar Key_switch(void){uchar key;key=Key_scan();Delay5Ms();switch(key){case 0xee:return(49);break; /* "1"键*/case 0xed:return(50);break; /* "2"键*/case 0xeb:return(51);break; /* "3"键*/case 0xe7:return(65);break; /* "A"键*/case 0xde:return(52);break; /* "4"键*/case 0xdd:return(53);break; /* "5"键*/case 0xdb:return(54);break; /* "6"键*/case 0xd7:return(66);break; /* "B"键*/case 0xbe:return(55);break; /* "7"键*/case 0xbd:return(56);break; /* "8"键*/case 0xbb:return(57);break; /* "9"键*/case 0xb7:return(67);break; /* "C"键*/case 0x7e:return(42);break; /* "*"键*/case 0x7d:return(48);break; /* "0"键*/case 0x7b:return(35);break; /* "#"键*/case 0x77:return(68);break; /* "D"键*/case 0x00:return(00);break; /* "无"键*/}}//======================================= 显示界面函数部分===============================================/*****************************************************函数名:void Reset_success(void)功能:密码复位成功说明:密码复位成功提示入口参数:无返回值:无*****************************************************/ void Reset_success(void){DisplayListChar(0,0,"Password Reset");DisplayListChar(0,1,"=== Success ===");}/***************************************************** 函数名:void NewPassword_again(void)功能:显示输入新密码界面说明:再次输入密码提示入口参数:无返回值:无*****************************************************/ void NewPassword_again(void){DisplayListChar(0,0," New_pass again ");DisplayListChar(0,1," ");WriteCommandLCM(0xc6,1); // 光标显示地址WriteCommandLCM(0x0f,1); // 显示开及光标设置WriteCommandLCM(0x10,1); // 移位控制,光标右移}/***************************************************** 函数名:void Newpassword_ERROR(void)功能:新密码设置失败说明:对新密码设置失败进行提示入口参数:无返回值:无*****************************************************/ void Newpassword_ERROR(void){DisplayListChar(0,0,"_New password_");DisplayListChar(0,1,"__Set failure__");}/***************************************************** 函数名:void Newpassword_OK(void)功能:新密码设置成功说明:对新密码设置成功进行提示入口参数:无返回值:无*****************************************************/ void Newpassword_OK(void){DisplayListChar(0,0,"_New password_");DisplayListChar(0,1,"__Set success__");}/*****************************************************函数名:void Choice_menu(void)功能:选择菜单说明:对选择功能进行提示入口参数:无返回值:无*****************************************************/void Choice_menu(void){DisplayListChar(0,0," Please choose ");DisplayListChar(0,1,"A-PW B-CRT C-RT");}/*****************************************************函数名:Welcome_face()功能:显示欢迎界面说明:开机进入欢迎界面入口参数:无返回值:无*****************************************************/void Welcome_face(void){DisplayListChar(0,0," welcome home ");DisplayListChar(0,1,"please password ");}/*****************************************************函数名:viod Pass_face(void)功能:密码输入界面说明:对密码输入进行提示入口参数:无返回值:无*****************************************************/void Pass_face(void){DisplayListChar(0,0," Input password ");DisplayListChar(0,1," ");WriteCommandLCM(0xc6,1); // 光标显示地址WriteCommandLCM(0x0f,1); // 显示开及光标显示WriteCommandLCM(0x10,1); // 移位控制,光标右移}/*****************************************************函数名:void NewPassword_face(void)功能:显示输入新密码界面说明:对输入新密码提示入口参数:无返回值:无*****************************************************/void NewPassword_face(void){DisplayListChar(0,0," Input New_pass ");DisplayListChar(0,1," ");WriteCommandLCM(0xc6,1); // 光标显示地址WriteCommandLCM(0x0f,1); // 显示开及光标设置WriteCommandLCM(0x10,1); // 移位控制,光标右移}/*****************************************************函数名:void Password_OK(void)功能:显示密码输入正确界面说明:对密码输入正确进行提示入口参数:无返回值:无*****************************************************/void Password_OK(void){DisplayListChar(0,0,"- Password OK! -");DisplayListChar(0,1,"- Welcome you! -");}/*****************************************************函数名:void Password_ERROR(void)功能:显示密码输入错误界面说明:对密码错误输入进行提示入口参数:无返回值:无*****************************************************/void Password_ERROR(void){DisplayListChar(0,0,"==== Sorry! ====");DisplayListChar(0,1,"=Password ERROR=");}//================================ LCM1602控制部分=========================================================/*****************************************************函数名:void WriteDataLCM()功能:向LCM1602中写入数据说明:将形参WDLCM中的数据写入LCM中入口参数:WDLCM返回值:无*****************************************************///写数据void WriteDataLCM(uchar WDLCM){ReadStatusLCM(); // 检测忙LCM_Data = WDLCM; // 写入数据到LCMLCM_RS = 1;LCM_RW = 0;LCM_E = 0; // 若晶振速度太高可以在这后加小的延时LCM_E = 0; // 延时LCM_E = 1;}/*****************************************************函数名:void WriteCommandLCM()功能:向LCM1602中写入指令说明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测入口参数:WCLCM,BuysC返回值:无*****************************************************///写指令void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); // 根据需要检测忙LCM_Data = WCLCM; // 写入指令LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}/*****************************************************函数名:uchar ReadStatusLCM()功能:读忙状态说明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替入口参数:无返回值:LCM_Data*****************************************************///读状态uchar ReadStatusLCM(void){LCM_Data = 0xFF; // LCM数据口先置1LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); // 检测忙信号.如果忙,则不执行return(LCM_Data); // 不忙返回读取数据}/*****************************************************函数名:void LCMInit()功能:初始化LCM1602说明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作入口参数:无返回值:无*****************************************************///LCM初始化void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0); // 0x38指令表示:8位数据显示模式,俩行多显示Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); // 显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); // 关闭显示WriteCommandLCM(0x01,1); // 显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置}/*****************************************************函数名:void DisplayOneChar()功能:按指定坐标中写入数据说明:X-横坐标,Y-纵坐标,DData为ASCII值入口参数:X,Y,DData返回值:无*****************************************************///按指定位置显示一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x01;X &= 0x0F; // 限制X不能大于15,Y不能大于1if (Y) X |= 0x40; // 当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码WriteCommandLCM(X, 0); // 这里不检测忙信号,发送地址码WriteDataLCM(DData);}/*****************************************************函数名:void DisplayListChar()功能:向指定坐标中写入字符串说明:X-横坐标,Y-纵坐标入口参数:X,Y,*DData返回值:无*****************************************************///按指定位置显示一串字符***原来的遇到空格0x20就不显示***void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength,j;ListLength = strlen(DData); // strlen:读取字符串的长度Y &= 0x1;X &= 0xF; // 限制X不能大于15,Y不能大于1if (X <= 0xF) // X坐标应小于0xF{for(j=0;j<ListLength;j++){DisplayOneChar(X, Y, DData[j]); // 显示单个字符X++; // 横坐标加1,纵坐标不变}}}//======================================= 延时函数部分===============================================/*****************************************************函数名:void DelayMs(uchar number)功能:延时函数说明:完成24c02的延时入口参数:number返回值:无*****************************************************/ //定时函数void DelayMs(uchar number){uchar i;while(number--){for(i=0;i<120;i++){;}}}/***************************************************** 函数名:void Delay5Ms()功能:5ms延时说明:软件消除按键抖动和适当的延时入口参数:无返回值:无*****************************************************/ //5ms延时void Delay5Ms(void){uint TempCyc = 5552; // 放入延时数据while(TempCyc--);}/***************************************************** 函数名:void Delay400Ms()功能:400ms延时说明:对显示进行延时入口参数:无返回值:无*****************************************************/ //400ms延时void Delay400Ms(void){uchar TempCycA = 5;uint TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/*****************************************************函数名:void Delay1s(void)功能:1s延时说明:用来控制继电器开启时间入口参数:无返回值:无*****************************************************/void Delay1s(void) // 1s延时子程序{uchar h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}/*****************************************************函数名:void Delay_bell(void)功能:蜂鸣器延时程序说明:对蜂鸣器发音延时入口参数:无返回值:无*****************************************************/void Delay_bell(void){uint i;for(i=0;i<30000;i++);}//===================================== 定时器中断部分====================================================/*****************************************************函数名:void time_intt0(void) interrupt 1功能:T0中断函数说明:按键时间超过10s时,退出按键输入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于AT89C51的电子密码锁设计
作者:周炳高美珍洪家平
来源:《电脑知识与技术》2017年第05期
摘要:本设计是基于AT89C51单片机为控制核心的密码锁设计方案。
控制核心采用单片机AT89C51,配备相应的硬件电路和烧录软件程序,可以实现密码输入及修改、报警、开关锁、信息显示以及键盘锁定等功能。
在本设计中,根据识别密码的正误来执行开锁或者报警,利用AT24C02串行存储器来修改和存储密码。
经测试,本电子锁具有可靠性高、能耗低、易操作等优点。
关键词:密码锁;AT24C02;单片机;AT89C51
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2017)05-0232-02
Abstract: This design is based on the AT89C51 microcontroller as the core of the design of the password lock. The control core using SCM AT89C51, equipped with the corresponding hardware circuit and software programming procedures, can realize the password input and modify, alarm,switch lock, information display and keyboard lock function. In this design, according to the identification code or to perform lock or alarm, using AT24C02 serial memory to modify and store passwords. After testing, the electronic lock has the advantages of high reliability, low energy consumption, easy operation, etc.
Key words: Combination lock;AT24C02;Single-chip microcomputer;AT89C51
随着社会的发展以及人们生活水平的提高,随之而来也带来了安全方面的问题。
在日常生活或单位工作中,由于住宅或部门安全措施的不足,被撬事件屡见不鲜,由此带来的个人人身财产安全方面的隐患也越来越受到众多人们的重视。
传统的机械锁因其材料简陋、结构简单、工艺技术落后,已经越发不能满足现代锁所要求的安全性能了。
于是安全系数高、易于操作的电子密码锁应运而生,并且伴随着技术的发展,电子密码锁正向着多功能化发展。
电子密码锁是一种通过输入密码来访问控制系统,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
无论是从锁的可靠性还是安全性来看,电子密码锁都是远远超过了传统的机械锁。
目前最常见的电子密码锁有遥控式和键盘式两类,本设计从成本、功耗、易操作等角度综合考虑,采用键盘式电子密码锁。
1系统总体设计
本系统设计主体上是由单片机、时钟电路、掉电储存模块、LCD显示模块、复位电路、矩阵键盘、警报机构以及开锁机构构成。
其中,主控单元采用AT89C51单片机,显示单元采用LCD1602液晶显示屏,主输入单元采用矩阵键盘,存储单元采用电可擦除存储器
AT24C02,警报机构采用蜂鸣器,发光二极管代替开锁机构完成整个系统设计。
系统总体结构框图如图1所示:
2系统硬件设计
本设计需要用到的元器件主要包括:单片机AT89C51、电可擦除存储器AT24C02、液晶显示屏LCD1602、4行4列式矩阵键盘、蜂鸣器以及发光二极管等。
在Proteus软件中系统硬件电路仿真图如图2所示:
在本次系统硬件电路设计中,单片机AT89C51的四个端口是做出如下分配的:P0端口首先接一个上拉电阻,然后再与LCD1602液晶显示屏的八位双向数据端D0~D7口相连接;P2端口分成两个部分,P2.0~P2.2口是与LCD1602液晶显示屏的4~6引脚相连接,余下的P2.5与P2.6口和电可擦除存储器AT24C02相连接;P1和P3端口比较简单,P1端口直接与4×4矩阵键盘相连接,P3端口直接用作于警报电路和开锁电路的接口。
2.1矩阵键盘设计
单片机AT89C51的P1端口与4×4矩阵键盘相连接,其中,P1.0~P1.3口和P1.4~P1.7口分别是作为4×4矩阵键盘的行输出口和列输出口。
行与列输出口是不相互连接的,有按键被按下时,相对应的行与列才能相互连接。
当程序算法一定时,每个按键的行值和列值也是固定且互异的,当按下按键时,通过逐行扫描,读出I/O口的值就能确切知道被按下的键是哪一个按键。
在本设计中,数字键0~9直接对应着输入数字的0~9,功能键A为确认键,B为返回键,C为改密键,D为闭锁键,E与F不用。
2.2显示电路设计
LCD1602液晶显示屏一共拥有16个引脚,在本次系统设计中,单片机AT89C51的
P2.0、P2.1、P2.2口线分别与LCD1602液晶显示屏的4、5、6号引脚相连接,已经编写并且烧录好的程序通过控制这3个引脚实现指令或数据的写和执行,然后根据指令或数据写和执行进一步来实现LCD1602液晶显示屏的显示功能。
需要指出的是,由于LCD需要提供足够的电流才能正常工作,因此在实际的应用当中,要先在数据端口接一上拉电阻以确保液晶显示屏能正常工作。
2.3存储电路设计
AT24C02是串行E2PROM中的一种,具有I2C总线接口功能,即可以通过I2C总线接口来进行操作。
同时AT24C02也是一个有专门写保护功能的电可擦除串行存储器。
在Proteus软件的E2PROM仿真图中,单片机AT89C51的P2.5口是作为串行时钟输入线的接口,P2.6口是作为数据线的接口。
A0~A2接地,所以单片机AT89C51在写AT24C02时,地址为10100000B=0A0H;在读AT24C02时,地址为10100001B=0A1H。
当WP=0时,单片机可以进行读写操作。
3系统软件设计
本系统软件设计程序可以分为系统主程序、4×4矩阵键盘扫描子程序、LCD显示模块子程序、掉电存储子程序、定时器中断子程序、密码输入子程序以及警报子程序等。
其中,系统主程序流程图如图3所示:
3.1键盘扫描子程序
键盘识别程序的原理是单片机通过逐行扫描来判断是否有键按下,当确认有键按下时,再在该行中确认是哪一列的键被按下。
在此次系统软件设计中,单片机初始化时,P1端口的
P1.0~P1.3口赋值为0,P1.4~P1.7口赋值为1,CPU则扫描整个P1端口。
如果P1=0xf0成立,则表明没有键按下,否则就有键按下。
3.2显示模块子程序
由于本设计中要求液晶显示屏LCD1602可以显示密码输入、错误提示以及密码修改等界面信息,因此需要编写多个显示子程序来满足上述要求。
下面就列出LCD1602液晶显示屏的写数据子函数:
4系统调试与仿真
把已经编写好的C语言源程序放到Keil环境下进行编译、调试,仿真完成。
当输入密码正确时,发光二极管发光,LCD1602液晶显示屏显示欢迎回家界面。
根据图2的系统电路原理图,设计并制作出了实物硬件电路板。
经过再三检查无误后,进行了实物的试验运行。
运行的结果又再一次证明了本次系统设计中Proteus软件仿真的所有运行结果。
5结束语
出于经济适用的角度,设计出了这一款能够修改密码、输入密码错误次数过多能够自动发出警报以及能够实现机械上锁功能的电子密码锁。
经过反复多次的检测,系统各个步骤均能够按照界面上的提示正确运行。
总体上来说,此次设计虽然还有很多有待改进的地方,但大体性能指标都达到了预期要求。
经实物检验,本设计能够较好适用于家庭住宅、办公场所等位置,具有比较大的市场推广价值。
参考文献:
[1] 郭天祥.新概念51单片机C语言教程[M].电子工业出版社,2009.
[2] 赵文博,刘文涛.单片机语言C51程序设计[M].北京:人民邮电出版社,2005.
[3] 皮大熊,南光群,刘金华.单片机课程设计指导书[M].北京理工大学出版社,2010.
[4] 贾正松.单片机系统复位电路设计[J].科技资讯,2007(36):91-92.
[5] 袁新燕.浅谈单片机应用系统的调试[J].自动化与仪器仪表,2000(3):56-57.
[6] 宋锦.电子密码锁设计与调试[J].电脑知识与技术,2011(33).48-51
[7] 韩团军.基于单片机的电子密码锁设计[J].国外电子测量技术,2010(7).35-39
[8] 赵亮,侯国锐.单片机C语言编程与实例[M].北京:人民邮电出版社,2003.
[9] 袁可为.单片机控制密码锁设计[J].信息通信,2012(10):46-48.
[10] 武红玉.电子密码锁的设计[J].机械与电子,2012(10):185-187.。