单片机数字密码锁课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
专业:电子信息工程
一、设计内容:数字密码锁
二、设计要求:
(一)基本要求
1、利用889C51作为控制器组成一数字型码锁。
2、开锁动作用LED管模拟。
3、开锁代码由小健盘输入,且同时有4位LED显示器上显出来,当你输入的四位数字与原存的密码完全相同时,则将锁打开。
4、密码可由小键盘输入进行改写。
5、修改密码,必须在30秒内完成,否则将发出报警号。
6、锁门与否,可由一开关控制,每次按Enter键时,89C51根据此开关的状态决定锁住或打开。
(二)扩展功能
1、键盘增加退格键、清除键和复位键。
2、三次输入密码不正确,系统将锁定,输入代码将无效。
按复位键后,将解除锁定。
三、设计所需硬件及结构图:
(一)硬件:AT69C52,8255A,MAX232,2803,按钮键盘,电容,排阻若干
(二)硬件结构图:
6位数码管
AT89C52 8255A
小键盘
发光二极管
四、程序流程图
五、软件软程序代码
PA EQU 7CFFH;A 口地址
PB EQU 7DFFH;B 口地址
CTR EQU 7FFFH;控制字地址
YR1 EQU 30H;密码存储单元
YR2 EQU 31H;
YR3 EQU 32H
YR4 EQU 33H
NEW1 EQU 45H;用户输入密码存储单元
NEW2 EQU 46H
NEW3 EQU 47H
NEW4 EQU 48H
LOCK_TIMES EQU 35H
ORG 0000H
JMP START_00
ORG 0100H ;
START_00:
MOV YR1,#1H;初始密码为1234 MOV YR2,#2H
MOV YR3,#3H
CLR 02H
MOV YR4,#4H;修改
MAIN:
MOV IE,#86H;开定时器0和外部中断1的中断
SETB IT1
LCALL KEY
JB 02H,START;已经开始计时就不要再开始了
MOV 50H,#08H;若是12mhz来算则R7应为0FFH,R3应为0F4H
MOV 51H,#06H
MOV TMOD,#01H;定时器定时工作方式1
MOV TH0,#15H
MOV TL0,#0AH
SETB 02H;开始计时标志置1
SJMP START
START:
MOV DPTR,#CTR
MOV A,#80H
MOVX @DPTR,A
CLR PSW.1 ;PSW.1是是否进入重设密码功能的标志位,为0则没进入;反之则进入。
By default,PSW.1=0
CLR F0 ;F0为重设密码时,输入原始密码正确与否标志:F0=0,wrong;F0=1,correct. Default=0
MOV B,#1H ;最初数码管不显示,B=当前要显示的数码管位数-1
MOV LOCK_TIMES,#0H;错误,移至START_00处
SETB P3.0 ;By default ,LED=off
SETB P3.1
MOV NEW1,#00H;清除用户上次输入密码
MOV NEW2,#00H
MOV NEW3,#00H
MOV NEW4,#00H
SCAN:LCALL DISP
MOV P1,#0FFH
MOV R0,#0F7H
MOV R1,#00H ;存储按键号
LP1: MOV A,R0 ;扫描行
MOV P1,A
NOP ;延时读取键盘状态
MOV A,P1
MOV R2,A ;存储键盘扫描状态,为判断抖动做准备
SETB C ;为左移作准备
MOV R3,#04H ;判断四列是否扫描结束
LP2:RLC A ;将A左移,检测该列中是否0所在位置
JNC KEY ;找到零,转去进行延时消抖
LP3:INC R1 ;扫描下一列
DJNZ R3,LP2
MOV A,R0
SETB C
RRC A
MOV R0,A
JC LP1 ;CY=1,行扫描未结束,因为是带进位的右移
LJMP SCAN ;扫描完毕,无有效键值
KEY:LCALL DS10MS ;延时消抖
MOV A,P1
XRL A,R2
JNZ LP3 ;A=1,说明是干扰,继续转去扫描下一行
LP4:MOV A,P1 ;wait for the button to bounce back
XRL A,R2
JZ LP4
MOV A,R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
KEYIN:MOV R3,A ;判断输入的键义
XRL A,#0EH
JZ ENTER ;按下确定键
MOV A,R3
XRL A,#0FH
JZ MODIFY ;按下修改键
MOV A,R3
XRL A,#0DH
JZ BUT_CHG ;按下重设密码键
BUT_N:MOV A,B ;是正常数字键
CJNE A,#5,INP_NUM ;判断输入密码的位数:达到四位则对键值不予理睬-->ignore, 否则-->INP_NUM
JMP Ignore ;输入密码位数达到四位后,对后续输入的数字不做处理
BUT_CHG:
SETB TR0
SETB 02H
SETB PSW.1 ;set PSW.1,enter process of resetting password
LCALL ALL_LIGHT ;show this entering
SETB P3.0
SETB P3.1
JMP SCAN ;返回接收新设定的密码
MODIFY: ;修改输入密码,则显示的位数减一
MOV A,B
CJNE A,#1H,MOD_EN ;输入密码删除完,对键值不作处理
JMP SCAN ;返回接收新键值
MOD_EN: ;
DEC B ;显示位数减一
JB F0,MOD_SYS ;F0=0,修改刚输入的用户密码;F0=1,修改输入的重设密码
MOD_USER:
MOV 48H,47H
MOV 47H,46H
MOV 46H,45H
MOV 45H,#0H
JMP SCAN
MOD_SYS:
MOV 33H,32H
MOV 32H,31H
MOV 31H,30H
MOV 30H,#0H
JMP SCAN
INP_NUM:
INC B ;输入密码位数增加,显示位数也随之增加
MOV A,R3
JB F0,SET_PW ;F0=0,可以输入重设的新密码,转去接受新密码进入密码存储单元USER_PW: ;input user's password
XCH A,48H
XCH A,47H
XCH A,46H
XCH A,45H
LJMP SCAN
SET_PW: ;input new password
XCH A,33H
XCH A,32H
XCH A,31H
XCH A,30H
Ignore: LJMP SCAN
ENTER:JB F0,set_OK;定义按下ENTER键的功能
COMP1:MOV R7,#04H ;compare password inputted with the correct one
MOV R0,#45H
MOV R1,#30H
L1: MOV A,@R0
XRL A,@R1
JNZ WRONG
INC R0
INC R1
DJNZ R7,L1
RIGHT:CLR P3.0
CALL LIGHT_DEL
SETB P3.0
JB PSW.1,CHG_PW
JMP BACK_START
CHG_PW:SETB F0 ;原始密码输入正确,可以重设密码,将重设密码允许的标志位置位 MOV B,#1H
LJMP SCAN
set_OK:INC 51H
DJNZ 51H,LOCK;
CLR EA
CLR TR0
CLR P3.0
WRONG:CLR P3.1
CALL LIGHT_DEL
JNB PSW.1,BACK_START
JB F0,BACK_START
MOV A,LOCK_TIMES
CJNE A,#2H,TRY_AGAIN
CALL LOCK
TRY_AGAIN:INC LOCK_TIMES
MOV B,#1H
SETB P3.1
LCALL SCAN
BACK_START:
LJMP START ;返回后先将存放输入密码的地址全部清零,后进行键盘扫描
ALL_LIGHT:
CLR P3.0
CLR P3.1
LIGHT_DEL:
LCALL DELAY2
RET
LOCK:
MOV DPTR,#PB ;位选
MOV A,#0FH
MOVX @DPTR,A
MOV DPTR,#PA
MOV A,#0H
MOVX @DPTR,A ;送段码
LCALL DELAY3 ;延时
JMP $
RET
ORG 000BH
T0IRS:DJNZ 50H,T01
DJNZ 51H,T01
T01:MOV TMOD,#01H
MOV TH0,#15H
MOV TL0,#0AH
SETB TR0
RETI
;************显示子程序**************;
DISP: MOV R2,#08H
MOV 49H,B
JNB F0,DEFAULT
MOV R0,#33H ;显示用户输入的新密码
JMP DS2
DEFAULT: ;正确密码为默认密码,显示输入的密码
MOV R0,#48H
DS2: DJNZ B,AA
MOV DPTR,#PB ;位选
MOV A,#0H
MOVX @DPTR,A
MOV B,49H
JMP JJ
AA: MOV DPTR,#PB ;位选
MOV A,R2
MOVX @DPTR,A
MOV DPTR,#PA
MOV A,@R0
LCALL TABLE
MOVX @DPTR,A ;送段码
LCALL DELAY1 ;延时
DEC R0
CLR C
MOV A,R2
RRC A
MOV R2,A
JMP DS2
;***** ******BCD码转化成段码子程序****************; TABLE:INC A
MOVC A,@A+PC
JJ: RET
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH ;***********延时4ms子程序***************************; DELAY1: MOV R4,#10;4ms延时
DEL11: MOV R5,#0AH
DEL12: MOV R3,#14H
DEL13: DJNZ R3,DEL13
DJNZ R5,DEL12
DJNZ R4,DEL11
RET
;***********延时21ms子程序**************************; DS10MS:MOV R5,#42
LOOP2:MOV R6,#248
DJNZ R6,$
DJNZ R5,LOOP2
RET
;***********延时1s子程序**************************; DELAY2:MOV R5,#50
LOOP3:LCALL DS10MS
DJNZ R5,LOOP3
RET
;***********延时30s子程序**************************; DELAY3:MOV R5,#10
LOOP4:LCALL DELAY2
DJNZ R5,LOOP4
RET
TAB: DB 01H,02H,03H,0AH
DB 04H,05H,06H,0BH
DB 07H,08H,09H,0CH
DB 0EH,00H,0FH,0DH
END
六、PROTUES和KEIL联调仿真
1、仿真原理图
2、仿真上电
3、输入正确密码1234数码D1管亮
4、输入错误密码数码D2管亮
5、修改密码成功,两个灯都亮
6、三次输入错误密码,led提示灯亮,系统锁定
六、课程设计经验感受
整个设计通过软件和硬件上的调试。
我想这对于自己以后的学习和工作都会有很大的
帮助。
在这次设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。
一切问题必须要靠自己一点一滴的解决,而在解决的过程当中你会发现自己在飞速的提升。
我觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。
与其他同学的的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。
所以我认为这次的课程设计意义很深,和其他同学的共同学习﹑配合﹑努力的过程也很愉快,另外还要感谢老师的耐心辅导。