基于STC89C51单片机的密码锁END
- 格式:doc
- 大小:966.50 KB
- 文档页数:35
2020年软 件2020, V ol. 41, No. 9基金项目: 甘肃农业大学学生科研训练项目SRTP(批准号:202016040)资助 作者简介: 李朋龙(1998–),男,本科生,专业:电子信息工程。
通讯联系人: 逯玉兰(1986–),女,讲师,主要研究方向:农业信息技术。
基于STC89C51单片机的电子密码锁设计李朋龙,刘秀娟,孙选辰,许纹旗,王茂清,逯玉兰*(甘肃农业大学 信息科学技术学院,甘肃 兰州 730070)摘 要: 为解决传统制锁技术无法满足安全防盗、美观简洁等需求这一问题,本文基于STC89C51单片机设计了电子密码锁系统。
该系统包括五大模块:主机模块、LCD 液晶显示器模块、按键输入模块、掉电储存模块、报警与开锁功能模块。
电子密码锁设计好坏可通过密码的输入、清除、开锁、更改等功能所完成的程度作为评判标准。
本文设计的电子密码锁具有成本低、安全性高、实用性强等优点,另外对于住宅、办公室等具有强大的适用兼容性。
因此,本系统的商业价值高。
关键词: 电子密码锁;STC89C51单片机;开锁驱动电路中图分类号: TP368.1 文献标识码: A DOI:10.3969/j.issn.1003-6970.2020.09.006本文著录格式:李朋龙,刘秀娟,孙选辰,等. 基于STC89C51单片机的电子密码锁设计[J]. 软件,2020,41(09):23 25Electronic Coded Lock of Greenhouse Based on Single Chip MicrocomputerLI Peng-long, LIU Xiu-juan, SUN Xuan-chen, XU Wen-qi, WANG Mao-qing, LU Yu-lan *(College of Information Science and Technology, Gansu Agricultural University, Lanzhou 730070, China )【Abstract 】: Traditional lock technology has been unable to meet the needs of security and theft prevention, beautiful and simple, in order to solve this problem, we based on STC89C51 MCU design electronic password lock system. The system includes host module, LCD display module, key input module, power off storage module, alarm and lock function module. The standard to judge the design of electronic password lock is the degree of password input, clearance, lock, change and other functions. Electronic code lock unique design, coupled with the lack of other anti-theft tools simple, low cost, high security, practical advantages, in addition to the residential, office for the strong compatibility, so it is very widely promoted commercial value. 【Key words 】: Electronic combination locks; STC89C51 microcontroller; Unlock the drive circuit0 引言在当今社会,如何有效安全防盗已经是一个重要的社会性问题[1]。
毕业设计(论文)基于单片机的电子密码锁设计基于单片机的电子密码锁设计摘要随着科技和人们生活水平的提高,如何实现防盗这一问题也变的尤其突出。
由于传统机械锁构造简单,被撬事件源源不断;而电子密码锁保密性高,使用灵活性好,安全系数高,所以受到了广大用户的青睐。
电子密码锁是一种通过密码输入来控制电路或芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
应用较广的电子密码锁是以芯片为核心,通过编程来实现的。
设计以STC89C51单片机作为密码监控装置和控制核心,结合键盘电路,LCD 显示电路,报警电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的基本功能。
软件设计采用自上而下的模块化思想,使系统朝着分布式、小型化方向发展,使系统的可靠扩展性和运行稳定性增加。
测试结果表明,设计各项功能已达到设计要求。
关键字:单片机;STC89C51;电子密码锁;报警Design of Electronic Combination Lock Based onSingle Chip MicrocomputerAbstractAlong with the improvement of science and technology and the living level of people, how realize to guard against theft this problem also become especially. Because of the simple construct of traditional machine lock, the affairs of theft is commonly;The electronic combination lock is safer because of its confidentiality, use flexibility is good, the safety coefficient is high, being subjected to the large custom close.The electronic combination lock is electronic products, which control the mechanical switch by the control circuit or chip when you input a password. Now the widely used electronic locks are based on the chip and achieve the function by programming.The design by single chip microcomputer STC89C51 act as the combination lock monitoring device detection and control core, combining with key circuit, LCD display circuit, an alarm circuit and unlocking mechanism, using a flexible programming design and rich I/O port of microcontroller, and its control by software program to control the whole system to realize the electronic combination lock. The design thought from top to down, to make the system toward wear distribute type, turn to the direction development of small, strengthen the system and can expand the stability and circulate. Test the result state, various functions of this system are already all request of this design.Keyword: Single Chip Microcomputer; STC89C51; Electronic Combination Lock目录摘要 (I)Abstract (II)1. 绪论 (2)2. 系统设计 (2)2.1 主控方案选择 (2)2.2 密码方案选择 (2)2.3 设计思路 (2)3. 硬件设计 (2)3.1 STC89C51单片机 (2)3.1.1 STC89C51单片机内部结构 (2)3.1.2 STC89C51单片机引脚说明 (2)3.1.3 STC89C51单片机中断系统 (2)3.1.4 STC89C51单片机内部时钟电路 (2)3.1.5 STC89C51单片机复位电路 (2)3.2 LCD1602液晶显示器 (2)3.2.1 LCD1602引脚说明 (2)3.2.2 LCD1602显示原理 (2)3.2.3 LCD1602控制指令 (2)3.2.4 LCD1602显示电路 (2)3.3 AT24C02存储芯片 (2)3.3.1 AT24C02引脚说明 (2)3.3.2 AT24C02存储电路 (2)3.4 矩阵键盘 (2)3.5 继电器 (2)3.6 电源模块 (2)3.7 其他电路 (2)3.7.1 报警电路 (2)3.7.2 独立按键电路 (2)4. 软件设计 (2)4.1 主程序流程图 (2)4.2 开锁程序流程图 (2)4.3 密码修改程序流程图 (2)5. 系统调试 (2)5.1 Keil C51调试 (2)5.1.1 Keil C51介绍 (2)5.1.2 Keil C51调试 (2)5.2 Proteus 仿真 (2)5.2.1 Proteus软件介绍 (2)5.2.2 Proteus仿真调试 (2)5.3 实物制作 (2)5.3.1 制作过程 (2)5.3.2 实物调试 (2)结论 (2)致谢 (2)参考文献 (2)附录 (2)1. 绪论科技发展和生活水平提高的同时,安全问题也随之而来,被撬事件屡见不鲜,那么如何更好的防盗呢?由于传统的机械锁抵抗不了强力破坏,制作工艺简单,技术落后,极易被开启,所以它只能保存着锁的原始意义,而与此同时涌现出一批满足人们需求的安全可靠不易被破解的电子锁。
目录1设计任务 (2)2 设计方案 (2)2.1任务分析 (2)2.2方案设计 (3)3系统硬件设计 (5)3.1晶振电路设计 (5)3.2 复位电路设计 (6)3.3 键盘电路设计 (7)3.4 显示电路设计 (8)3.5 蜂鸣器电路设计 (9)4系统软件设计 (9)4.1 系统程序设计流程图 (9)4.2 数码管显示子程序设计 (10)4.3 键盘扫描子程序设计 (12)5调试 (16)5.1 调试软件环境简介 (16)5.2 实验板调试效果图 (17)6总结 (19)参考文献 (19)附录1:系统原理图 (21)附录2:程序清单 (22)1设计任务根据所学的知识,设计一个电子密码锁,利用发光二极管的亮灭来代表锁的开闭。
随着我国现代化建设的日益完善,人们的生活水平也不断提高,家中的贵重物品自然也就越来越多。
在这样的时代背景下,如何防盗的问题也就显得尤为重要了。
传统锁具已经无法阻止窃贼的脚步了,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐。
本设计以单片机89C51作为密码锁监控装置的检测和控制核心,分为主机控制和从机执行机构(本设重点介绍主机设计),实现以下功能:1、开锁:下载程序后,输入初始密码,8位LED亮,代表锁被打开,输入密码时,六位数码管依次显示小横杠。
2、更改密码:只有当开锁(LED亮)后,该功能方可使用。
首先按下更改密码键S16,然后设置相应密码,此时六位数码管会显示设置密码对应的数字。
最后设置完六位后,按下确认键S17确认密码更改,此后新密码即生效。
3、重试密码:当输入密码时,密码输错后按下重试键S18,可重新输入六位密码。
当设置密码时,设置中途想更改密码,也可按下此键重新设置。
4、关闭密码锁:按下关闭键S19即可将打开的密码锁关闭。
5、开发板矩阵键盘上的S6—S15键分别代表数字0-9。
2设计方案2.1任务分析根据设计要求,可以用电位器来模拟温度的变化,用微控制器来控制模拟温度的测量和显示,其任务设计方案原理图如图2.1所示:图2.1 设计方案原理图2.2方案设计根据设计方案原理图,每个模块的方案设计详细内容如下。
基于AT89C51型单片机电子密码锁的设计摘要:我们的生活中,锁时一种常见的生活用品,从普通的钥匙锁到保险箱的密码锁,锁给我们的生活带来了极大地便利。
但机械式密码锁体积比较庞大不便在其他小地方使用,这时体积小而且方便快捷的密码锁就为我们解决了这个问题。
本文介绍了一个由AT89C51单片机为核心的数字电子密码锁,该密码锁通过适当的程序实现了对密码的认证的过程,通过液晶显示器显示输入过程,实现人机对话的友好界面,当输入的密码为已设定好的密码时,电子锁将会自动打开,否则系统将会提醒再次重新输入,当三次输入的密码错误系统自动报警。
在输入过程中,可通过功能键修改输入数字,具有重新输入密码的功能,方便修改误输入的数字关键词:电子密码锁,密码检验,自动报警,单片机,液晶显示目录1.目的意义 (1)2.国内外发展 (2)3.设计内容及要求 (3)4.系统的设计 (4)4.1系统设计结构图 (4)4.2系统的工作原理及说明 (4)5.系统硬件设计 (5)5.1复位以及振荡电路 (5)5.2 3X4矩阵键盘 (5)5.3报警蜂鸣器 (6)5.4液晶显示电路 (6)5.5串口输入电路图 (7)6.程序流程图 (8)7.原理图 (8)8调试与仿真 (9)9.程序 (13)10.收获与展望 (24)11对本科意见 (25)12期望成绩 (25)1.目的意义经过了一个学期单片机的的学习,通过本次课程设计,了解电子锁的基本工作原理,通过对已学习的AT89C51型单片机,熟悉AT89C51并行接口的各种工作方式和应用,并且掌握AT89C51计数器/定时器的工作方式和应用编程外部中断的方法,以及对液晶显示问题的解决。
掌握单片机的设计步骤方法,继而达到能设计单片机实际应用的目的。
2国内外进展情况目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
基于51单片机的电子密码锁设计摘要:本文设计了一种基于单片机的电子密码锁,由单片机系统、矩阵键盘、LED显示和报警系统组成。
系统能完成开锁、超次锁定、报警、修改用户密码基本的密码锁的功能。
除上述基本的密码锁功能外,还具有掉电存储、声光提示等功能。
本密码锁具有安全性高、成本低、功耗低、易操作、记住密码即可开锁等优点。
关键词:STC89C52;电子密码锁;矩阵键盘1绪论1.1 课题背景随着人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高。
锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要安全可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。
随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。
据有关资料介绍,电子密码锁的研究从20世纪30年代就开始了,在一些特殊场所早就有所应用。
这种锁是通过键盘输入一组密码完成开锁过程。
研究这种锁的初衷,就是为提高锁的安全性。
由于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以避免因钥匙被仿制而留下安全隐患。
电子锁只需记住一组密码,无需携带金属钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。
电子锁的种类繁多,例如数码锁,指纹锁,磁卡锁,IC卡锁,生物锁等。
但较实用的还是按键式电子密码锁。
1.2 课题设计目标本设计采用STC89C52单片机为主控芯片,通过软件程序组成电子密码锁系统,能够实现:(1) 密码输入错误,蜂鸣器报警。
(2) 密码为6位,可以随意更改,(3) 采用矩阵按键输入。
(4) 通过LCD1602液晶显示。
(5) 有开锁指示灯。
(6)查阅有关文献与资料,深入学习单片机硬件原理图及软件编程相关知识。
2系统方案论证系统将从主控部分和密码输入方式两方面进行论证。
2.1 主控部分的选择方案一:采用数字电路控制用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过10秒(一般情况下,用户不会超过10秒,若用户觉得不便,还可以修改)电路将报警20秒,若电路连续报警三次,电路将锁定键盘2分钟,防止他人的非法操作。
单片机系统课程设计成绩评定表设计课题基于89C51的电子密码锁设计学院名称:电气工程学院专业班级:学生姓名:学号:指导教师:设计地点:设计时间:单片机系统课程设计课程设计名称:基于89C51的电子密码锁设计专业班级:学生姓名:学号:指导教师:课程设计地点:课程设计时间:单片机系统课程设计任务书目录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 概述随着科技的发展,单片机已不是一个陌生的名词,它的出现是近代计算机技术发展史上的一个重要里程碑,因为单片机的诞生标志着计算机正式形成了通用计算机系统和嵌入式计算机系统两大分支。
单片机单芯片的微小体积和低的成本,可广泛地嵌入到如玩具、家用电器、机器人、仪器仪表、汽车电子系统、工业控制单元、办公自动化设备、金融电子系统、舰船、个人信息终端及通讯产品中,成为现代电子系统中最重要的智能化工具。
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。
随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。
目录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为核心的单片机控制方案。
基于51单片机电子锁设计摘要随着科技和人们的生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统机械锁由于构造简单,被撬事件屡见不鲜;电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐。
本设计以单片机AT89C51作为密码锁监控装置的检测和控制核心,分为主机控制和从机执行机构(本设重点介绍主机设计),实现钥匙信息在主机上的初步认证注册、密码信息的加密、钥匙丢失报废等功能。
根据51单片机之间的串行通信原理,这便于对密码信息的随机加密和保护。
而且采用键盘输入的电子密码锁具有较高的优势。
采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,提高信号传输的抗干扰性,减少错误动作,而且功率消耗低;反应速度快、传输效率高、工作稳定可靠等。
软件设计采用自上而下的模块化设计思想,以使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。
测试结果表明,本系统各项功能已达到本设计的所有要求。
关键词:单片机;密码锁;单片机设计,电子锁。
Electronic Lock Design with 51 Serires Single Chip ControllerAbstractAlong with the exaltation of social science and the living level of people, how carry out the family to guard against theft, this problem also change particularly outstanding.Because of the simple construct of traditional machine lock,the affairs of theft is hackneyed.the electronics lock is safer because of its confidentiality, using the vivid good, the safe coefficient is high, being subjected to the large customer close.It can carry out the key information to register in the main on board initial attestation, the password information encrypt etc. Go to correspond by letter the principle according to the string between 51 machines, this is easy to encrypt and protect to the passwords information random. Adopt the numerical signal codes,not only can carry out many controls of the road information, raise the anti- interference that signal deliver, reduce the mistake action,but also the power consume is low, Respond quickly,the efficiency deliver is high, work stable credibility etc. The software design adoption the design thought from top to bottom, to make the system toward wear distribute type,turn to the direction development of small, strengthen the system and can expand the stability and circulate.Test the result enunciation, various functions of this system are already all request of this design.keyword:singlechip;cryptogram lock;singlechip design; electronics lock.目录1 绪论 (1)1.1 引言 (1)1.2 电子密码锁的背景 (1)1.3 电子锁设计的意义的本设计特点 (2)2.系统设计 (3)2.1系统总设计结构图 (3)2.2.开锁机构设计 (3)2.2.1主控芯片AT89C51单片机的简介 (4)3系统硬件设计 (6)3.1键盘设计 (6)3.2系统电路设计: (8)3.2.1 晶振时钟电路 (8)3.2.2复位电路设计 (8)3.2.3串口引脚功能介绍 (8)3.2.4 其它引脚 (9)3.3电路图的绘制 (9)3.3.1 PROTEL 99 SE简介: (12)3.4原器件采购 (14)3.5电路焊接 (14)4.软件设计 (17)4.1 系统软件设计整体思路 (17)4.2系统软件设计流程图 (18)5 程序调试 (19)5.1 程序调试用到的软件及工具 (19)5.2 KEIL C51简介 (19)5.3 调试过程 (19)6 设计总结与展望 (22)致谢 (23)参考文献 (24)附录 (25)1 绪论1.1 引言随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的喜爱。
基于51单片机的电子密码锁系统设计制作,电路图+源程序这款基于51单片机的电子密码锁系统,单片机用STC89C52RC单片机,电路简单,制作过程中不需要进行调试,支持密码掉电保存功能!密码储存于单片机内部自带的的EEPROM中,不需要外置AT24C01保存密码,是学习电子密码锁比较好的教学试验系统,主要功能如下:1、1602液晶菜单显示。
2、6位密码,密码可重置,重置密码时,先输入原始密密,正确后输入新密码,再交输入新密码,两次输入的密码一致辞时,密码修改成功。
开锁时,密码通过键盘输入,若密码正确,则将锁打开,诺密码不正确时,无法开锁,密码输入错误三次时,蜂鸣器报警并且锁定键盘,10分钟。
3、支持掉电保存密码功能。
单片机中的密码是储存于单片内部的EEPROM中,在密码锁系统断电时,储存在密码锁系统中的密码不会丢失。
4、密码锁系统采用5V继电器模拟开锁过程。
5、输入的正确时,继电器吸合2-3秒,开锁指示灯亮2-3秒,模拟开锁。
6、密码错误报警且有错误提示(显示Error)。
7、密码正确开锁指示。
8、4X4矩阵键盘输入。
9、随时可修改密码存储,支持掉电保存密码功能,功能更为实用。
10、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。
修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
源程序如下:1. #include<reg52.h>2. #define uint unsigned int3. #define uchar unsigned char4. void key_scan();5. uchar count0,count1,count3,num,n=0,temp,a,j,count4;6. uchar mima[8]; //初始密码存储区7. uchar tab_key[50]; //输入密码存储区8. uchar code table[]={9. 0x3f,0x06,0x5b,0x4f,10. 0x66,0x6d,0x7d,0x07,11. 0x7f,0x6f,0x77,0x7c,12. 0x39,0x5e,0x79,0x71};13. bit enterflag; //确认键按下与否的标志14. bit mimaflag; //密码正确与否的标志15. bit xiugaiflag; //修改密码标志16. bit enter1flag; //修改密码确认键标志17. sbit red=P3^7;18. sbit bell=P3^6;19. sbit rs=P2^0;20. sbit rw=P2^1;21. sbit lcden=P2^2;22. sbit scl=P3^4;23. sbit sda=P3^5;24. uchar code table1[]="input the passco";25. uchar code table2[]="de: --------";26. uchar code table3[]="*";27. uchar code table4[]="right (^_^) ";28. uchar code table5[]="first error";29. uchar code table6[]="second error";30. uchar code table7[]="third error see ";31. uchar code table8[]="u tomorrow (^_^)";32. uchar code table9[]="define the passc";33. uchar code table10[]="ode: --------";34. uchar code table11[]="code is new";35. //******************************键盘消抖函数*******************************36. void delay1()37. { ;; }38. void delay2(uchar x)39. {40. uchar a,b;41. for(a=x;a>0;a--)42. for(b=100;b>0;b--);43. }44.45. void delay(uint z)46. {47. uint x,y;48. for(x=z;x>0;x--)49. for(y=110;y>0;y--);50. }51.52. //****************************e^2room的初始化*******************************53. void start() //开始信号54. {55. sda=1;56. delay1();57. scl=1;58. delay1();59. sda=0;60. delay1();61. }62.63. void stop() //停止64. {65. sda=0;66. delay1();67. scl=1;68. delay1();69. sda=1;70. delay1();71. }72. //****************************应答信号*************************************73. void respond()74. {75. uchar i;76. scl=1;77. delay1();78. while((sda==1)&&(i<250))i++;79. scl=0;80. delay1();81. }82. //*****************************写字节操作函数**********************************83. void write_byte(uchar date)84. {85. uchar i,temp;86. temp=date;87. for(i=0;i<8;i++)88. {89. temp=temp<<1; //保持最高位,左移到进位CY90. scl=0;91. delay1();92. sda=CY;93. delay1();94. scl=1;95. delay1();96. }97. scl=0;98. delay1();99. sda=1;//总线释放100. delay1();101. }102. //*******************************读字节操作函数***************************** 103. uchar read_byte()104. {105. uchar i,k;106. scl=0;107. delay1();108. sda=1;109. delay1();110. for(i=0;i<8;i++)111. {112. scl=1;113. delay1();114. k=(k<<1)|sda; //或运算,放到最低位115. scl=0;116. delay1();117. }118. return k;119. }120. //**********************************写地址函数****************************** 121. void write_add(uchar address,uchar date)122. {123. start();124. write_byte(0xa0);125. respond();126. write_byte(address);127. respond();128. write_byte(date);129. respond();130. stop();131. }132. //*******************************读地址函数************************************* 133. uchar read_add(uchar address)134. {135. uchar date;136. start();137. write_byte(0xa0);138. respond();139. write_byte(address);140. respond();141. start();142. write_byte(0xa1);143. respond();144. date=read_byte();145. stop();146. return date;147. }148. //****************************LCD1602的初始化******************************* 149. void write_com(uchar com)150. {151. rs=0;152. lcden=0;153. P0=com;154. delay(5);155. lcden=1;156. delay(5);157. lcden=0;158. }159.160. void write_date(uchar date)161. {162. rs=1;163. lcden=0;164. P0=date;165. delay(5);166. lcden=1;167. delay(5);168. lcden=0;169. }170.171. //***************************************密码比较函数******************************** 172. bit mimacmp()173. {174. bit flag;175. uchar i;176. for(i=0;i<8;i++)177. {178. if(mima[i]==tab_key[i])179. flag=1;180. else181. {182. flag=0;183. i=8;184. }185. }186. return(flag); //返回flag187. }188.189. ////**********************************LCD显示函数开始**************************************190. void lcd_display()191. {192. uchar i=0;193. write_com(0x80+0x40+8);194. for(i=0;i<n;i++)195. {196. write_date(table3[0]);197. }198. }199.200. //****************************************键盘功能分配函数群开始****************************201. //** 0 ** 1 **2 ** 3**202. //** 4** 5** 6 **7 **203. //**8** 9** 确认(A) **无效(B)204. //**取消(C)**修改密码键(D)**确认修改键(E)**无效(F)205.206. void key_manage1()207. {208. tab_key[n]=0;209. n++;210. if(xiugaiflag==1)211. {212. mima[count4]=0;213. count4++;214. }215. }216.217. void key_manage2()218. {219.220. tab_key[n]=1;221. n++;222. if(xiugaiflag==1)223. {224. mima[count4]=1;225. count4++;226. }227. }228.229. void key_manage3()230. {231.232. tab_key[n]=2;233. n++;234. if(xiugaiflag==1)235. {236. mima[count4]=2;237. count4++;238. }239. }240.241. void key_manage4() 242. {243. tab_key[n]=3; 244. n++;245. if(xiugaiflag==1) 246. {247. mima[count4]=3; 248. count4++;249. }250. }251.252. void key_manage5() 253. {254. tab_key[n]=4; 255. n++;256. if(xiugaiflag==1) 257. {258. mima[count4]=4; 259. count4++;260. }261. }262.263. void key_manage6() 264. {265. tab_key[n]=5; 266. n++;267. if(xiugaiflag==1) 268. {269. mima[count4]=5; 270. count4++;271. }272. }273. void key_manage7() 274. {275. tab_key[n]=6; 276. n++;277. if(xiugaiflag==1) 278. {279. mima[count4]=6; 280. count4++;281. }282. }283. void key_manage8() 284. {285. tab_key[n]=7; 286. n++;287. if(xiugaiflag==1) 288. {289. mima[count4]=7; 290. count4++;291. }292. }293.294. void key_manage9()295. {296. tab_key[n]=8;297. n++;298. if(xiugaiflag==1)299. {300. mima[count4]=8;301. count4++;302. }303. }304. void key_manage10()305. {306. tab_key[n]=9;307. n++;308. if(xiugaiflag==1)309. {310. mima[count4]=9;311. count4++;312. }313. }314. //**********************************确认键**************************************************************315. void key_manage11()316. {317. enterflag=1; //确认键按下318. if(n==8) //只有输入8个密码后按确认才做比较319. mimaflag=mimacmp();320. else321. mimaflag=0;322. if(enterflag==1)323. {324. enterflag=0;325. n=0;326. //用FFFFFFFF清除已经输入的密码327. for(count3=0;count3<8;count3++)328. {329. delay(5);330. tab_key[count3]=0x0f;331. }332.333. TR1=1; //打开计数器1334. count1=0; //定时器1由50MS累计到1S 所用的计数器335. if(mimaflag==1)336. {337. a=0;338.339. write_com(0x01);340. write_com(0x80);341. for(count3=0;count3<16;count3++)342. {343. write_date(table4[count3]); //密码正确,显示RIGHT,绿灯亮344. delay(5);345. }346. }347.348. else349. {350. n=0;351. red=0;352. bell=0;353. a++;354. if(a==1)355. {356. for(count3=0;count3<8;count3++) //ffffffff清除密码357. {358. delay(5);359. tab_key[count3]=0x0f;360. }361. write_com(0x01); 362. write_com(0x80);363. for(count3=0;count3<16;count3++)364. {365. write_date(table5[count3]); //密码错误,显示 first error,红灯亮366. delay(5);367. }368. TR1=1;369. }370. if(a==2)371. {372. for(count3=0;count3<8;count3++) //ffffffff清除密码373. {374. delay(5);375. tab_key[count3]=0x0f;376. }377. write_com(0x01);378. write_com(0x80);379. for(count3=0;count3<16;count3++)380. {381. write_date(table6[count3]); //密码错误,显示SECOND ERROR,红灯亮382. delay(5);383. }384. TR1=1;385. }386.387. if(a==3)388. {389. for(count3=0;count3<8;count3++) //ffffffff清除密码390. {391. delay(5);392. tab_key[count3]=0x0f;393. }394. write_com(0x01);395. write_com(0x80);396. for(count3=0;count3<16;count3++)397. {398. write_date(table7[count3]); //密码错误,显示third error see,红灯亮399. delay(5);400. }401. write_com(0x80+0x40);402. for(count3=0;count3<16;count3++)403. {404. write_date(table8[count3]);//密码错误,显示 U TOMORROW ,红灯亮405. delay(5);406. }407. TR1=0;408.409. }410.411. }412. }413.414. }415. void key_manage12()416. {417. tab_key[n]=11;418. n++; //密码计数清零419.420. }421. //****************************************************取消键********************************************422. void key_manage13()423. {424.425. n=0; //密码计数清零426. write_com(0x80); //指针所指位置427. for(count3=0;count3<16;count3++)428. {429. write_date(table1[count3]); //第一行显示INPUT THE PASSPORD:430. delay(5);431. }432. write_com(0x80+0x40);433. for(count3=0;count3<16;count3++)434. {435. write_date(table2[count3]); //开机显示--------436. delay(5);437. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码438. }439.440. }441. //*******************************************修改密码键********************************** 442. void key_manage14()443. {444. uchar aa=0;445. n=0;446. xiugaiflag=1;447. write_com(0x01);448. write_com(0x80);449. for(count3=0;count3<16;count3++)450. {451. write_date(table9[count3]); //显示define the password452. delay(5);453. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码454. }455. write_com(0x80+0x40);456. for(count3=0;count3<16;count3++)457. {458. write_date(table10[count3]); //显示--------459. delay(5);460. }461. TR0=1;462.463. }464. //******************************************修改密码键的确认键********************************465. void key_manage15()466. {467. n=0;468. enter1flag=1;469. if(enter1flag==1)470. {471. enter1flag=0;472. count4=0;473. for(count3=0;count3<16;count3++)474. {475. tab_key[count3]=0x0f; //用FFFFFFFF清楚已经输入的密码476. }477. write_com(0x01);478. write_com(0x80);479. for(count3=0;count3<16;count3++)480. {481. write_date(table11[count3]);482. delay(100);483. }484. TR1=1;485. count1=0;486. }487. }488. void key_manage16()489. {490. tab_key[n]=15;491. n++;492. }493.494. //****************************************定时器1的50MS,共延时1秒*****************************495. void time_1() interrupt 3496. {497.498. TH1=(65536-50000)/256;499. TL1=(65536-50000)%256;500. if(count1<20)501. {502. count1++;503. }504. else //计时到1S505. {506. TR1=0;507. count1=0;508. mimaflag=0;509.510. red=1;511. bell=1;512. //显示FFFFFFFF513. write_com(0x01);514. write_com(0x80);515. for(count3=0;count3<16;count3++)516. {517. write_date(table1[count3]); //显示INPUT THE PASSCODE518. delay(5);519. }520. write_com(0x80+0x40);521. for(count3=0;count3<16;count3++)522. {523. write_date(table2[count3]); //开机显示FFFFFFFF524. delay(5);525. }526. }527.528. }529. //***********************************************定时0**********************************************530. void time_0() interrupt 1531. {532.533. TH0=(65536-50000)/256;534. TL0=(65536-50000)%256;535. if(count4<8)536. {537. key_scan();538. }539. else540. {541. TR0=0;542. count4=0;543. }544. }545.546. //初始化函数547. void init()548. {549.550. uchar i;551. lcden=0;552. write_com(0x38); //打开显示模式设置553. write_com(0x0c); //打开显示,光标等等设置未零554. write_com(0x06); //当读或写一个字符后地址指针加一,且光标加一,当写一个字符后整频显示左移,555. write_com(0x01); //清零指令556. write_com(0x80); //指针所指位置557.558. //定时器初始化559. TMOD=0x11; //T0,T1工作方式1560. TH0=(65536-2000)/256;561. TL0=(65536-2000)%256; //T0初始化2MS563. TH1=(65536-50000)/256;564. TL1=(65536-50000)%256; //T1初始化50MS565.566. TR1=0;567. ET1=1;568. EA=1;569. TR0=0;570. ET0=1;571.572. count0=0; //初始没有密码输入,故为零573. enterflag=0; //没有确认键按下574. mimaflag=0; //密码正确与否键先置零575.576. red=1; //红灯不亮577. //************密码存入EPROM中**********************************578. sda=1;579. delay(5);580. scl=1;581. delay(5);582. for(i=0;i<8;i++)583. {584. write_add(i,8);585. delay2(100);586. }587. for(i=0;i<8;i++)588. {589. mima[i]=read_add(i);590. delay(5);591. }592.593. }594. void main()595. { rw=0;596. init();597. write_com(0x80); //指针所指位置598. for(count3=0;count3<16;count3++)599. {600. write_date(table1[count3]); //第一行显示INPUT THE PASSPORD: 601. delay(5);602. }603. write_com(0x80+0x40);604. for(count3=0;count3<16;count3++)605. {606. write_date(table2[count3]); //开机显示FFFFFFFF607. delay(5);608. }609. while(1)610. {611. key_scan(); //调用键盘扫描函数612. lcd_display();613. }614.615. }616. //**************************************************键盘扫描函数开始********************************619. //**********扫描第一行*********620. P1=0xfe;621. temp=P1;622. temp=temp&0xf0;623. if(temp!=0xf0)624. {625. delay(100);626. if(temp!=0xf0)627. {628. temp=P1;629. switch(temp)630. {631. case 0xee:632. key_manage1();633. break;634.635. case 0xde:636. key_manage2();637. break;638.639. case 0xbe:640. key_manage3();641. break;642.643. case 0x7e:644. key_manage4();645. break;646. }647. while(temp!=0xf0)648. {649. temp=P1;650. temp=temp&0xf0;651. }652. }653. }654. //**************************************************扫描第二行***********************************655. P1=0xfd;656. temp=P1;657. temp=temp&0xf0;658. if(temp!=0xf0)659. {660. delay(100);661. if(temp!=0xf0)662. {663. temp=P1;664. switch(temp)665. {666. case 0xed:667. key_manage5();668. break;669.670. case 0xdd:671. key_manage6();674. case 0xbd:675. key_manage7();676. break;677.678. case 0x7d:679. key_manage8();680. break;681. }682. while(temp!=0xf0)683. {684. temp=P1;685. temp=temp&0xf0;686. }687. }688. }689. //*********************************************扫描第三行***********************************690. P1=0xfb;691. temp=P1;692. temp=temp&0xf0;693. if(temp!=0xf0)694. {695. delay(100);696. if(temp!=0xf0)697. {698. temp=P1;699. switch(temp)700. {701. case 0xeb:702. key_manage9();703. break;704.705. case 0xdb:706. key_manage10();707. break;708.709. case 0xbb:710. key_manage11();711. break;712.713. case 0x7b:714. key_manage12();715. break;716. }717. while(temp!=0xf0)718. {719. temp=P1;720. temp=temp&0xf0;721. }722. }723. }724.725. //***************************************************扫描第四行****************************************727. temp=P1;728. temp=temp&0xf0; 729. if(temp!=0xf0) 730. {731. delay(100);732. if(temp!=0xf0) 733. {734. temp=P1;735. switch(temp) 736. {737. case 0xe7:738. key_manage13(); 739. break;740.741. case 0xd7:742. key_manage14(); 743. break;744.745. case 0xb7:746. key_manage15(); 747. break;748.749. case 0x77:750. key_manage16(); 751. break;752. }753. while(temp!=0xf0) 754. {755. temp=P1;756. temp=temp&0xf0; 757. }758. }759. }760. }复制代码。
基于单片机的电子密码锁设计基于单片机的电子密码锁设计单片机是典型的嵌入式微控制器,由运算器,控制器,存储器,输入输出设备等构成,相当于一个微型的计算机。
下面是小编为你带来的基于单片机的电子密码锁设计,欢迎阅读。
摘要:随着电子技术的发展,人们对锁的需求越来越多,所以各种各样的电子锁层出不穷,未来电子密码锁的市场将非常广阔。
这次设计是以STC89C51单片机为技术控制核心,显示部分选用了1602液晶显示,密码储存模块采用AT24C02芯片,结合设计的外围报警模块,矩阵键盘输入模块,继电器模块完成了电子密码锁的设计。
关键词:密码锁;单片机;液晶显示一、引言(一)设计的背景和研究意义。
自从人类脱离原始社会、开始有私有财产的概念以来,锁就成为了人们生活中的重要组成部分。
随着科技的发展,电子密码锁被越来越多的人所接受,它已经在生活中随处可见了. 电子密码锁拥有太多机械锁完全无法相比的优点。
它不但能完成“锁”自身的功用,还可以具有记忆、辨识、警报等特别的作用。
因为电子密码锁的更安全性、更便宜、易操作,越来越多人开始关注这一领域。
随着单片机的迅速发展,其应用领域越来越广泛,将其应用到保密和安全方面是相当可靠,相当有意义的。
基于单片机的电子密码锁的研究在保护财产和人身安全方面可以给人们带来更多更好的选择(二)设计的主要环节。
设计的主要方案如下:(1)控制模块采用STC89C51为控制中心模块。
(2)键盘输入采用4x3的共阴极键盘输入可以节省IO口的使用。
(3)显示模块采用液晶显示密码的输入和修改等提示。
(4)报警模块通过蜂鸣器和LED灯闪烁来完成。
(5)继电器用来控制密码锁的开关。
二、系统的硬件原理图硬件设备是以单片机为核心,结合电源电路、密码储存电路、显示电路、报警电路和继电器电路等外围设备来完成设计要求。
其原理框图如图1。
三、系统硬件部分设计(一)AT24C02 EEPROM存储器。
用户在使用电子密码锁的时候若更改了系统的初始密码,密码锁系统断电之后密码就容易丢失,而曾加了AT24C02就能把密码储存起来防止丢使。
基于STC89C51的零接触智能密码锁的设计与实现作者:王乐乐李斌曹骥龙夏茳南周欣欣来源:《无线互联科技》2021年第19期摘要:为解决疫情期间病毒的传染性对生活造成的不便,文章提出一种零接触智能密码锁的设计,采用数字信号控制和自上而下的模块化设计思想,以单片机为核心控制器,结合安全性和适用范围,增强系统的可扩展性和运行的稳定性;通过红外遥控技术实现零接触远程密码开锁,降低病毒二次传染的风险。
文章分别论述了对零接触密码锁的设计思路、硬件电路设计、软件设计。
测试结果表明,系统各项功能达到了设计要求。
关键词:电子密码锁;遥控;STC89C510 引言随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
密码锁具有安全性高、成本低、功耗低、易操作等优点,通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁等任务[1-2]。
现在应用较广的电子密码锁通常以芯片为核心,其性能和安全性已大大超过了机械锁。
在疫情期间,由于病毒的传染性与潜伏性,使用传统的密码锁会因过多的接触而导致很多不必要的麻烦[3-4]。
本文设计了一款零接触智能密码锁,采用红外遥控的方法,切断了由于开锁接触导致病毒传染的途径,有效保障人们在公共场所的健康安全,降低病毒传染的风险。
本系统适用于学校、写字楼等日常人员活动密集的场所[5]。
1 系统硬件设计零接触的实现方式就是将公用的开锁方式转化成无线的个人开锁方式,也就是将传统的按键式密码锁更换为遥控式密码锁。
在使用过程中,每个用户都将拥有一个密码锁遥控器,通过遥控器的按键输入密码,实施零接触开锁。
用户使用时,通过连接单片机的矩阵键盘输入密码,单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警。
本系统硬件设计主要由单片机核心控制模块、键盘输入模块、密码存储模块、红外遥控模块、复位模块、显示模块、开锁模块等组成。
目录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系列单片机来实现的,但密码简单,易破解。
随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了真真的电子加密,用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码锁。
/*连接线图:---------------------------------------------------| 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时,退出按键输入。
基于51单片机指纹电子密码锁设计摘要随着人民生活水平的提高,如何实现家庭防盗这一问题也变得尤其突出,传统的机械锁由于其构造简单,安全性低,无法满足人们的需求。
随着电子产品向智能化和微型化的不断发展,单片机已成为电子产品研制和开发中首选的控制器,所以具有防盗报警功能的电子密码锁控制系统逐渐代替传统的机械式密码控制系统,克服了机械式密码锁控制的密码量少,安全性能差的缺点。
在传统的身份认证中,我们往往使用密码加密法,但是这种方法只是"防君子不防小人"。
在高明的黑客眼里,由几个字符组成的密码脆弱得不堪一击。
现在,科技的发展让我们有了新的选择——生物识别技术.将生物识别技术应用于笔记本、门锁等方面,可以对文件、财产起保护作用,并且可以进行身份识别。
生物识别技术的发展主要起始于指纹研究,它亦是目前应用最为广泛的生物识别技术。
本设计开发了一款基于单片机的指纹识别电子密码锁系统。
该系统以STC89C52单片机作为模块核心,通过串口通信控制ZFM—60指纹模块实现录取指纹并存储指纹数据,并通过HS12864—15C液晶显示比对流程及比对结果,辅以直流继电器与发光二极管模拟开锁的动作.本系统具有体积小、性价比高、传输速度快、适合家庭及单位使用。
关键词:单片机,密码锁,指纹识别51 single fingerprint—based electronic code lockdesignABSTRACTWith the improvement of people's living standards,how to achieve family security issue has become particularly prominent, the traditional mechanical locks because of its simple structure,low security,can not meet people’s needs。
基于STC89C51单片机的电子密码锁学生姓名:赵丽丽宋帅高秋利学生学号: ********** ********** ********** 院(系):机电工程学院年级专业: 11级电子信息工程1班指导教师:***二〇一五一月目录1 绪论1.1电子密码锁简介 (3)2 设计方案 (4)3 主要元器件 (5)3.1 主控芯片STC89C51 (5)3.2 晶体振荡器 (5)3.3 LCD显示密码模块的设计 (7)3.3.1 LCD1602简介 (7)3.3.2 LCD1602液晶显示模块与单片机连接电路 (8)4 硬件系统设计 (9)4.1 设计原理 (9)4.2 电源输入电路 (9)4.3 矩阵键盘 (10)4.4 复位电路 (10)4.5 晶振电路 (11)4.6 报警电路 (12)4.7 显示电路 (12)4.8 开锁电路 (12)4.9 电路总体构成 (13)5 软件程序设计 (14)5.1 主程序流程介绍 (14)5.2 键盘模块流程图 (15)5.3 显示模块流程图 (17)5.4 修改密码流程图 (18)5.5 开锁和报警模块流程图 (19)6 电子密码锁的系统调试及仿真 (21)6.1硬件电路调试及结果分析 (21)6.2软件调试及功能分析 (21)6.2.1调试过程 (21)6.2.2 仿真结果分 (22)6.3 仿真全图 (24)7 结论 (25)参考文献 (26)附录: (27)1 绪论1.1电子密码锁简介电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。
其性能和安全性已大大超过了机械锁。
其特点如下:1) 保密性好,编码量多,远远大于弹子锁。
随机开锁成功率几乎为零。
2) 密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。
3) 误码输入保护,当输入密码多次错误时,报警系统自动启动。
4) 无活动零件,不会磨损,寿命长。
5) 使用灵活性好,不像机械锁必须佩带钥匙才能开锁。
6) 电子密码锁操作简单易行,一学即会。
2 设计方案采用以单片机为核心的控制方案。
由于单片机种类繁多,各种型号都有其一定的应用环境,因此在选用时要多加比较,合理选择,以期获得最佳的性价比。
一般来说在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。
在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持和服务等等因素。
基于以上因素本设计选用单片机STC89C51作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。
在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接LCD1602液晶显示屏用于显示作用。
当用户需要开锁时,先按键盘开锁键之后按键盘的数字键0-9输入密码。
密码输完后按下确认键,如果密码输入正确则开锁,不正确则重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确开锁后才能设置新密码。
新密码输入无误后按确认键使新密码将得到存储,密码修改成功。
3主要元器件3.1主控芯片STC89C511)STC89C51单片机的主要特性如下:STC89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,STC的STC89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,STC89C51芯片引脚图如图3-1所示。
图3-1 STC89C51芯片引脚图3.2 晶体振荡器晶体振荡器,简称晶振,其作用在于产生原始的时钟频率,这个频率经过频率发生器的放大或缩小后就成了电脑中各种不同的总线频率。
以声卡为例,要实现对模拟信号44.1kHz或48kHz的采样,频率发生器就必须提供一个44.1kHz或48kHz的时钟频率。
如果需要对这两种音频同时支持的话,声卡就需要有两颗晶振。
但是现在的娱乐级声卡为了降低成本,通常都采用SCR将输出的采样频率固定在48kHz,但是SRC会对音质带来损害,而且现在的娱乐级声卡都没有很好地解决这个问题。
现在应用最广泛的是石英晶体振荡器。
石英晶体振荡器是一种高精度和高稳定度的振荡器,石英晶体振荡器也称石英晶体谐振器,它用来稳定频率和选择频率,是一种可以取代LC谐振回路的晶体谐振元件。
石英晶体振荡器广泛地应用在电视机、影碟机、录像机、无线通讯设备、电子钟表、单片机、数字仪器仪表等电子设备中。
为数据处理设备产生时钟信号和为特定系统提供基准信号。
在单片机中为其提供时钟频率。
石英晶体振荡器是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器,简称为石英晶体或晶体、晶振。
其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的。
只要在晶体振子板极上施加交变电压,就会使晶片产生机械变形振动,此现象即所谓逆压电效应。
当外加电压频率等于晶体谐振器的固有频率时,就会发生压电谐振,从而导致机械变形的振幅突然增大。
时钟信号用来提供单片机片内的各种微操作的时间基准,时钟信号通常用两种电路形式得到:内部振荡和外部振荡。
MCS-51单片机内部有一个用于构成振荡器的高增益反向放大器,引脚XTAL1和XTAL2分别是此放大电器的输入端和输出端,由于采用内部方式时,电路简单,所得的时钟信号比较稳定,实际使用中常采用这种方式,外接晶体振荡器(简称晶振)或陶瓷谐振器就构成了内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。
外接晶体以及电容C2和C3构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值为30pF左右,晶振频率选11.0592MHz3.3 LCD显示密码模块的设计显示模块主要由LCD1602显示屏组成,他显示的是键盘输入的密码,以及密码正确与错误的提示。
当输入密码时,出于安全性的考虑,显示的密码是有*号代替,为暗密。
当输入六位密码后按下确认键,系统会与存于ROM的密码对比,若密码错误,显示屏会显示Error,若密码正确,显示屏会显示Right。
3.3.1 LCD1602简介1) 1602功能介绍1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
2)1602LCD 采用标准的 14脚(无背光)或 16脚(带背光)接口,各引脚接口说明如下表3-2所示:表3-2 引脚功能说明其引脚图如下图3-2所示:图3-2 LCD1602引脚图3) LCD寄存器的选择表3-3 LCD寄存器的选择E R/W RS 功能说明1 1 0 写入命令寄存器1 1 1 写入数据寄存器1 1 0 读取忙碌标志及RAM地址1 1 1 读取RAM数据0 X 1 不动作3.3.2 LCD1602液晶显示模块与单片机连接电路图3-3 LCD1602液晶显示模块与单片机连接电路4 硬件系统设计4.1 设计原理本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。
其中矩阵键盘用于输入数字密码和进行各种功能的实现。
由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。
本系统共有两部分构成,即硬件部分与软件部分。
其中硬件部分由电源输入部分、键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成,软件部分对应的由主程序、初始化程序、LCD显示程序、键盘扫描程序、启动程序、关闭程序、建功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。
图4-1 组成原理4.2 电源输入电路三端集成稳压器LM7805和LM7905是作为固定输出电压的典型应用。
正常工作时,输入、输出电压差为2--3V。
电容C为输入稳定电容,其作用是减小纹波,消振、抑制高频和脉冲干扰,它一般为0.1--1uF。
电容C为输出稳定电容,其作用是改善负载的瞬态响应,它一般为1uF。
使用三端稳压器时要根据输出电流的大小选择加散热器,否则会由于过热而无法工作到额定电流。
图4-2 电源输入电路4.3 矩阵键盘由于本设计所用到的按键数量较多而不适合用独立按键式键盘。
采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O 口。
本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,比如清空显示功能等。
键盘的每个按键功能在程序设计中设置。
其大体功能(看键盘按键上的标记)及与单片机引脚接法。
图4-3 矩阵键盘4.4 复位电路单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。
无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。
地址锁存信号ALE也为高电平。