1、1目录简易电字密码锁 .2一、绪论 21.1 引言 21.2 课题的背景及意义 .21.3 电子密码锁发展趋势 3二、 总体设计方案 52.1 基于单片机的电子密码锁功能实现要求 52.2 按键说明 52.3 操作说明 62.4 系统结构框图 6三、 硬件设计 73.1 AT89C51 单片机的简介 73.1.1 主要特性 83.1.2 管脚说明 83.2 振荡器和时钟电路 .113.3 单片机复位电路 .123.4 键盘电路设计 133.5 液晶显示电路设计 133.6 存储芯片电路设计 14四、系统软件设计 15五、课程总结及心得体会 .31参考文献 .322简易电字密码锁一、绪论1.1
2、引言在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。根据本设计要求,通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁等任务。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的数字密码锁是以芯片为核
3、心,通过编程来实现的。其性能和安全性已大大超过了机械锁。其主要优点有:(1)保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。(2)密码可变。用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。(3)误码输入保护。当输入密码错误时,系统会报警。(4)操作简单易行,一学即会。1.2 课题的背景及意义随着电子技术和计算机技术的飞速发展,单片机性能不断完善,性能价格比显著提高,技术日趋完善。由于单片机具有体积小、重量轻、价格便宜、功耗低、控制功能强及运算速度快等特点,因而在国民经济建设、军事及家用电器等各个领域均得到了广泛的应用。本设计利用单片机及附加器件实现数
4、据采集和控制算法,来完成某一实际功能,检验并提高同学对整体电路设计和把握能力,了解单片机系统设计流程,以及电路板的实际制作和调试能力。同时也3加强对数字电路、单片机和微机原理等课程知识的实际应用能力,也为同类产品的进一步发展奠定理论和实践基础。20 世纪 80 年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,成本较高,是适合使用在安全性要求较高的场合,且需要有电源提供能量,使用还局限在一定范围,难以普及,所以对它的研究一直没有明显进展。目前,在西方发达国家,电子密码锁技术相对先进,种类齐全,电子密码锁已被广泛应用于智能门禁系统中,通过多种更加安全,更加可靠的技术实现大门的管
5、理。在我国电子锁整体水平尚处于国际上 70 年代左右,电子密码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供应市场。但国内自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,发展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。1.3 电子密码锁发展趋势 电子密码锁应用于金融业,其根本的作用是“授权”,即被“授权”的人才可以存取钱、物。广义上讲,金融业的“授权”主要包括以下三种层次的内容:1、授予保管权,如使用保管箱、保险箱和保险柜;2、授予出入权,如出入金库、运钞车和保
6、管室;3、授予流通权,如自动存取款。目前,金融行业电子密码锁的应用主要集中在前两个层面上。下面将介绍几种在金融行业中使用较多的电子密码锁以及它们的技术发展方向。当然,以上所说的授权技术再高超,都必须由精良的“锁具”担当承载结构部件,实现开启、闭锁的功能,而且承担实体防护作用,抵抗住或尽量延迟破坏行为,让电子密码锁“软、硬不吃”。一般情况下,锁具防盗的关键是锁身外壳、闭锁的部件的强度、锁止型式、配合间隙和布局。提高电子密码锁之防护能力的必然途径是报警,在金融业的许多场所有人值守、有电视监控,具有报警功能,可以综合物理防范和人力防范两种作用。报警的前提是具备探测功能,根据电子密码锁的使用场所和防护
7、要求,可选择多种多样的探测手段。在中国的城市金融业中,实现联网报4警已经成为对各金融网点的基本要求。根据国内外的实践经验,金融业实行安全防范风险等级很有必要,即依据使用的防盗报警器材的性能、安装布局和人员值守状况等,可以评估被防护物或区域的防护能力,得出风险等级,其中,电子密码锁的性能至关重要。由于数字、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子密码锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子密码锁,这样对盗贼而言是“道高一尺、魔高一丈”。组合使用信息也能够使电子密码锁获得无穷扩展的可能,使产品多样化,对用户而言是“千挑百选、
8、自得其所”。5二、 总体设计方案2.1 基于单片机的电子密码锁功能实现要求1、设置 6 位密码,密码通过键盘输入,若密码正确,则将锁打开。2、密码可以由用户自己修改设定(只支持 6 位密码) ,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过 3 次,蜂鸣器报警并且锁定键盘。4、AT24C02 保存密码,支持复位保存,掉电保存功能。2.2 按键说明如图示:采用 4X4 键盘输入,键盘对应名称如下:1 2 3 A4 5 6 B7 8 9 C# 0 * D其中, 【09】
9、为数字键,用于输入相应的密码,【#】号键为取消当前操作【*】号键为确认【D】键为修改密码其它键无功能及定义2.3 操作说明密码锁初始密码为:000000.1、开锁:插上电源后,程序自动调入初始密码,此时依次输 入:000000,然后按【*】 (确认)键,此时锁会打开,可以看到显示 open,密码锁打开。2、退出并关锁:按下【#】 (取消)键,此时锁关闭,所有输入清除。3、修改密码:在开锁状态下,再次输入正确的密码并按下【*】 (确认)键,此时听到两声提示,输入新的六位密码并按【D】 (重设)键,再重复输入一次新密码并按【D】 ,会听到两声提示音,表示重设密码成功,内部保存新密码并存储到 AT2
10、4C02。 (如两次输入的新密码不一样,则重设密码失败) 。4、报警并锁定键盘:当输入密码错误后,报警并锁定键盘 3 秒,如 3 秒内又有按键,3 秒再启动。当重置新密码时,新密码会保存于 AT24C02 存储器里。62.4 系统结构框图三、 硬件设计单片机(SCM)是单片微型计算机(Single Chip Microcomputer)的简称。它是把中央处理器 CPU、随机存储器 RAM、只读存储器 ROM、I/O 接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。随着单片机在技术上、体系上不断扩展其控制功能,国际上已经采用MCU(Microcontroll
11、er Unit)代替单片机的名词。它的最大优点是体积小,可放在仪表内部。但存储量小,输入输出适配器简单,功能较低。目前,单片机AT89S52显示模块报警电路开锁电路密码存储模块复位电路键盘输入模块7在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。近年来,51 系列单片机在我国非常流行,它最大的特点是内部有可以多次重复编程的闪烁 ROM,并且闪烁 ROM 可以直接用编程器来擦写,指令系统可兼容,方便程序的移植及系统的升级,使用起来比较方便。一个单片机应用系统的硬件电路设计包含有两部分内容:一是系统扩展,即单片机内部的功能单元,如ROMRAMI/O口定时/记数器中断系统等能量不能
12、满足应用系统的要求时,必须在片外进行扩展,选择适当的芯片,设计相应的电路。二是系统配置,既要按照系统功能要求配置外围设备,如键盘显示器打印机A/D和D/A转换器等,又要设计合适的接口电路。3.1 AT89C51 单片机的简介AT89C51 是一种低功耗/低电压、高性能的八位 CMOS 单片机,片内有一个 4KB 的 FLASH 可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory),它采用了 CMOS 工艺和 ATMEL 公司的高密度非易失性存储器技术,而且其输出引脚和指令系统都与 MSC51 兼容。片内置通用 8
13、位中央处理器(CPU)和 FLASH 存储单元,片内的存储器允许在系统内改编程序或用常规的非易失性存储器编程。因此,AT89C51 是一种功能强、灵活性高且价格合理的单片机,可方便的应用于各种控制领域。3.1.1 主要特性(1)与 MCS-51 产品指令系统兼容 (2)4K 字节可编程闪烁存储器 (3)寿命:1000 写/擦循环(4)数据保留时间:10 年(5)全静态工作:0Hz-24Hz(6)三级程序存储器锁定(7)128*8 位内部 RAM(8)32 可编程 I/O 线(9)两个 16 位定时器/计数器8(10)6 个中断源 (11)可编程串行通道(12)低功耗的闲置和掉电模式(13)片内
14、振荡器和时钟电路 另外,AT89C51 是用静态逻辑来设计的,其工作频率可下降到零并提供两种软件的省电方式-空闲方式和掉电方式。在空闲方式中,CPU 停止工作。在掉电方式中,片内振荡器停止工作,由于时钟被“冻结”,使一切功能都暂停,只保存片内 RAM 中的内容,直到下次硬件复位为止。3.1.2 管脚说明VCC(40):供电电压,其工作电压为 5V。GND(20):接地。P0 端口(P0.0-P0.7):P0 口为一个 8 位漏极开路双向 I/O 口,每个引脚可吸收 8TTL 门电流。当 P1 口的管脚第一次写 1 时,被定义为高阻输入。P0 能够用于外部程序数据存储器,它可以被定义为数据/地址
15、的第八位。在 FIASH 编程时,P0 口作为原码输入口,当 FIASH 进行校验时,P0 输出原码,此时 P0 外部必须被拉高。P1 端口(P1.0-P1.7):P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器能接收输出 4TTL 门电流。P1 口管脚写入 1 后,被内部上拉为高电平,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在 FLASH 编程和校验时,P1 口作为第八位地址接收。 P2 端口(P2.0-P2.7):P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2口缓冲器可接收,输出 4 个 TTL 门电流,当 P2 口
16、被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口,用于外部程序存储器或 16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。P3 端口(P3.0-P3.7):P3 口管脚是一个带有内部上拉电阻的 8 位的双向I/O 端口,可接收输出 4 个 TTL 门电流。当 P3 口写入“1”后,它们被内部上9拉为高电平,并用作
17、输入。作为输入端时,由于外部下拉为低电平,P3 口将输出电流(I LL)。P3 口也可作为 AT89C51 的一些特殊功能口,如表 3.1 所示。端口引脚P 3 . 0P 3 . 1P 3 . 2P 3 . 3P 3 . 4P 3 . 5P 3 . 6P 3 . 7第二功能R X D ( 串行输入口 )T X D ( 串行输出口 )( 外中断 0 )T 1 ( 定时 / 计数 1 )( 外部数据存储器写选通 )( 外部数据存储器读选通 )( 外中断 1 )T 0 ( 定时 / 计数 0 )_IN_WRD表 3.1 P3 端口引脚兼用功能表P3 口同时为闪烁编程和编程校验接收一些控制信号。复位
18、RST(9):复位输入。在振荡器运行时,有两个机器周期(24 个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个引脚保持高电平,51 芯片便循环复位。复位后 P3.0-P3.7 口均置 1,引脚表现为高电平,程序计数器和特殊功能寄存器 SFR 全部清零。当复位脚由高电平变为低电平时,芯片为 ROM 的 00H 处开始运行程序。复位操作不会对内部 RAM 有所影响。ALE/ (30):当访问外部存储器时,地址锁存允许的输出电平用于锁PROG存地址的地低位字节。在 FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的 1
19、/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个 ALE 脉冲。如果想禁止 ALE 的输出可在 SFR8EH 地址上置 0。此时, ALE 只有在执行 MOVX,MOVC 指令是 ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态 ALE 禁止,则置位无效。10(29):外部程序存储器的选通信号。在由外部程序存储器取指令期PSEN间,每个机器周期两次 有效。但在访问外部数据存储器时,这两次有效PSE的 信号将不出现。EA/VPP(31):当 保持低电平时,则在此期间外部程序存储器_A_A(0000H-FFFFH),不管是否
20、有内部程序存储器。注意加密方式 1 时, 将_EA内部锁定为 RESET;当 端保持高电平时,此间内部程序存储器。在 FLASH 编程期间,此引脚也用于施加 12V 的编程电源(VPP)。XTAL1(19):来自反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2(18):来自反向振荡器的输出。其引脚图如图 3.1 所示。XTAL218XTAL119ALE30 EA31 PSEN29RST9P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34P0.6/AD6 33P0.7/AD7 32P1.01 P1.12P1
21、.23 P1.34P1.45 P1.56P1.67 P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12P3.3/INT1 13P3.4/T0 14P3.7/RD 17P3.6/WR 16P3.5/T1 15P2.7/A15 28P2.0/A8 21P2.1/A9 22P2.2/A10 23P2.3/A11 24P2.4/A12 25P2.5/A13 26P2.6/A14 27U1AT89C5111图 3.1 AT89C51 引脚图3.2 振荡器和时钟电路振荡器和时钟电路用于产生单片机正常工作时所需要的时钟信号,AT89C51单片机采用 CMOS 工艺,内部包含一个振
22、荡器,可以用于 CPU 的时钟源;也允许采用外部振荡器,由外部振荡器产生的时钟信号来供内部 CPU 运行使用。XTAL1 和 XTAL2 分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2 应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。图 3.2 振荡器电路3.3 单片机复位电路单片机的复位是一个很重要的部分,复位是使单片机的 CPU 以及系统的各个部件处于特定的初始状态,并使系统从初始状态开始工作。一般在系统上电,或者程序死机的时候需要
23、进行单片机的复位。单片机复位原理是,在时钟电路开始工作后,在单片机的 RST 引脚施加 24 个时钟振荡脉冲(即两个机器周期)以上的高电平,单片机便可以实现复位。在复位期间,单片机的 ALE 引脚和引脚均输出高电平。当 RST 引脚从高电平跳变为低电平后,单片机便从 0PSEN000H 单元开始执行程序。本系统采用自动上电复位电路,这样可以上电自动复12位和人工复位单片机系统,如图 3.4 所示,当按下按键开关的时候,VCC 通过一个电阻连接到 RST 引脚,给 RST 一个高电平;按键松开的时候,RST引脚恢复为低电平,复位完成。图 3.3 手动上电复位电路3.4 键盘电路设计在单片机应用系
24、统中,一般都会设置键盘,主要为了控制运行状态,输入一些命令或数据,以完成特定的人机交互。键盘是与单片机进行人机交互的最基本的途径,其以按键的形式来设置控制功能或输入数据,按键的输入状态本质上是一个开关量。对于简单的开关量的输入可以采用独立式按键,这种方法接口简单,但占用单片机 I/O 端口资源较多。对于输入参数较多、功能复杂的系统,需要采用矩阵式键盘进行输入控制。本系统采用 4*4 矩阵式键盘,键盘连接方式如图 3.5 所示:13图 3.5 键盘电路图3.5 液晶显示电路设计液晶显示器(LCD)是一种功耗很低的显示器,它的使用非常广泛,比如电子表、计算器、数码相机、计算机的显示器和液晶电视等。
25、电子密码锁中需要显示的信息比较多,为了能直观的看到结果,并且为了设计显的美观,使用总线和排阻进行简化连接方式,本设计采用液晶显示屏 LCD 进行显示,具体连接方式如图 3.6 所示。图 3.6 液晶显示器电路3.6 存储芯片电路设计总线(Inter Intergrate Circuit BUS)全称为芯片间总线,它在芯片2IC间以两根连线实现全双工同步数据传送,一条数据线(SDA)和一条串行时钟线(SDL),可以很方便地构成外围器件扩展系统。 总线采用两线制,由数据2IC14线 SDA 和时钟线 SCL 构成,为了对数据进行存储,本系统使用串行 EEPROM 芯片,AT24C01 系列是典型的
26、 串行总线的 EEPROM,本系统采用此芯片进行数据存储,2IC存储系统连接如图 3.7 所示:图 3.7 总线和存储芯片连接电路图2IC四、系统软件设计程序设计(Programming)是指设计、编制、调试程序的方法和过程。它是目标明确的智力活动。在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。因此,软件设计在微机控制系统设计中占重要地位。对于本系统,软件也占有重要的地位。为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。把一个程序分成具有多个明确任务的程序模块,分别编制、调试后再把它们连接在一起形
27、成一个完整的程序,这样的程序设计方法称为模块化程序设计。所谓“模块” ,实质上就是能完成一定功能,并相对独立的程序段,这种程序设计方法称为模块程序设计法。模块程序设计法的主要优点是:(1)单个模块比起一个完整的程序易编写、调试及修改。(2)程序的易读性好。(3)程序的修改可局部化。15(4)模块可以共存,一个模块可以被多个任务在不同条件下调用。(5)模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。本系统软件采用模块化结构,由键盘扫描子程序,存储服务子程序,显示子程序。源程序如下:#include #include#define LCM_Data P0#define uchar un
28、signed char #define uint unsigned int#define w 6 /定义密码位数sbit lcd1602_rs=P20;sbit lcd1602_rw=P21;sbit lcd1602_en=P22;sbit Scl=P23; /24C02 串行时钟sbit Sda=P24; /24C02 串行数据sbit lock_led = P26; /开锁sbit open_led = P27; /开锁指示灯bit operation=0; /操作标志位bit pass=0; /密码正确标志bit ReInputEn=0; /重置输入允许标志bit s3_keydown=
29、0; /3 秒按键标志位uchar countt0,second; /t0 中断计数器,秒计数器uchar code a= 0xFE,0xFD,0xFB,0xF7; /控盘扫描控制表uchar code start_line = “password: “;uchar code name = “=Coded Lock=“; /显示名称uchar code Correct = “ correct “; /输入正确 uchar code Error = “ error “; /输入错误uchar code codepass = “ pass “; uchar code LockOpen = “ op
30、en “; /OPENuchar code SetNew = “SetNewWordEnable“;uchar code Input = “inPut: “; /INPUTuchar code ResetOK = “ResetPasswordOK “;uchar code initword = “Init password.“;uchar code Er_try = “error,try again!“;uchar code again = “input again “;uchar InputData6; /输入密码暂存区uchar CurrentPassword6=1,1,1,1,1,1;
31、/当前密码值uchar TempPassword6;uchar N=0; /密码输入位数记数uchar CorrectCont; /正确输入计数uchar ReInputCont; /重新输入计数uchar code initpassword6=0,0,0,0,0,0;16/=5ms 延时=void Delay5Ms(void)unsigned int TempCyc = 5552;while(TempCyc-);/=400ms 延时=void Delay400Ms(void)uchar TempCycA = 5;unsigned int TempCycB;while(TempCycA-)Te
32、mpCycB=7269;while(TempCycB-);/=24C02=void mDelay(uint t) /延时 uchar i;while(t-)for(i=0;i0;x-)for(y=110;y0;y-);/-写指令-write_1602com(uchar com)/*液晶写入指令函数*lcd1602_rs=0;/数据/指令选择置为指令lcd1602_rw=0; /读写选择置为写20P0=com;/送入数据delay(1);lcd1602_en=1;/拉高使能端,为制造有效的下降沿做准备delay(1);lcd1602_en=0;/en 由高变低,产生下降沿,液晶执行命令/-写数据
33、-write_1602dat(uchar dat)/*液晶写入数据函数*lcd1602_rs=1;/数据/指令选择置为数据lcd1602_rw=0; /读写选择置为写P0=dat;/送入数据delay(1);lcd1602_en=1; /en 置高电平,为制造下降沿做准备delay(1);lcd1602_en=0; /en 由高变低,产生下降沿,液晶执行命令/-初始化-void lcd_init(void)write_1602com(0x38);/设置液晶工作模式,意思:16*2 行显示,5*7 点阵,8 位数据write_1602com(0x0c);/开显示不显示光标write_1602co
34、m(0x06);/整屏不移动,光标自动右移write_1602com(0x01);/清显示/=将按键值编码为数值=uchar coding(uchar m) uchar k;switch(m)case (0x11): k=1;break;case (0x21): k=2;break;case (0x41): k=3;break;case (0x81): k=A;break;case (0x12): k=4;break;case (0x22): k=5;break;case (0x42): k=6;break;case (0x84): k=B;break;case (0x14): k=7;bre
35、ak;case (0x24): k=8;break;21case (0x44): k=9;break;case (0x82): k=C;break;case (0x18): k=*;break;case (0x28): k=0;break;case (0x48): k=#;break;case (0x88): k=D;break;return(k);/=按键检测并返回按键值=uchar keynum(void)uchar row,col,i;P1=0xf0;if(P1Delay5Ms();if(P1 /确定行线i=0;P1=ai; /精确定位while(i4)if(P1 /确定列线break;
36、 /已定位后提前退出 else i+;P1=ai;else return 0;while(P122return (row|col); /行线与列线组合后返回else return 0; /无键按下时返回 0/=显示输入的 N 个数字,用*代替以便隐藏=void DisplayOne(void)write_1602com(yi+5+N);write_1602dat(*);/=显示提示输入=void DisplayChar(void)uchar i;if(pass=1)write_1602com(er);for(i=0;i16;i+)write_1602dat(LockOpeni);elseif(
37、N=0)write_1602com(er);for(i=0;i16;i+)write_1602dat(Errori);elsewrite_1602com(er);for(i=0;i16;i+)write_1602dat(start_linei);void DisplayInput(void)23uchar i;if(CorrectCont=1)write_1602com(er);for(i=0;i16;i+)write_1602dat(Inputi);/=重置密码=void ResetPassword(void)uchar i;uchar j;if(pass=0)pass=0;DisplayC
38、har();elseif(ReInputEn=1)if(N=6)ReInputCont+;if(ReInputCont=2)for(i=0;i6;)if(TempPasswordi=InputDatai) /将两次输入的新密码作对比i+;elsewrite_1602com(er);for(j=0;j16;j+)write_1602dat(Errorj);pass=0;ReInputEn=0; /关闭重置功能,24ReInputCont=0;DisplayChar();break; if(i=6)write_1602com(er);for(j=0;j16;j+)write_1602dat(Res
39、etOKj);WrToROM(TempPassword,0,6); /将新密码写入 24C02存储ReInputEn=0;ReInputCont=0;CorrectCont=0;elsewrite_1602com(er);for(j=0;j16;j+)write_1602dat(againj);for(i=0;i6;i+)TempPasswordi=InputDatai; /将第一次输入的数据暂存起来N=0; /输入数据位数计数器清零/=取消所有操作=void Cancel(void)uchar i;25uchar j; write_1602com(er);for(j=0;j16;j+)wri
40、te_1602dat(start_linej);for(i=0;i6;i+)InputDatai=0;lock_led=0; /锁operation=0; /操作标志位清零pass=0; /密码正确标志清零ReInputEn=0; /重置输入充许标志清零CorrectCont=0; /密码正确输入次数清零ReInputCont=0; /重置密码输入次数清零 open_led=1;s3_keydown=0;N=0; /输入位数计数器清零/=确认键,并通过相应标志位执行相应功=void Ensure(void)uchar i,j;RdFromROM(CurrentPassword,0,6); /从
41、 24C02 里读出存储密码if(N=6)if(ReInputEn=0) /重置密码功能未开启for(i=0;i6;)if(CurrentPasswordi=InputDatai)i+;else TR0=1; /开启定时pass=0;break;26if(i=6)CorrectCont+;if(CorrectCont=1) /正确输入计数,当只有一次正确输入时,开锁,write_1602com(er);for(j=0;j16;j+)write_1602dat(LockOpenj);lock_led=1; /开锁pass=1; /置正确标志位TR0=1; /开启定时open_led=0; /开锁
42、指示灯亮for(j=0;j6;j+) /将输入清除InputDatai=0;else /当两次正确输入时,开启重置密码功能write_1602com(er);for(j=0;j16;j+)write_1602dat(SetNewj);ReInputEn=1; /允许重置密码输入CorrectCont=0; /正确计数器清零else /当第一次使用或忘记密码时可以用 131420 对其密码初始化if(InputData0=1) /强制将初始密码写入 24C02 存储write_1602com(er); /显示初始化密码27for(j=0;j16;j+)write_1602dat(initword
43、j);Delay400Ms();N=0;elsewrite_1602com(er);for(j=0;j16;j+)write_1602dat(Errorj);pass=0;else /当已经开启重置密码功能时,而按下开锁键,write_1602com(er);for(j=0;j16;j+)write_1602dat(Er_tryj);else/DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j16;j+)write_1602dat(Errorj);pass=0;N=0; /将输入数据计数器清零,为下一次输入作准备operation=1;
44、28/=主函数=void main(void)uchar KEY,NUM;uchar i,j;P1=0xFF;lock_led=0; TMOD=0x11;TL0=0xB0;TH0=0x3C;EA=1;ET0=1;TR0=0;Delay400Ms(); /启动等待,等 LCM 讲入工作状态lcd_init(); /LCD 初始化write_1602com(yi);/日历显示固定符号从第一行第 0 个位置之后开始显示for(i=0;i20;i+)write_1602dat(namei);/向液晶屏写日历显示的固定符号部分write_1602com(er);/时间显示固定符号写入位置,从第 2 个位
45、置后开始显示for(i=0;i16;i+)write_1602dat(start_linei);/写显示时间固定符号,两个冒号write_1602com(er+9); /设置光标位置write_1602com(0x0f); /设置光标为闪烁Delay5Ms(); /延时片刻(可不要)N=0; /初始化数据输入位数while(1)KEY=keynum();if(KEY!=0)NUM=coding(KEY);switch(NUM)case (A): ; break;case (B): ; break;29case (C): ; break;case (D): ResetPassword(); br
46、eak; /重新设置密码case (*): Cancel(); break; /取消当前输入case (#): Ensure(); break; /确认键,default: write_1602com(er);for(i=0;i16;i+)write_1602dat(Inputi);operation=0;if(N6) /当输入的密码少于 6位时,接受输入并保存,大于 6 位时则无效。 InputDataN=NUM;for(j=0;j=N;j+)write_1602com(er+6+j);write_1602dat(InputDataj);/*);N+;else /输入数据位数大于 6 后,忽略输入N=6;break; /*中断服务函数*