8位密码锁单片机课程设计.docx
《8位密码锁单片机课程设计.docx》由会员分享,可在线阅读,更多相关《8位密码锁单片机课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
8位密码锁单片机课程设计
1引言
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。
其性能和安全性已大大超过了机械锁。
其在生活的各个方面均有应用,前景十分广阔。
其特点如下:
(1)保密性好,编码量多,远远大于弹子锁。
随机开锁成功率几乎为零;
(2)密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降;
(3)误码输入保护,当输入密码多次错误时,报警系统自动启动;
(4)无活动零件,不会磨损,寿命长;
(5)使用灵活性好,不像机械锁必须佩带钥匙才能开锁。
2设计方案及原理
2.1本设计所要实现的目标
设计一种单片机控制的密码锁,具有按键有效指示、解码有效指示、控制开锁电平、控制报警、密码修改等功能。
8位十进制密码共一亿组不重复,保密性强。
该密码锁要实现一下功能:
(1)锁的初始状态为“锁合”指示灯亮。
输入初始密码“0、1、2、3、4、5、6、7”,每输入一位,“按键有效”指示灯亮约半秒钟,输完8位按确认键,锁打开,“锁开”指示灯亮;
(2)按“上锁”键,锁又重新上锁,“锁合”指示灯亮;
(3)“锁开”状态下,可输入新密码,可重复修改密码;
(4)如果输入密码错误,“错误指示”灯亮约半秒钟。
可重新输入密码;
(5)输入密码错误超过3次,蜂鸣器启动发出报警,同时“错误”指示灯常亮。
2.2设计思路
对于电子密码锁的设计,需要解决几个问题:
键盘输入、数码管显示、单片机电路、密码比较、修改密码等。
其中最主要的就是解决掉电保存以及修改密码的问题。
先写一个循环写入8个初始密码到芯片内部EEPROM程序,先下载程序写入初始密码,此时EEPROM已存有初始密码,再把密码锁程序下载到单片机,运行电子密码锁。
本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。
其中矩阵键盘用于输入数字密码和进行各种功能的实现。
由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用的是单片机P1.2和P1.1来控制锁合和锁开LED灯的状态,P0口用于电子显示屏来显示提示语句和密码输入按键。
本系统共有两部分构成,即硬件部分与软件部分。
3硬件设计
硬件部分由键盘输入部分、密码存储部分、复位部分、晶振部分、显示部分、报警部分、开锁部分组成。
3.1键盘扫描电路
键盘接成4*4的矩阵键盘,行线为LD0-LD3分别接P2口的P0.0-P0.3,列线为HD0-HD3分别接P2口的P0.7-P0.4。
当哪一行的有键按下,则相应行的“按键有效”指示灯亮一下,其余行所对应的灯不亮。
P2初始时P2口第四位为低电平,高四位为高电平,当哪一行有键按下,则所对应的行和列对应的口变为低电平,将改为扫描到单片机中。
键盘扫描电路如图3.1所示。
图3.1键盘扫描电路
3.2晶振电路
80C31引脚XTAL1和XTAL2与晶体振荡器及电容C2/C1按图3.2所示方式连接。
晶振、电容C1/C2振荡器,振荡信号频率与晶振频率及电容C1/C2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C1/C2取值范围在5~30pF之间。
根据实际情况,本设计中采用1MHZ做为系统的外部晶振。
电容取值为30pF。
晶振电路如图3.2所示。
图3.2晶振电路
3.3复位电路
上电复位电路如图3.3所示。
图3.3复位电路
3.4显示部分
显示电路是利用LM016L系列的LCD显示屏,可以双行显示。
其D0-D7与P0口相接,并且给P0口外接上拉电阻。
LCD显示电路如图3.4所示。
图3.4LCD显示密码电路
3.5报警电路
报警电路是利用SPEAKER和NPN型三极管构成,同时给蜂鸣器并联一个发光二级管,当P1.0口输出为高电平时,NPN三极管导通,蜂鸣器发声,“错误”指示灯亮。
报警电路如图3.5所示。
图3.5报警电路
3.6电路总体结构及布局
该设计的电路总体结构及布局如图3.6所示。
图3.6电路总体结构及布局
4软件设计
软件部分由主程序、初始化程序、LCD显示程序、键盘扫描程序、功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。
总流程图如图4.1所示。
图4.1程序流程图
具体程序见附录。
5Proteus仿真结果
当开启开始仿真时,LCD显示屏会显示“选择A为设置密码,选择B为开锁”,同时“锁合”指示灯(红灯D1)闪烁。
开始仿真图如图5.1所示。
图5.1开始仿真图
当按下A或B时会提示输入密码,按下每一个键都会输出“*”提示。
其仿真结果如图5.2所示。
图5.2提示输入密码界面
当输入密码正确时会显示“PASSWORDOK!
!
!
”字样,同时“错误”指示灯(绿灯D3亮)。
其仿真图如图5.3所示。
图5.3输入密码正确显示界面
当输入密码错误时,LCD显示屏会显示“PASSWORDERROR!
”。
其仿真图如图5.4所示。
图5.4当输入密码错误时显示界面
6总结
本设计是基于单片机的多功能密码锁设计。
在设计过程中,首先是确立要设计的目标及电子密码锁要实现的功能,该如何通过软硬件来实现。
接下来是根据目标来搭建电路图,设计各功能模块要实现的功能,比如报警,LED灯的显示控制,4*4矩阵键盘的搭建。
接着就要通过编程来实现各模块功能,比如输入密码,输出显示,键盘扫描程序,存储程序等等。
最后就是调试改错,下载仿真。
本设计最后实现了上面所提到的基本功能外,另外增加了LCD显示屏,开始时有提示选择,问执行什么功能,到底是设置密码呢还是开锁。
当进入任何一个界面都会出现提示信息,比如‘PASSWORDOK!
!
!
’,‘INPUTAGAIN!
’,‘SETPASSWORD’等等。
当每次输入时都会显示“*”提示。
当输入密码错误超过三次时就会直接锁死,即使按下功能复位键也不会开锁,这样直接降低了盗窃的几率。
另外,在修改密码时会提示先输入原密码,再输两次新密码,防止用户该密码是按错键,极大地提高了密码锁的可靠性。
本设计输入的密码是8位的,共有一亿组不重复密码,增加了密码的安全性。
本设计还存在一些不足之处,开锁延时一段时间后没有自动上锁功能,应该在用户开锁之后若不操作机器时,延时30秒就自动上锁,减小因疏忽而给用户带来的不便。
参考文献
[1]李华,王思明,张金敏.单片机原理及应用[M].兰州:
兰州大学出版社,2001:
11-120.
[2]顾滨.单片微计算机原理开发与应用[M].北京:
高等教育出版社,2000:
67-81.
[3]李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994:
45-56.
附录源程序
ENBITP3.0
RWBITP3.1
RSBITP3.2
DISPLAYEQUP0
SOUNDERBITP1.1
LEDBITP1.2
OPENBITP1.1
RETURNBITBIT20H.1
ORG0000H
LJMPSTART
ORG000BH
LJMPINTERMIT_T0
ORG001BH
LJMPINTERMIT_T1
ORG0030H
START:
MOVSP,#60H
LCALLSYS_INITIAL
;主程序
MAIN0:
LCALLSTRAT_DISPLAY
MAIN:
MOV52H,#0;判断输入错误次数储存地址
SETBLED
SETBTR0
LCALLKEY
CJNEA,#'A',NEXT1
LJMPCHANGE_KEY
NEXT1:
CJNEA,#'B',NEXT2
LJMPINPUT_KEY
NEXT2:
AJMPMAIN
;系统初始化
SYS_INITIAl:
CLRLED
CLROPEN
CLRSOUNDER
MOV32H,#'0'
MOV33H,#'1'
MOV34H,#'2'
MOV35H,#'3'
MOV36H,#'4'
MOV37H,#'5'
MOV38H,#'6'
MOVr7,#16
MOVr0,#40H
LOOP:
MOV@R0,#10H
INCR0
DJNZR7,LOOP;密码键值存放区清零完毕
LCALLDELAY0_1S
MOVP0,#03H
CALLWRITE_INSTRUCTION;液晶软复位
MOVP0,#01H
CALLWRITE_INSTRUCTION
MOVP0,#3FH
CALLWRITE_INSTRUCTION
MOVP0,#0FH
CALLWRITE_INSTRUCTION
MOVP0,#06H
CALLWRITE_INSTRUCTION;液晶初始化完毕
MOVR5,#10
MOVTMOD,#11H
MOVTH0,#3CH
MOVTL0,#0B0H
SETBEA
SETBET0
RET
INTERMIT_T0:
PUSHACC
PUSHPSW
MOVTH0,#3CH
MOVTL0,#0B0H
DJNZR5,RETURN
CPLLED
MOVR5,#10
RETURN:
POPPSW
POPACC
RETI
INTERMIT_T1:
PUSHACC
PUSHPSW
MOVTH1,#9EH
MOVTL1,#58H
DJNZR5,RETURN_T1
CPLLED
CPLSOUNDER
MOVR5,#10
RETURN_T1:
POPPSW
POPACC
RETI
KEY:
CALLKS;键盘扫描
JNZK1
JMPKEY
K1:
CALLDELAY
CALLKS
JNZK2
JMPKEY
K2:
CLRTR0
CLRLED
MOVR2,#0FEH
MOVR6,#00H
K3:
MOVA,R2
MOVP2,A
MOVA,P2
JBACC.4,L1
MOVA,#0
LJMPLK
L1:
JBACC.5,L2
MOVA,#4
LJMPLK
L2:
JBACC.6,L3
MOVA,#8
LJMPLK
L3:
JBACC.7,NEXT_KEY
MOVA,#12
LK:
ADDA,R6
MOVR6,A
K4:
CALLKS
JNZK4
MOVA,R6
MOVDPTR,#TABLE0
MOVCA,@A+DPTR
MOV50H,A;查表取值存入50h,保护键值
RET
NEXT_KEY:
INCR6
MOVA,R2
JNBACC.7,KEY
RLA
MOVR2,A
JMPK3
KS:
MOVP2,#0F0H
MOVA,P2
XRLA,#0F0H
RET
;修改密码程序
CHANGE_KEY:
CALLCLEAR_DISPLAY
MOVDPTR,#TABLE4
CALLINPUT_HINT
MOVR0,#40H
CALLCHANGE
JBCRETURNBIT,CHANGE_KEY;先输入原密码完毕
MOVR4,#8
MOVR0,#40H
MOVR1,#32H
INPUT_COMPERE:
MOVA,@R0
XRLA,@R1
JNZINPUT_ERROR
INCR0
INCR1
NOP
NOP
DJNZR4,INPUT_COMPERE
;验证输入密码完毕
JMPCHANGE_KEY0
INPUT_ERROR:
SETBSOUNDER
SETBLED
CALLCLEAR_DISPLAY
MOVDPTR,#TABLE5
CALLINPUT_HINT
CALLDELAY1_15S
CLRSOUNDER
CLRLED
INC52H
MOVA,52H
CJNEA,#3,CHANGE_KEY
SJMP$
;输入密码错误次数超过3次,锁死
CHANGE_KEY0:
CALLCLEAR_DISPLAY
MOVDPTR,#TABLE2
CALLINPUT_HINT
MOVR0,#40H
CALLCHANGE
JBCRETURNBIT,CHANGE_KEY;第一次输入新密码完毕
CALLCLEAR_DISPLAY
MOVDPTR,#TABLE3
CALLINPUT_HINT
CALLDELAY1_15S;显示再次输入新密码完毕
MOVDPTR,#TABLE4
CALLINPUT_HINT
MOVR0,#48H
CALLCHANGE
JBCRETURNBIT,CHANGE_KEY;第二次输入新密码完毕
MOVR4,#7
MOVR0,#40H
MOVR1,#48H
SET_COMPERE:
MOVA,@R0
XRLA,@R1
JNZSET_ERROR
INCR0
INCR1
DJNZR4,SET_COMPERE
MOV32H,40H
MOV33H,41H
MOV34H,42H
MOV35H,43H
MOV36H,44H
MOV37H,45H
MOV38H,46H;存入新密码完毕
JMPMAIN0;设置新密码成功,返回主程序
SET_ERROR:
SETBSOUNDER
SETBLED
CALLCLEAR_DISPLAY
MOVDPTR,#TABLE5
CALLINPUT_HINT
CALLDELAY1_15S
CLRSOUNDER
CLRLED
LJMPCHANGE_KEY0;设置新密码成功,返回主程序
INPUT_KEY:
;输入密码开锁程序
CALLCLEAR_DISPLAY
MOVDPTR,#TABLE4
CALLINPUT_HINT
MOVR0,#40H
CALLCHANGE
JBCRETURNBIT,INPUT_KEY;设置新密码成功,返回主程序
MOVR4,#8
MOVR0,#40H
MOVR1,#32H
INPUT_COMPERE0:
MOVA,@R0
XRLA,@R1
JNZINPUT_ERROR22
INCR0
INCR1
NOP
NOP
DJNZR4,INPUT_COMPERE0;验证输入密码完毕
JMPDISPLAY_RIGHT
INPUT_ERROR22:
SETBSOUNDER
SETBLED
CALLCLEAR_DISPLAY
MOVDPTR,#TABLE5
CALLINPUT_HINT
CALLDELAY1_15S
CLRSOUNDER
CLRLED
INC52H
MOVA,52H
CJNEA,#3,INPUT_KEY
SJMP$;输入密码错误超过3次,锁死
DISPLAY_RIGHT:
CALLCLEAR_DISPLAY
MOVDPTR,#TABLE6
CALLINPUT_HINT;显示输入密码正确提示完毕
SETBOPEN;开锁
NEXT_KEY1:
CALLKEY
NOP
NOP
CJNEA,#'F',NEXT_KEY1
CLROPEN;按下关锁键关锁
JMPMAIN0;返回主程序
STRAT_DISPLAY:
MOVP0,#80H
CALLWRITE_INSTRUCTION
MOVDPTR,#TABLE1
CALLINPUT_HINT
MOVP0,#0C0H
CALLWRITE_INSTRUCTION
MOVDPTR,#TABLE11
CALLINPUT_HINT
RET
CLEAR_DISPLAY:
;清屏
MOVDISPLAY,#01H
CALLWRITE_INSTRUCTION
MOVP0,#06H
CALLWRITE_INSTRUCTION
RET
INPUT_HINT:
MOVR4,#16
MOVA,#00H
ALL_OR_NOT:
MOVCA,@A+DPTR
MOVDISPLAY,A
CALLWRITEDATA
INCDPTR
CLRA
NOP
NOP
DJNZR4,ALL_OR_NOT
RET
CHANGE:
MOVR4,#8
MOVR1,#0C0H
MOVA,R1
MOVP0,A
CALLWRITE_INSTRUCTION
LOOP1:
CALLKEY
NOP
NOP
CJNEA,#'C',NEXT_TO
SETBRETURNBIT
JMPENDT
NEXT_TO:
MOVA,50H
MOV@R0,A
MOVDISPLAY,#'*'
CALLWRITEDATA
INCR1
INCR0
DJNZR4,LOOP1
ENDT:
RET
WRITEDATA:
;写数据
SETBRS
CLRRW
CLREN
SETBEN
NOP
NOP
CLREN
SETBEN
NOP
NOP
CLREN
CALLDELAY
RET
WRITE_INSTRUCTION:
;写指令
CLRRS
CLRRW
CLREN
SETBEN
NOP
NOP
CLREN
CALLDELAY
RET
DELAY1_15S:
;延时程序
PUSH77H
PUSH72H
PUSH73H
MOVR7,#15
DEL22S:
MOVR3,#0
DEL11S:
MOVR2,#0
DJNZR2,$
DJNZR3,DEL11S
POP03H
POP02H
POP07H
RET
DELAY0_1S:
PUSH02H
PUSH03H
MOVR3,#0
DEL21S:
MOVR2,#0
NOP
NOP
DJNZR2,$
DJNZR3,DEL21S
POP03H
POP02H
RET
DELAY:
PUSH07H
PUSH06H
MOVR7,#10
D1:
MOVR6,#248
NOP
NOP
DJNZR6,$
DJNZR7,D1
POP06H
POP07H
RET
TABLE0:
DB'C','B','0','A';
DB'D','9','8','7';
DB'E','6','5','4';
DB'F','3','2','1';
TABLE1:
DB'PASSWORD:
ASET';
TABLE11:
DB'BOPEN';
TABLE2:
DB'SETPASSWORD:
';
TABLE3:
DB'INPUTAGAIN!
';
TABLE4:
DB'INPUTPASSWROD:
';
TABLE5:
DB'PASSWORDERROR!
';
TABLE6:
DB'PASSWORDOK!
!
!
';
END
.