资源描述
目 录
福建电力职业技术学院
课 程 设 计
课程名称: 智能仪器
题目: 电子密码锁
专业班次: 09(三)电气2
姓 名: 郑雪婷
学 号: 200902123217(13号)
指导教师: 张继伟
学 期: 2010-2011学年 第二学期
日 期: 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 振荡电路 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
引言
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。
基于以上思路,本次设计使用ATMEL公司的AT89C51实现一基于单片机的电子密码锁的设计,其主要具有如下功能:
设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。
密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
报警、锁定键盘功能。密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。
电子密码锁的设计主要由三部分组成:4×4矩阵键盘接口电路、密码锁的控制电路、输出八段显示电路。另外系统还有LED提示灯,报警蜂鸣器等。
密码锁设计的关键问题是实现密码的输入、清楚、更改、开锁等功能:
密码输入功能:按下一个数字键,一个“-”就显示在最右边的数码管上,同时将先前输入的所有“-”向左移动一位。
密码清除功能:当按下清除键时,清除前面输入的所有值,并清除所有显示。
密码更改功能:将输入的值作为新的密码。
开锁功能:当按下开锁键,系统将输入与密码进行检查核对,如果正确锁打开,否则不打开。
第一章 设计内容及要求
1.1 背景
随着社会物质财富的日益增长,安全防盗已成为社会问题。而锁自古以来就是把守门户的铁将军,人们对它要求甚高,既要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。目前国内,大部分人使用的还是传统的机械锁。然而,眼下假冒伪劣的机械锁泛滥成灾,互开率非常之高。所谓互开率,是各种锁具的一个技术质量标准,也就是1把钥匙能开几把锁的比率。经国家工商局、国家内贸局、中国消协等部门对锁具市场的调查,发现个别产品的互开率居然超标26倍。
为何弹子锁的“互开率”会如此之高?据有关专家人士剖析,弹子锁质量好坏主要取决于弹子数量的多少以及弹子的大小,而弹子的多少和大小受一定条件的限制。此外,即使是一把质量过关的机械锁,通过急开锁,甚至可以在不损坏锁的前提下将锁打开。机械锁的这些弊端为一种新型的锁---电子密码锁,提供了发展的空间。
1.2 电子锁
电子锁是采取电子电路控制,以电磁铁或者卫星电机和锁体作为执行装置的机电一体化锁具,相比传统的机械锁具,电子锁不使用金属钥匙,保密性、精度都有很大提高。
电子锁的发明思路,源自古代发明的自动机械,例如古希腊数学家赫伦的液压自动门,中国古代诸葛亮的木牛流马,它们以重力或蒸汽压力驱动,最广泛的用途乃是用在古代墓道的地下机关。电子工业的诞生,使得以微小电量驱动机械成为可能,于是有了电子锁一日千里的跃进。
1.3 电子密码锁的特点
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁,主要特点如下:
保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。
密码可变。 用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。
误码输入保护。当输入密码多次错误时,报警系统自动启动,防止试探密码。
1.4 电子密码锁的发展趋势
从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一部分应用于保管箱和运钞车。键盘式电子密码在键盘上输入,与打电话差不多,因而易于掌握,其突出优点是“密码”是记在被授权人脑子里的数字和字符,既准确又可靠,不会丢失(除了忘记),难以被窃(除非自己泄露)。但是密码不能太简单,太简单了就容易被他人在键盘上试探出来,或者可能被旁观者窥测出来,造成保密性不足。当然,密码又不能太复杂,太复杂了可能自己都糊涂了,或者输入密码操作成功率低,造成使用不便。因此,为了发扬优点、克服弱点,键盘式电子密码也在不断发展中,如“任意设定密码”技术使得被授权人可以根据自己的需要或喜好设定密码,常用常新;而“自动更改密码”技术使得本次输入的密码将自动更改成下次应输入的密码,更改的规律不为他人所知,因而不怕旁观者窥测;独出心裁的“键盘乱序显示”技术使得键盘上的固定键位每次显示出的字符不固定,并且显示的窄小角度只能由操作者正面看得到,因而即使旁观者看见操作动作也难以窥测出密码;“多重密码设定”技术使得单组密码不一定有效,适合多人分权使用,需要输入两组以上的密码才被认可,大大提高了保密性,如果限定输入这些密码的先后顺序或时间区段,则保密性还可提高。在输入密码的过程中,为了限制试探密码的企图,通常输入错误码若干次或若干时间内输入不正确,即“封锁”键盘,不再接受输入操作。总之,尽管新式电子防盗锁层出不穷,但键盘式电子密码防盗锁不仅在市场上居于主流地位,而且,还经常作为其他类型电子防盗锁的辅助输入手段。
第二章 系统总体设计
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、8、9、*、#、CLE、Enter、MODIFY(更改)。系统开始显示“INPUT”提示输入密码;输入密码时,LCD显示电路显示为“-”,当密码输入完毕按下Enter键时,对输入密码与设定的密码进行比较,若密码正确则LCD显示电路显示为“PASS”提示锁打开;若密码不正确,LCD显示电路显示提示“ERROR”,若连续3次输入不正确,则发出警报声同时锁定键盘。
在输入正确密码后,按下修改键时,LCD显示电路显示“old”提示“输入旧密码”,此时输入正确的旧密码,则显示电路会有提示输入新密码在输入新密码后,显示电路会再次提示“再次输入新密码”若两次输入密码不一致,则修改密码失败,一致则成功。在修改密码的过程中,如果一开始输入的旧密码错误显示电路会显示提示,同时系统返回到开始。
若在“再次输入新密码”的时候输入新密码与前次不一致,则会返回到系统开始。修改密码完成后,系统自动清零上锁。要再次开锁则需要输入正确的密码。
系统中CEL键用于退格,在输入密码时,若输入错误且未按下Enter键,按下CLE可以删除刚输入的密码,然后再次输入。
为了防止恶意尝试,系统才用若连续输入3次错误密码则发出报警声,且锁定键盘,可以提高系统的安全系数,同时也能够保护合法用户的正常使用。
第三章 硬件电路设计
3.1 单片机AT89C51简介
AT89C51是美国ATMEL公司生产的低电压,高性能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条可编程I/O线
· 两个16位定时器/计数器
· 6个中断源
· 可编程串行通道
· 低功耗的闲置和掉电模式
· 片内振荡器和时钟电路
图3.1
3.1.2 管脚说明
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当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口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
管脚 备选功能:
P3.0 RXD(串行输入口)
P3.1 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端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
3.1.3 震荡特性
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
3.2 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)。经计算得单片机工作的机器周期为:
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
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。由于蜂鸣器使用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
表3-1
第四章 软件程序设计
本系统程序部分使用C语言编写,C语言是一种高级程序设计语言,它的优点是简洁明了、可移植性高。
该模块将输入密码字符串与设定密码字符串比较。如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。
4.1 密码读取模块
首先预读入密码的字符数组清零,显示位置清空,然后读取键值。先判断此时是否是在第九个键值输入了数字键值,如果是不响应重新读入,这样可以防止读入字符串溢出,造成密码读取错误。然后通过switch语句5处理键值(字母键值),并将读取位置、显示位置进行相关调整;如果输入的是数字有效键值,存入当前指向的字符数组空间,其后将键值变量清零准备读取下一个键值。进行循环读取,直到成功读取8位密码或者因为输入了确定键提前完成读取工作。
第一次读入密码
第二次读入密码
保存密码,提示成功
判断两次密码
相同
不相同
4.2 密码设置模块
在系统进行初始化时,要求设置密码。整体思路是要求读取一组密码,保存在临时空间,然后再次读取密码,如果相同,证明设置成功,将新密码覆盖进标准密码数组里,如果两次的密码不同,显示错误信息,要求重新输入。
图4.5.1密码设置模块
模块启动
验证密码
判断错误
次数
显示错误信息并返回
发出报警系统锁死
发出报警
系统锁死
连续错误次数小于三次
密码正确
密码错误
4.3 密码比较模块
连续错误次数小于三次
该模块将输入密码字符串与设定密码字符串比较。如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。逻辑框图如图4.6.1。
图4.6.1密码比较模块
4.4 声光状态模块
本模块通过读取相关控制变量,控制声光部件的状态。当闭锁状态点亮红灯,开锁状态点亮绿灯;当需要进行异常告警时,利用延时函数周期性的变换蜂鸣器的响静。鸣响状态下,响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
表4—1
显示方式分别有静态显示与动态显示两种。
在显示提示信息如:输入密码“INPUT”,操作通过“PASS”,操作错误“ERROR”,输入旧密码“OLD”,输入新密码“NE”,再次输入“AGAIN”等信息时使用的是动态显示。
由于8个显示器的段码同名端是连接在一起的,如果选码的管脚(本系统中为P1)都为0,那么8个显示器则显示同一字符。要使各个数码管出现不同字符必须采用“分时动态扫描”的方法显示。即每次点亮一个LED显示器,延时一段时间再点亮下一个LED显示器……周而复始,8个LED显示器轮流动态扫描。利用人视觉余辉的暂留效应,看起来好像几个显示器上“同时”显示不同的字符。如子程序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
for(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=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口的低四位作为行扫描线,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()如下:
/*加上行扫描信号后,判断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(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;}
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]中的六位比对,若两次密码输入一直,即将新的密码,也就是check2[6]和check2[6]中的六位赋值到PASSWORD[6]中。此时修改密码工作完成,系统将跳翻到开始,即提示输入密码“INPUT”。
第五章 总结
通过这次课程设计,让我学习了很多知识,同时锻炼了自己的动手能力和查阅资料。尤其是解决在实际中解决排查问题的能力。
1、 通过这次的设计,我熟悉了使用Protel的技巧,并且熟悉了如何选购使用电子元器件。
2、 在设计中,我学到了如何使用C语言对单片机进行编写程序,熟悉了使用KEIL C软件,并且加深了对单片机的编程技巧。
3、 在做这个设计的过程中,我遇到了不少的问题。这锻炼了我筛选、查阅资料,并将理论结合到自己的设计中的能力。一步一步的排除故障原因,找到故障的原因并解决故障。
4、 这次的设计使我对模拟电子、数字电子知识加深了了解,尤其是在对电路进行调试的时候,出现了很多这些方面的问题,通过对以往知识的复习巩固,将问题解决。
这次的设计有很多的不足,和市场上的产品有一定的差距,例如没有使用液晶显示屏,电动锁的部分在实物中使用一个LED代替等,还可以做得更好,还请老师同学们提出宝贵意见!
- 28 -
参考文献
参考文献
[1] 当方.微型计算机控制技术[M].中国水利水电出版社,2001年
[2] 胡汉才.单片机原理及其借口技术[M].清华大学出版社,1996年
[3] 赵新民.智能仪器设计基础[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].北京:人民邮电出版社,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"
#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 //数据读、写操作,画面不动
//设置显示、光标及闪烁开、关
#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 //光标闪烁
#define 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 //光标右移一位
//工作方式设置
#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'},
{'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; //系统环境变量 分别为锁状态、连续错误次数、读入键值
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; //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(); //初始化函数
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_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=
展开阅读全文