当前位置:文档之家› 模拟多功能密码锁设计

模拟多功能密码锁设计

模拟多功能密码锁设计
模拟多功能密码锁设计

课程设计报告

院(系):________________ 专业班级:________

学生姓名: ____ 学号: ____

设计地点(单位)_____ ____________ __ ________ __

设计题目:__多功能密码锁设计_____________________ 完成日期:年月日

指导教师评语: _______________________________________

___________________________________________________________________________

___________________________________________________________________________

___________________________________________________ __________ _

成绩(五级记分制):______ __________

指导教师(签字):________ ________

xxxxxxxx

课程设计任务书

教研室主任:指导教师:年月日

摘要

随着科学技术的发展和高新技术的广泛应用,电子技术在国民经济的各个领域所起的作用越来越大,并深深地渗透到人们的生活、工作、学习的各个方面。同时在工业领域,为防止他人误操作而利用电子锁进行加密的机械控制也得到了广泛的应用。本设计就是利用8255、8254、电子发声单元和发光二极管等制作了一款多功能密码锁。在输入密码正确的条件下,控制电控锁开启(用发光二极管亮来代替),同时显示”O”字样;当输入密码错误时,发出错误警告声音,同时显示”C”字样,并报警。密码锁的设计,硬件方面,最难的就是键盘值的确定及LED数码管的显示,本设计采用扫描法来解决键值读取;软件方面,最主要的则是取出键盘输入值,和已知密码比对等。

关键字:多功能密码锁扫描法密码比对

目录

1. 总体设计 (1)

2.硬件设计 (2)

2.1 LED数码管模块 (2)

2.2 按键模块 (4)

2.3 报警模块和发光二极管模块 (5)

3. 软件设计 (6)

3.1 软件概要设计 (6)

3.2 功能模块详细设计 (8)

4.系统测试分析 (11)

5. 总结 (12)

参考文献 (13)

1. 总体设计

电子密码锁的原理是:从键盘输入一组密码,CPU把该密码和设置密码比较,对则将锁打开,显示“O”字样,同时数码灯亮;错则LED显示“C”,并报警。

初步设计思路如下:

1.输入密码用矩形键盘。

2.LED数码管显示输入密码,采扫描法确定具体按键。

3.用发光二极管模拟锁的情况,锁关时发光二极管灭,打开时发光二极管亮。

4.输入密码错误时报警。

软件的设计主要包括矩形键盘键值的读取、LED扫描输出程序、密码判断程序和报警程序。系统硬件电路图如下:

图 1.1 系统硬件电路

2.硬件设计

根据设计思路,硬件电路可通过实验平台上的一些功能模块电路组成,由于实验平台上的各个功能模块已经设计好,用户在使用时只要设计模块间电路的连接,因此,硬件电路的设计及实现相对简单。硬件电路由LED数码管显示模块、按键模块、发光二极管电路和蜂鸣器模块组成。

2.1 LED数码管模块

实验平台上提供一组四个LED数码管。七段LED数码管由名称为abcdefg 的7个笔画段和一个圆点dp组成,这7个笔画段在点亮时,可以显示数字和一些简单的西文字符。本设计用8255的PB口作为输出,和7段LED数码管的abcdefg和dp相连,8255的A口低四位PA0~PA3和LED列线连接,共同来控制内容的显示。下面是数码灯的示意图:

图2.1 LED数码管正面图

本程序是用的共阳极,从上图可以看出,要使数码管显示数字,有两个条件:

(1)要在COM端加正电源;

(2)要使(a、b、c、d、e、f、g、dp)端接低电平或”0”,这样才能显示。

LED数码管上显示的数字,必须经过转换,才能显示正确的字样。常用字符共阴极、共阳极时的段码即编码表,如下:

表 2.1 段码表

本设计中,LED数码管的连线如下图。由于a、b、c、d、e、f、g、dp分别和8255B口的PB0~PB7相连(8255的控制字假设初始化为81H)。那么假如我现在已经选中了一个数码管,如果我要输出一个‘0’,那么我只要写下如下代码段:

MOV DX,MY8255_B ; MY8255_B为B口的端口地址

MOV AL,3FH

OUT DX,AL

这样,即可在该选中数码管上显示一个字符‘0’。

图2.2 LED灯示意图

2.2 按键模块

实验平台提供了4*4的矩阵键盘。为了检测键盘是否有键按下及具体按下了那个键,本设计使用列扫描法。分两步:

(1)查询是否有键按下

将所有列线置成低电平0,然后通过行线输入全部行值,若读入的行值全是1,则说明没有任何一个键按下;若读入的行值不全是1,则说明有键按下。也就是说,在键盘识别的开始先进行全扫描,若有键按下,则必须判别是哪个键按下。

(2) 一旦发现有键按下,则采用逐列扫描的办法来确定究竟是那个键被按下。先扫描第一列,也就是使它输出低电平0,其余的列线为高电平1,然后读入行值。若读入的行值中有一位为低电平0,则说明在此行的一个行、列交叉处有键被按下。若读入的行值全是1,则说明这一列所有键都未被按下。接着扫描第二列。依此类推,直到扫描完全部的行线为止。若在扫描过程中发现非全1的行值,就能找出被按下键的位置。

在处理按键模块中,必须要解决的问题是,如何解决键抖动、重键、一次按键多次处理,及键值的确定。前面三个问题,用软件的方法,很容易实现。可以用多次扫描,延时来消除干扰。而键值的确定,也使用了一点儿技巧。键的行列值不是该键所对应的键值,那么CPU如何根据行、列值得到所按下键的键值呢?最方便的方法是利用按键所在的行、列值,形成一个查表值。然后,查表得到相应的键值。

本设计用8255的C口低四位PC0~PC3连接键盘的行线,接收键盘的输入;A 口的低四位PA0~PA3作为和数码管及键盘的共阴极线连接。键盘物理结构示意图,如下:

图2.2 键盘物理结构

键盘和8255的电路连线如下图所示:

图2.3 键盘电路和8255的连接图

2.3 报警模块和发光二极管模块

报警模块由SPK电子发声单元和8254组成。当密码输入错误时,8254发出方波脉冲,驱使电子发声单元发声。

发光二极管也是用8255输出来驱动亮灭。8255的A口高四位和发光二极管连接。当输入密码正确的时候,灯亮,以示锁打开,就是给PC4~PC7赋值。

3. 软件设计

3.1 软件概要设计

多功能密码锁的设计,最重要也是最难的部分,就是软件的设计。很多地方都要采用技巧性的东西。如按键次数的确定,键盘抖动的消除等等。密码锁工作的主要过程是PC屏幕输出提示开始输入密码,通过4*4键盘输入密码,同时LED 显示密码输入情况,按下6次键后判断密码的正确性,作出开锁或报警处理。程序的流程图如下:

图3.1 程序流程图

3.2 功能模块详细设计

根据程序功能,程序大致分为键盘键值读取显示,密码判断和开锁或报警处理几个大的子过程。

(1)键盘键值读取程序

键盘键值读取程序包括键盘扫描、消除抖动、键译码等内容。本设计采用了扫描法。因为键盘为机械开关,容易引入抖动。为了消除抖动干扰,在程序中要加入消除抖动的部分。因此程序的布局就显得很重要。为了防止键抖动、重复响应,在初步扫描是否有键按下时,都是调用CALL DIS、CALL CLEAR、CALL CCSCAN,即是显示,清屏,扫描,重复两次,然后再跳转到获取具体键值的代码段。参考程序见附件一。

(2)LED数码显示程序

LED数码显示器是一种应用很普遍的显示器。程序主要负责把要显示的数字或字母对应的显示码送到相应的LED显示管。显示子程序如下:

DIS PROC NEAR ;显示键值子程序

PUSH AX ;以缓冲区存放的键值为键值表偏移找到键值并显示

MOV SI,3000H

MOV DL,0F7H

MOV AL,DL

AGAIN: PUSH DX

MOV DX,MY8255_A

OUT DX,AL ;设置X1~X4,选通一个数码管 MOV AL,[SI] ;取出缓冲区中存放键值

MOV BX,OFFSET DTABLE

AND AX,00FFH

ADD BX,AX

MOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值

MOV DX,MY8255_B

OUT DX,AL ;写入数码管A~Dp

CALL DALLY

INC SI ;取下一个键值

POP DX

MOV AL,DL

TEST AL,01H ;判断是否显示完?

JZ OUT1 ;显示完,返回(jz:zf = 1跳转)

ROR AL,1

MOV DL,AL

JMP AGAIN ;未显示完,跳回继续OUT1: POP AX

RET

DIS ENDP

(3)密码判断程序

当按下六次键后,按键计数值count为6,则跳转到密码比对代码段。从3003H开始处,读取键盘数输入据,与预先设定的密码逐位比较,就可以判断输入密码的正确性。代码段如下:

pwd: ;从开辟的缓冲区内读出键盘输入的值,和已知密码逐个比对mov si,3003h

mov di,offset pwd

mov al,[si]

mov bl,[di]

cmp al,bl

je next1

jmp show1

next1:

mov si,3002h

mov al,[si]

mov bl,[di+1]

cmp al,bl

je next2

jmp show1

next2:

mov si,3001h

mov al,[si]

mov bl,[di+2]

cmp al,bl

je next3

jmp show1

next3:

mov si,3000h

mov al,[si]

mov bl,[di+3]

cmp al,bl

je show2

jmp show1

(4)开锁和报警程序

通过8255的A口高四位输出,控制发光二极管的亮灭。用8254控制电子发声单

元鸣叫。发声子程序如下:

ring proc

BEGINr:

MOV SI,OFFSET FREQ_LIST ;装入频率表起始地址

MOV DI,OFFSET TIME_LIST ;装入时间表起始地址

PLAY: MOV DX,0FH ;输入时钟为1.0416667MHz,1.0416667M = 0FE502H MOV AX,0E502H

DIV WORD PTR [SI];取出频率值计算计数初值,0F4240H / 输出频率 MOV DX,MY8254_COUNT0

OUT DX,AL ;装入计数初值

MOV AL,AH

OUT DX,AL

MOV DL,[DI] ;取出相对时间,调用延时子程序

CALL DALLYr

ADD SI,2

INC DI

CMP WORD PTR [SI],0 ;判断是否到悄?

JE BEGINr

MOV AH,1 ;判断是否有按键按下?

INT 16H

JZ PLAY

QUITr: MOV DX,MY8254_MODE ;退出时设置8254为方式2,OUT0置0 MOV AL,10H

OUT DX,AL

MOV AX,4C00H ;返回到DOS

INT 21H

ring endp

4.系统测试分析

系统完成后,连线测试。结果如下:

(1)编译、连接、运行程序,按下PC键的F2键,退出,返回到DOS。

(2)按下PC键的F1键,PC屏幕上打印信息,提示转入4*4键盘输入。

(3)在键盘上输入密码540262(学号的后六位),开锁。发光二极管亮,模拟锁打开,LED显示字符“O”,以示开锁成功。

(4)在键盘上输入其它6位数字,开锁失败。电子发声单元蜂鸣,LED显示字符“C”,以示开锁失败。

经过多次测试,都能够达到上述结果。

5. 总结

本多功能密码锁的设计主要由8255、8254、电子发声单元、4*4矩阵键盘、七段LED数码管和发光二极管组成。通过仔细思考,设计了其原理图。这次多功能密码锁的设计,难点在于其软件设计。这两周的时间,我下了很大的功夫在键盘的处理,7段LED数码管显示及密码比对上面。虽然顺利的解决了前面的几个问题,程序却也并不完美。我觉得最大的遗憾就是没能完全实现密码的修改和错误计数。汇编程序大多都是标签式的,在开始设计程序流程时,就遗漏了错误计数和密码修改。所以,待整个程序完成后,也很难再补漏。这,大概是因为自己对汇编程序设计经验的不足所致吧。

通过近两周的设计,我学到了许多知识。把课本上的知识应用于实际,使得理论与实际相结合,加深了对课本上知识的理解。期间,也经常到图书馆查阅资料,增加了许多课本以外的知识,也锻炼了我个人的动手能力。

思想上,也让我收获颇丰。做一个系统的设计,期间,会遇到许许多多的技术问题,遇到许多障碍。情绪难免会低落。这个时候,就需要保持乐观的心态,对自己有信心。确定一天的目标,一天进步一点,一天解决一个问题。积累下来,总会成功的。

参考文献

[1] 赵树升等,现代微机原理与接口技术. 北京:清华大学出版社,2008年8月.

[2] Kip R.Irvine,Intel汇编语言程序设计(第五版). 北京:电子工业出版社,2007年9月.

[3] 郭兰英. 微机原理与接口技术. 清华大学出版社,2004.

[4] 赵树升,赵雪梅.现代微机原理及接口技术[M],北京:清华大学出版社,2008年8月.

[5] 戴梅萼.微型计算机技术及应用——从16位到32位 (第2版) [M],北京:清华大学出版社,2003年2月.

附录

程序源码如下:

;多功能密码锁

IOY0 EQU 0DA00H ;片选IOY0对应的端口始地址

;***************************************************************** MY8255_A EQU IOY0+00H*4 ;8255的A口地址

MY8255_B EQU IOY0+01H*4 ;8255的B口地址

MY8255_C EQU IOY0+02H*4 ;8255的C口地址

MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址

;============================================================= IOY1 EQU 0DA40H ;片选IOY1对应的端口始地址

;***************************************************************** MY8254_COUNT0 EQU IOY1+00H*4 ;8254计数器0端口地址

MY8254_COUNT1 EQU IOY1+01H*4 ;8254计数器1端口地址

MY8254_COUNT2 EQU IOY1+02H*4 ;8254计数器2端口地址

MY8254_MODE EQU IOY1+03H*4 ;8254控制寄存器端口地址

STACK1 SEGMENT STACK

DW 256 DUP(?)

STACK1 ENDS

;=====================================================

DATA SEGMENT

DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,

77H,7CH,39H,5EH,79H,71H

;键值表,0~F对应的7段数码管的段位值

pwd db 06h,02h,00h,02h

count DB 0

k1 db 'Input keycode(F1)$'

k2 db 'Exit(F2)$'

k3 db 'Please input use 4*4 keyboard now','$'

k4 db 'Right key!','$'

sr db 6 dup(?) ;存放输入的密码

FREQ_LIST DW 371,495,495,495,624,556,495,556,624 ;频率表

DW 495,495,624,742,833,833,833,742,624

DW 624,495,556,495,556,624,495,416,416,371

DW 495,833,742,624,624,495,556,495,556,833

DW 742,624,624,742,833,990,742,624,624,495

DW 556,495,556,624,495,416,416,371,495,0

TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4 ;时间表 DB 6, 2, 4, 4, 12, 1, 3, 6, 2

DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4

DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4

DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4

DB 6, 2, 4, 4, 6, 2, 4, 4, 12

DATA ENDS

;================================================================ CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV SI,3000H ;建立缓冲区,存放要显示的键值

MOV AL,00H ;先初始化键值为0

MOV [SI],AL

MOV [SI+1],AL

MOV [SI+2],AL

MOV [SI+3],AL

;mov [si+4],al

;mov [si+5],al

;MOV DI,3005H

mov di,3003h

MOV DX,MY8255_MODE ;初始化8255工作方式

MOV AL,81H ;方式0,A口、B口输出,C口低4位输入

OUT DX,AL

MOV DX,MY8254_MODE ;初始化8254工作方式

MOV AL,36H ;定时器0、方式3

OUT DX,AL

call hh ;调用换行子过程

lea dx,k1

mov ah,09h

int 21h

call hh

lea dx,k2

mov ah,09h

int 21h

jmp xz

xz:

mov ah,0h ;功能号

int 16h ;键盘bios中断功能调用

cmp al,0 ;判断是否为扩充吗

jne xz

cmp ah,3bh ;判断输入是否为F1

je zhuanhuan

cmp ah,3ch ;判断输入是否为F2

je QUIT

hh proc near ;换行子过程

mov dl ,0ah

mov ah,02h

int 21h

mov dl, 0dh

mov ah,02h

int 21h

ret

hh endp

;================================================

;提示用户从PC键盘跳转到4*4键盘

zhuanhuan:

call hh

call hh

lea dx,k3

mov ah,09h

int 21h

call hh

jmp BEGIN

;比较密码

;==================================================

cpwd: ;从开辟的缓冲区内读出键盘输入的值,和已知密码逐个比对mov si,3003h

mov di,offset pwd

mov al,[si]

mov bl,[di]

cmp al,bl

je next1

jmp show1

next1:

mov si,3002h

mov al,[si]

mov bl,[di+1]

cmp al,bl

je next2

jmp show1

相关主题
文本预览
相关文档 最新文档