1、目 录 福建电力职业技术学院 课 程 设 计 课程名称: 智能仪器 题目: 电子密码锁 专业班次: 09(三)电气2 姓 名: 郑雪婷 学 号: 200902123217(13号) 指导教师: 张继伟 学 期: 2010-2011学年 第
2、二学期 日 期: 2011.6 目 录 福建电力职业技术学院 I 课 程 设 计 I 引言 1 第一章 设计内容及要求 2 1.1 背景 2 1.2 电子锁 2 1.3 电子密码锁的特点 3 1.4 电子密码锁的发展趋势 3 第二章 系统总体设计 4 2.1 系统结构 4 第三章 硬件电路设计 6 3.1 单片机AT89C51简介 6 3.1.1 主要特性 6 3.1.2 管脚说明 6 3.1.3 震荡特性 8 3.2 4×4矩阵键盘 8 3.3 复位电路 9 3.4
3、 振荡电路 9 3.5 发光二极管LED 9 3.6 蜂鸣器 10 3.9完整电路图 11 第四章 软件程序设计 12 4.1 密码读取模块 12 4.2 密码设置模块 13 4.3 密码比较模块 13 4.4 声光状态模块 13 第五章 总结 16 参考文献 18 附 录 22 引言 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越
4、来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。 在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。 随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。
5、但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。 基于以上思路,本次设计使用ATMEL公司的AT89C51实现一基于单片机的电子密码锁的设计,其主要具有如下功能: 设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。 密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防
6、止误操作。 报警、锁定键盘功能。密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。 电子密码锁的设计主要由三部分组成:4×4矩阵键盘接口电路、密码锁的控制电路、输出八段显示电路。另外系统还有LED提示灯,报警蜂鸣器等。 密码锁设计的关键问题是实现密码的输入、清楚、更改、开锁等功能: 密码输入功能:按下一个数字键,一个“-”就显示在最右边的数码管上,同时将先前输入的所有“-”向左移动一位。 密码清除功能:当按下清除键时,清除前面输入的所有值,并清除所有显示。 密码更改功能:将输入的值作为新的密码。 开锁功能:当按下开锁键,系统将输入与密码进行
7、检查核对,如果正确锁打开,否则不打开。 第一章 设计内容及要求 1.1 背景 随着社会物质财富的日益增长,安全防盗已成为社会问题。而锁自古以来就是把守门户的铁将军,人们对它要求甚高,既要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。目前国内,大部分人使用的还是传统的机械锁。然而,眼下假冒伪劣的机械锁泛滥成灾,互开率非常之高。所谓互开率,是各种锁具的一个技术质量标准,也就是1把钥匙能开几把锁的比率。经国家工商局、国家内贸局、中国消协等部门对锁具市场的调查,发现个别产品的互开率居然超标26倍。 为何弹子锁的“互开率”会如此之高?据有关专家人士剖
8、析,弹子锁质量好坏主要取决于弹子数量的多少以及弹子的大小,而弹子的多少和大小受一定条件的限制。此外,即使是一把质量过关的机械锁,通过急开锁,甚至可以在不损坏锁的前提下将锁打开。机械锁的这些弊端为一种新型的锁---电子密码锁,提供了发展的空间。 1.2 电子锁 电子锁是采取电子电路控制,以电磁铁或者卫星电机和锁体作为执行装置的机电一体化锁具,相比传统的机械锁具,电子锁不使用金属钥匙,保密性、精度都有很大提高。 电子锁的发明思路,源自古代发明的自动机械,例如古希腊数学家赫伦的液压自动门,中国古代诸葛亮的木牛流马,它们以重力或蒸汽压力驱动,最广泛的用途乃是用在古代墓道的地下机关。电子工业的诞
9、生,使得以微小电量驱动机械成为可能,于是有了电子锁一日千里的跃进。 1.3 电子密码锁的特点 电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁,主要特点如下: 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。 密码可变。 用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。 误码输入保护。当输入密码多次错误时,报警系统自动启动,防止试探
10、密码。 1.4 电子密码锁的发展趋势 从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一部分应用于保管箱和运钞车。键盘式电子密码在键盘上输入,与打电话差不多,因而易于掌握,其突出优点是“密码”是记在被授权人脑子里的数字和字符,既准确又可靠,不会丢失(除了忘记),难以被窃(除非自己泄露)。但是密码不能太简单,太简单了就容易被他人在键盘上试探出来,或者可能被旁观者窥测出来,造成保密性不足。当然,密码又不能太复杂,太复杂了可能自己都糊涂了,或者输入密码操作成功率低,造成使用不便。因此,为了发扬优点、克服弱点,键盘式电子密码也在不断发展
11、中,如“任意设定密码”技术使得被授权人可以根据自己的需要或喜好设定密码,常用常新;而“自动更改密码”技术使得本次输入的密码将自动更改成下次应输入的密码,更改的规律不为他人所知,因而不怕旁观者窥测;独出心裁的“键盘乱序显示”技术使得键盘上的固定键位每次显示出的字符不固定,并且显示的窄小角度只能由操作者正面看得到,因而即使旁观者看见操作动作也难以窥测出密码;“多重密码设定”技术使得单组密码不一定有效,适合多人分权使用,需要输入两组以上的密码才被认可,大大提高了保密性,如果限定输入这些密码的先后顺序或时间区段,则保密性还可提高。在输入密码的过程中,为了限制试探密码的企图,通常输入错误码若干次或若干时
12、间内输入不正确,即“封锁”键盘,不再接受输入操作。总之,尽管新式电子防盗锁层出不穷,但键盘式电子密码防盗锁不仅在市场上居于主流地位,而且,还经常作为其他类型电子防盗锁的辅助输入手段。 第二章 系统总体设计 2.1 系统结构 电源 AT89C51 数码管 蜂鸣器 LED 4×4键盘 复位电路 图2.1 如图2.1所示系统主要由AT89C51(51系列)、八位数码管、蜂鸣器、LED、4×4矩阵键盘、复位电路等组成。 系统工作原理分析:使用AT59C51单片机、4×4矩阵键盘、LCD、蜂鸣器等。矩阵键盘分别为0、1、2、3、4、5、6、7
13、8、9、*、#、CLE、Enter、MODIFY(更改)。系统开始显示“INPUT”提示输入密码;输入密码时,LCD显示电路显示为“-”,当密码输入完毕按下Enter键时,对输入密码与设定的密码进行比较,若密码正确则LCD显示电路显示为“PASS”提示锁打开;若密码不正确,LCD显示电路显示提示“ERROR”,若连续3次输入不正确,则发出警报声同时锁定键盘。 在输入正确密码后,按下修改键时,LCD显示电路显示“old”提示“输入旧密码”,此时输入正确的旧密码,则显示电路会有提示输入新密码在输入新密码后,显示电路会再次提示“再次输入新密码”若两次输入密码不一致,则修改密码失败,一致则成功。在
14、修改密码的过程中,如果一开始输入的旧密码错误显示电路会显示提示,同时系统返回到开始。 若在“再次输入新密码”的时候输入新密码与前次不一致,则会返回到系统开始。修改密码完成后,系统自动清零上锁。要再次开锁则需要输入正确的密码。 系统中CEL键用于退格,在输入密码时,若输入错误且未按下Enter键,按下CLE可以删除刚输入的密码,然后再次输入。 为了防止恶意尝试,系统才用若连续输入3次错误密码则发出报警声,且锁定键盘,可以提高系统的安全系数,同时也能够保护合法用户的正常使用。 第三章 硬件电路设计 3.1 单片机AT89C51简介 AT89C51是美国ATMEL公司生产的低电压,高性
15、能CMOS8位单片机,片内含4K bytes的可反复擦写的只读程序存储器(EPROM)和128bytes的随机存取数据序存器(RAM),器件采用ATMEL公司的高密度/非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,AT89C51单片机为许多嵌入式控制系统提供了一种灵活行高且价廉的方案。 3.1.1 主要特性 ·8031 CPU与MCS-51 兼容 · 4K字节可编程FLASH存储器(寿命:1000写/擦循环) · 全静态工作:0Hz-24KHz · 三级程序存储器保密锁定 · 128*8位内部RAM · 32条可编
16、程I/O线 · 两个16位定时器/计数器 · 6个中断源 · 可编程串行通道 · 低功耗的闲置和掉电模式 · 片内振荡器和时钟电路 图3.1 3.1.2 管脚说明 VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口
17、当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存
18、储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示: 管脚 备选功能: P3.0 RXD(串行输入口) P3.1
19、 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(计时器0外部输入) P3.5 T1(计时器1外部输入) P3.6 /WR(外部数据存储器写信号位) P3.7 /RD(外部数据存储器读信号位) P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率
20、的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
21、注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 3.1.3 震荡特性 XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 3.2
22、 4×4矩阵键盘 如图所示,本系统采用4×4矩阵键盘,16个按键分为输入数字键:*左移、0、#右移、1、2、3、4、5、6、7、8、9;在输入密码是L\R分别实现输入位置的左右移动,B为退格键,C为清除键,清楚当前所有的输入字符, S为功能扩展键,暂时未定义,E为确认键 图3.2 3.3 复位电路 图3.3 时钟电路工作后,在REST管脚上加两个机器周期的高电平,芯片内部开始进行初始复位(如图3.3)。 3.4 振荡电路 图3.4 本设计晶振选择频率为12MHZ,电容选择30pF如图(3.4)。经计算得单片机工作的机
23、器周期为: 12×(1÷12M)=1us。 3.5 发光二极管LED 图3.6 发光二极管是由Ⅲ-Ⅳ族化合物,其核心是PN结。因此它具有一般P-N结的I-N特性,即正向导通,反向截止、击穿特性。此外,在一定条件下,它还具有发光特性。在正向电压下,电子由N区注入P区,空穴由P区注入N区。进入对方区域的少数载流子(少子)一部分与多数载流子(多子)复合而发光。由于LED使用P0口驱动要加上上拉电阻如图3.7。 3.6 蜂鸣器 图3.8 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子
24、设备、电话机、定时器等电子产品中作发声器件。由于蜂鸣器使用P0口驱动要加上上拉电阻如图3.9。 3.9完整电路图 图3.9 ·3.10 使用到的元器件列表 元器件 规格/型号 数量 四位八段共阴数码管 3461AFR1-B10 1 四位八段共阴数码管 SR42036 1 三极管 SR9013 8 三极管 S965 1 电阻 27k 8 电阻 10k 1 电阻 1k 4 电解电容 0.47uF/50V 1 瓷片电容 30pF 2 单片机 AT89C51 1
25、 表3-1 第四章 软件程序设计 本系统程序部分使用C语言编写,C语言是一种高级程序设计语言,它的优点是简洁明了、可移植性高。 该模块将输入密码字符串与设定密码字符串比较。如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。 4.1 密码读取模块 首先预读入密码的字符数组清零,显示位置清空,然后读取键值。先判断此时是否是在第九个键值输入了数字键值,如果是不响应重新读入,这样可以防止读入字符串溢出,造成密码读取错误。然后通过switch语句5处理键值(字
26、母键值),并将读取位置、显示位置进行相关调整;如果输入的是数字有效键值,存入当前指向的字符数组空间,其后将键值变量清零准备读取下一个键值。进行循环读取,直到成功读取8位密码或者因为输入了确定键提前完成读取工作。 第一次读入密码 第二次读入密码 保存密码,提示成功 判断两次密码 相同 不相同 4.2 密码设置模块 在系统进行初始化时,要求设置密码。整体思路是要求读取一组密码,保存在临时空间,然后再次读取密码,如果相同,证明设置成功,将新密码覆盖进标准密码数组里,如果两次的密码不同,显示错误信息,要求重新输入。 图4.5.1密码设置模块 模块启动 验证
27、密码 判断错误 次数 显示错误信息并返回 发出报警系统锁死 发出报警 系统锁死 连续错误次数小于三次 密码正确 密码错误 4.3 密码比较模块 连续错误次数小于三次 该模块将输入密码字符串与设定密码字符串比较。如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。逻辑框图如图4.6.1。 图4.6.1密码比较模块 4.4 声光状态模块 本模块通过读取相关控制变量,控制声光部件的状态。当闭锁状态点亮红灯,开锁状态点亮绿灯;当需要进行异常告警时,利用延时函数
28、周期性的变换蜂鸣器的响静。鸣响状态下,响250ms,停250ms;鸣响状态保持50s后,静止10s,后继续进入鸣响状态,如此反复。 ·4.4 显示功能 4位数码管上的管脚 单片机输出管脚 a 11 P3.7 b 7 P3.2 c 4 P3.1 d 2 P3.5 e 1 P3.6 f 10 P3.3 g 5 P3.0 h 3 P3.4 本系统使用共阴极数码管显示(如图3-5)。选码由P3口输出高电平有效,选位由P1口输出低电平有效。显示原理如下图及下表: 图4.4
29、 表4—1 显示方式分别有静态显示与动态显示两种。 在显示提示信息如:输入密码“INPUT”,操作通过“PASS”,操作错误“ERROR”,输入旧密码“OLD”,输入新密码“NE”,再次输入“AGAIN”等信息时使用的是动态显示。 由于8个显示器的段码同名端是连接在一起的,如果选码的管脚(本系统中为P1)都为0,那么8个显示器则显示同一字符。要使各个数码管出现不同字符必须采用“分时动态扫描”的方法显示。即每次点亮一个LED显示器,延时一段时间再点亮下一个LED显示器……周而复始,8个LED显示器轮流动态扫描。利用人视觉余辉的暂留效应,看起来好像几个显示器上“同时”显示不同的字符。如
30、子程序view_input_password(): void view_input_password(void) { for(i=0;i<200;i++) {P3=0X48;P1=0XFe;}//第四个显示器显示I for(i=0;i<200;i++) {P3=0X43;P1=0X7F;}//第五个显示器显示N for(i=0;i<200;i++) {P3=0XCD;P1=0XBF;}//第六个显示器显示P for(i=0;i<200;i++) {P3=0X62;P1=0XDF;}//第七个显示器显示U f
31、or(i=0;i<200;i++) {P3=0X69;P1=0XEF;}//第八个显示器显示T } 静态显示应用在输入密码时数码管的显示进行输入密码操作时,每输入一位密码数码管显示一个“-”,实施方法为:当有第一个按键时,第八个数码管的片选信号为低电平,其他为高。当有第二个按键时,第八、第七个数码管的片选信号为低,其他为高,如此类推。 如子程序input_view(): void input_view(void) //k为判断输入第几位的变量 {switch(k) case 0:P1=0XEF;P3=0X01;//显示由右至左1个“-” case 1:P1=
32、0XcF;P3=0X01;//显示由右至左2个“-” case 2:P1=0X8F;P3=0X01;//显示由右至左3个“-” case 3:P1=0X0F;P3=0X01;//显示由右至左4个“-” case 4:P1=0X0E;P3=0X01;//显示由右至左5个“-” case 5:P1=0X0A;P3=0X01;//显示由右至左6个“-” } ·4.4.1 键盘扫描 如图3-2,本系统使用4×4矩阵键盘当没有键按下时,行线和列线之间是不相连的,若第N行与第M列的键被按下,那么第N行与第M列的线就被接通。 根据上述原理,本系统的键盘扫描方法是利用P2口的低
33、四位作为行扫描线,P2口的高四位作为列回扫线。具体实施方法为:先使P2.0口输出低电平,P2口其他口输出高电平,然后对P2.4、P2.5、P2.6、P2.7四个口分别作判断。若此四口都为高电平,则没有键按下;若有键按下,P2.4、P2.5、P2.6、P2.7四个口必定有一个口输入为低电平,再判断P2.4、P2.5、P2.6、P2.7哪个口为低电平则可判断按键在哪列上。如P2.4、P2.5、P2.6、P2.7没有低电平,再使P2.1为低电平,其他口为高电平,依次扫描下去,找到按键所在的行,再判断P2口的高四位哪一位为低,便可知道键在哪一列上。键盘扫描子程序key()如下: /*加上行扫描信号后
34、判断P2口高四位同时给标记变量falg赋值并跳出循环*/ void key(void) {while(1) { P2=0XFE;if(P2_4==0){falg=1;break;} if(P2_5==0){falg=2;break;} if(P2_6==0){falg=3;break;} if(P2_7==0){falg=4;break;} P2=0XFd;if(P2_4==0){falg=5;break;} if(P2_5==0){falg=6;break;} if
35、P2_6==0){falg=7;break;} if(P2_7==0){falg=8;break;} P2=0XFb;if(P2_4==0){falg=9;break;} if(P2_5==0){falg=10;break;} if(P2_6==0){falg=11;break;} if(P2_7==0){falg=12;break;} P2=0XF7;if(P2_4==0){falg=13;break;} if(P2_5==0){falg=14;break;}
36、 if(P2_6==0){falg=15;break;} if(P2_7==0){falg=16;break;} } } ·4.4.2 修改密码 本系统设定的修改密码过程为,在输入正确的密码后,按modify,此时提示输入旧密码“old”,输入正确的旧密码后,可以输入新密码。此时键入的六位新密码将保存到数组check[6]中。然后显示器提示再次输入,输入完毕后,第二次输入的密码将保存在check2[6]中,然后将check[6]中六位分别与check2[6]中的六位比对,若两次密码输入一直,即将新的密码,也就是chec
37、k2[6]和check2[6]中的六位赋值到PASSWORD[6]中。此时修改密码工作完成,系统将跳翻到开始,即提示输入密码“INPUT”。 第五章 总结 通过这次课程设计,让我学习了很多知识,同时锻炼了自己的动手能力和查阅资料。尤其是解决在实际中解决排查问题的能力。 1、 通过这次的设计,我熟悉了使用Protel的技巧,并且熟悉了如何选购使用电子元器件。 2、 在设计中,我学到了如何使用C语言对单片机进行编写程序,熟悉了使用KEIL C软件,并且加深了对单片机的编程技巧。 3、 在做这个设计的过程中,我遇到了不少的问题。这锻炼了我筛选、查阅资料,并将理论结合到自己的设计中的能力
38、一步一步的排除故障原因,找到故障的原因并解决故障。 4、 这次的设计使我对模拟电子、数字电子知识加深了了解,尤其是在对电路进行调试的时候,出现了很多这些方面的问题,通过对以往知识的复习巩固,将问题解决。 这次的设计有很多的不足,和市场上的产品有一定的差距,例如没有使用液晶显示屏,电动锁的部分在实物中使用一个LED代替等,还可以做得更好,还请老师同学们提出宝贵意见! - 28 - 参考文献 参考文献 [1] 当方.微型计算机控制技术[M].中国水利水电出版社,2001年 [2] 胡汉才.单片机原理及其借口技术[M].清华大学出版社,1996年 [3] 赵新民.智能仪器设
39、计基础[M].哈尔滨工业大学出版社,1999年 [4] 潘新,民王,燕芳.微型计算机控制技术[M].电子工业出版社,2003年 [5] 李钟实.实用电子报警器精选百例[M].北京:科技技术文献出版社,2002年 [6] 陈爱弟.Protel99se实用培训教程[M].人民邮电出版社,2000年。 [7] 阎石.数字电子技术基础[M].高等教育出版社,1998年 [8] 童诗白.模拟电子技术基础[M].高等教育出版涉,1998年 [9] 候振鹏.嵌入式C语言程序设计[M].北京:人民邮电出版社,2006年 [10] 徐士良.C语言程序设计教程[M].北京:人民邮电出版社
40、2001年 [11] Brian W. Kernighan.The C Programming Language. Prentice Hall PTR,1988 [12] Janice Mazidi.8051 Microcontroller and Embedded Systems. Prentice Hall,1999 [13] [14] [15] [16] 附 录 电子密码锁源程序: #include"reg51.h" #include "string.h" #
41、define LCD_DATA P0 //LCD的数据口 //输入方式设置 #define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一 #define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一 #define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移 #define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
42、//设置显示、光标及闪烁开、关 #define LCD_DISPLAY_ON 0x0C //显示开 #define LCD_DISPLAY_OFF 0x08 //显示关 #define LCD_CURSOR_ON 0x0A //光标显示 #define LCD_CURSOR_OFF 0x08 //光标不显示 #define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁 #def
43、ine LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁 //光标、画面移动,不影响DDRAM #define LCD_LEFT_MOVE 0x18 //LCD显示左移一位 #define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位 #define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位 #define LCD_CURSOR_RIGHT_MOVE 0x14
44、//光标右移一位 //工作方式设置 #define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示 #define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示 unsigned char code tab[4][4]={ {'1','2','3','C'}, {'4','5','6','B'}, {'7','8','9','S'}, {
45、'L','0','R','E'}}; //键盘键值表 unsigned char input_password[9]={0,0,0,0,0,0,0,0,'\0'}; //临时读入密码数组 unsigned char normal_password[9]={"12345678"}; //密码存储数组 unsigned char temp_normal_password[9]={"12345678"}; //临时设定密码数组 unsigned char lock=0,miss=0,key=0; //系统环境变量 分别为锁状态、连续错
46、误次数、读入键值 sbit beep=P3^2; //蜂鸣器控制变量 sbit LEDR=P3^4; //开锁指示灯控制变量 sbit LEDE=P3^6; //闭锁指示灯控制变量 sbit LCD_BUSY=LCD_DATA^7; //LCD忙信号位 sbit LCD_RW=P2^0; //LCD读写控制 sbit LCD_RS=P2^1; //LCD寄存器选择 sbit LCD_EN=P2^2; //
47、LCD使能信号*/ void LCD_cls(void); void LCD_write_data(unsigned char); void LCD_initial(void); void LCD_set_position(unsigned char); void LCD_prints(unsigned char *); void LCD_printc(unsigned char); void didi(); //蜂鸣报警模块函数 void verify_password (); //开锁判断模块函数 void Load
48、); //初始化函数 void First(); void read_password (); //读入密码模块函数 void Set_password(); //设定密码模块函数 void delay(unsigned char a); //毫秒延时模块函数 unsigned char kbscan(); //键盘扫描模块函数 void LCD_check_busy(void) //检测LCD状态 { while(1) { LCD_
49、EN=0; LCD_RS=0; LCD_RW=1; LCD_DATA=0xff; LCD_EN=1; if(!LCD_BUSY)break; } LCD_EN=0; } void LCD_cls(void) //LCD清屏 { LCD_check_busy(); LCD_RS=0; LCD_RW=0; LCD_DATA=1; LCD_EN=1; LCD_EN=0; } void LCD_write_instruction(unsigned char LCD_instruction) //写指令到LCD { LCD_check_busy(); LCD_RS=0; LCD_RW=0; LCD_DATA=LCD_instruction; LCD_EN=1; LCD_EN=0; } void LCD_write_data(unsigned char LCD_data) //输出一个字节数据到LCD { LCD_check_busy(); LCD_RS=1; LCD_RW=






