《电气0703袁利军-单片机课程设计电子密码锁》由会员分享,可在线阅读,更多相关《电气0703袁利军-单片机课程设计电子密码锁(23页珍藏版)》请在金锄头文库上搜索。
1、目 录第1章 系统概述11.1系统功能11.2设计内容及要求1第2章 系统方案设计22.1总体方案22.2系统组成2第3章 硬件设计33.1按键电路设计33.2指示灯及报警蜂鸣器的电路设计33.3显示电路设计43.4 复位键的设计4第4章 软件设计54.1主程序设计54.2按键识别与编码设计64.3显示程序设计84.4密码修改程序设计10第五章 系统调试115.1软件模拟调试115.2硬件接线及调试12设计总结13参考文献14附录15第1章 系统概述1.1系统功能 本次设计使用ATMEL公司的AT 80C51实现一基于单片机的电子密码锁的设计,其主要具有如下功能:(1)设置6位密码,密码通过键
2、盘输入,若密码正确,则将锁打开。(2)默认密码为123456,密码可以由用户自己修改设定(支持不超过6位的任意位密码,也可以不设密码),输入密码正确后才能修改密码。 (3)状态指示、报警、锁定键盘功能。密码输入正确时有GOOD提示信息、密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘,并且相应的有指示灯指明状态。电子密码锁的设计主要由三部分组成:34矩阵键盘接口电路、密码锁的控制电路、输出八段显示电路。另外系统还有LED提示灯,报警蜂鸣器等。1.2设计内容及要求 (1)密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为“123456”共6位密
3、码。(2)密码的输入: 采用数字键盘来完成密码的输入,其中#号按键为确认键,*号键位取消键,其他按键为数字键。在密码输入完毕并且确认功能键之后,才能完成密码的输入过程。然后进入密码的判断比较处理状态并给出相应的处理过程。(3)按键禁止功能:初始化时,允许按键输入密码,当有按键按下并开始进按键识别状态时,按键禁止功能被激活,但启动的状态是在3次密码输入不正确的情况下发生的。第2章 系统方案设计2.1总体方案 本密码锁系统采用80C51做主控制器,控制密码的输入、判断密码的正确与否。首先,系统将允许用户输入密码,用存储单元把输入的密码进行动态的保存,当用户输入完后可以按下“*”表示取消,重新输入密
4、码。当用户输入完后可以按下“#”表示确定,系统将进行密的确认,如果密码正确,则显示GOOD,并且有红灯亮,如果不正确,红灯亮,显示“NO”,用户可以再次进行输入密码,当用户连续三次输入错误时,系统将显示NO,和有报警的声音发出,黄、绿、红灯同时亮,并且把键盘进行锁定,禁止用户进行输入, 扩展功能的实现是在输入了正确的密码之后,如果按“*”键表示放弃对密码的修改。如果按下“#”键,黄灯亮,就可以对默认密码进行修改, 将进入修改密码状态并保存到存储默认密码的单元,按“*”返回再次输入密码。按“#”键确认,显示“GOOD”,密码修改成功,返回主菜单。这样修改功能得以实现。2.2系统组成本系统由单片机
5、80C51系统、矩阵键盘、开关、LED显示和报警系统组成。系统组成原理框图如图2-1所示80C51单片机 复位按钮矩阵键盘控制 一个蜂鸣器状态指示灯LCD六位显示器 2-1 系统组成原理框图第3章 硬件设计3.1按键电路设计 由于设计要求输入数字密码,所以本设计就采用数字键盘,有09共十位数字。检测方法采用线反转法,先检测行后检测列。其原理如图3-1所示。图3-1单片机的键盘接口电路3.2指示灯及报警蜂鸣器的电路设计 指示灯及报警蜂鸣器的电路如图3-2所示,当输入的密码正确时,绿灯亮;当输入的密码错误时,红灯亮;当三次错误输入时,绿灯和蓝灯和红灯同时亮并且报警法名器发出报警。图3-2指示灯及报
6、警蜂鸣器的电路3.3显示电路设计 将P1与显示的数据端相连,使其它能动态的传输要显示的数据,将p3的第六位与位选通端相连,选通相应的位。 接线如图3-3所示图3-3显示电路3.4 复位键的设计当密码输入三次错误,则系统锁定键盘输入,按下复位键后,系统重新开始,如此可以防止系统报废,让系统再次循环使用。其硬件图如图3-4所示。图3-4复位键第4章 软件设计4.1主程序设计 主程序主要完成初始化、检查有无按键按下、以及调用显示、指示灯、密码修改等等,流程图如图4-1所示。具体模块包括:1. 按键识别与编码设计2. 显示程序设计3. 密码修改程序设计图4-1主程序流程图4.2按键识别与编码设计当没有
7、按键按下的时候,单片机循环等待按键按下,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。 每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有NM个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对按键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。 对照图4-2-1所示的44键盘,说明扫描法原理。首先辨别键盘中有无键按下,有则单片机I/O口向键盘送全扫描字,然
8、后读入行线状态来判断。把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。图4-2-1键盘比如说扫描码送入00001111,前面的0000是代表列,而后面的1111代表行,是让读取的4行接脚先设高,若此时第一行的第一列按键被按下,那读取的结果就会变成00001110(注意1111变成1110),其中LSB的第一个bit会由1变成0,这是因为这个按键被按下之后,会被垂直的扫描码电位短路接通,而把读取的LSB的bit电位拉到0,如此我们就知
9、道是第一行有按键按下,然后再送入扫描码11110000,同理可以得出是第一列有按键按下,2次半段后就可以知道结果是按键“1”被按下。此即为扫描原理。其流程图如图4-2-2所示。 图4-2-2键盘识别子程序流程图4.3显示程序设计 显示设计采用动态扫描。显示程序流程图如图4-3所示显示程序流程图如图4-3 数码显示板上一共有8 个数码管,如果按照传统的数码管驱动方式(静态扫描方式),则需要8 个七段译码器进行驱动,这样既浪费资源,有时电路工作也不可靠。所以现在最常见的数码管驱动电路已经不用上述的静态扫描方式了,而是采用动态扫描显示的方式,这种方式只需一个译码器就可以实现电路正常、可靠的工作,这样
10、大大节省资源。动态数码扫描显示方式是利用了人眼的视觉暂留效应,把八个数码管按一定顺序(从左至右或从右至左)进行点亮,当点亮的频率(即扫描频率)不大时,我们看到的是数码管一个个的点亮,然而,当点亮频率足够大时,我们看到的不再是一个一个的点亮,而是全部同时显示(点亮),与传统方式得到的视觉效果完全一样。因此我们只要给数码管这样一个扫描频率,那么就可以实现两个以上的数码管同时点亮。而这个频率我们可以通过一个计数器来产生,只要计数频率足够大,就可以实现我们的要求。事实上,因为数码管点亮不是瞬间就可以的,它也需要一定的时间,该时间与数码管的选择有关系。为了折中这一对矛盾,实验中一般可将计数频率选择在10
11、0Hz左右肯定可以满足上述两个要求。动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。在C51指令中,延时子程序是相当简单的,并且延时时间也很容易更改,可参见程序清单中的DELAY延时子程序。 如果显示数字,要为LED显示器提供字型代码。我用的是共阳极的显示器。LED显示器的字形代码如下表所示: LED显示器共阴极十六进制数的字型代码0123456789C0HF9HA4HB0H99H92
12、H82HF8H80H90H主要有三个显示程序组成,分别为按键后的输入密码正确的提示程序,密码输入错误后的提示子程序。询问是否修改密码子程序.图43 a 等待密码输入及修改显示状态图43 b输入密码正确的显示状态图43 c输入密码错误的显示状态 图44 d 输入密码正确后询问是否修改密码状态图44 显示状态4.4密码修改程序设计修改密码的功能,是自己扩展的功能,再输入了正确的密码之后,按下“#”键就可以进行密码的修改了,输入新密码完毕后,再按“#”确认,则密码修改成功,在屏幕上显示GOOD信息,则已经修改成功了。 密码修改子程序流程图4-4所示修改子程序流程图4-4第五章 系统调试5.1软件模拟
13、调试首先,在wave里面写的程序进行编译,唉,编译通不过,不过这也是意料之中的事,把一个一个提示的错误给改正过来,重新进行编译,终于没有错误提示信息了,接着,进行软件仿真,在proteus里面把硬件原理图画好,把在wave里面写的程序装进80C51,进行仿真,唉,命途多舛啊!按下任何的键都没有反应,只好回到程序上进行修改了,把程序分成各个小的子程序逐一进行调试。对显示子程序进行调试,发现能够正确的显示,则表示此程序一切都OK。在把键盘识别和编码的子程序添加进去,发现不能显示了,说明是这个子程序存在问题,接下来重点就是键盘编码部分了,由于我用的是顺序的判断是否有键按下和具体到底是哪个键被按下,思
14、路特别的清晰,所以查找起来比较的方便。由于没有任何的反应,最有可能的就是进入了死循环。所以,先检查一下编码识别后面的程序,果真是进入了死循环,本来是应该编码之后就根据R7的值相应进行查表,进行显示。但由于我的粗心,把一个变量没有归零所以一直在里面循环,把所有类似的错误改过来,发现就能够正确的显示了(按下哪个数字键就相应的显示它的值)。当我把显示子程序改为扫描方式,让其动态的显示多位,按键之后却发现全屏幕显示相同的数,看到如此的现象,心应该是按一次键,却执行了很多的次数,所以最后全屏幕上都上相同的数,如此一来就应该加一个判断是否已经放下键了,但是需要在每个判断是否有键按下后面都要加一个判断,这样
15、太麻烦,但是我们也可以在每次判断之后把相应的编码用完,立即清零也可以达到如此的效果,按照思路对程序进行相应的修改,在进行仿真,真的问题就迎刃而解了(按下哪个数就在屏幕上显示哪个值,按几个就显示几个(小于6)。接下来要做的就是,对所输入的密码进行比较,把CHECK子程序添加进去,如果不出现意外的话,屏幕上会有GOOD的提示信息,并且红色的指示灯亮,密码的比较有两个方面,一是对输入密码的个数进行比较,二是对密码的数值依次进行比较,只有全部通过猜是密码正确。在PROTEUS里面进行仿真,发现不管你输入的密码是正确还是错误的密码都错误的提示信息,真有想放弃的感觉,其实真的要有耐心和毅力的,心想这么容易的话,还有学的必要吗,呵呵,慢慢的