51单片机汇编密码锁(可修改密码,课程设计,含论文)!(大三上)

单片机课程设计
设计课题:密码锁

一上来不bb太多,提供所有文件下载地址。
点击下载所有文件(汇编51单片机密码锁(含论文、程序、AD图)单片机课程设计)

https://download.csdn.net/download/weixin_43237195/10949597

在这里提醒一下,程序是百分百没有问题的,因为我课设的时候就是用这个做的,也测试了很久,最后才发出来的。如果烧录之后发现没反应,那就检查一下接线,看看那个pcb图,另外注意数码管、按键等原件是共阳还是共阴

目 录
选题背景
密码锁目的与意义
密码锁的原理
系统方案和总体结构
整体实验功能
硬件设计
实验仪器
电路原理图
软件设计
程序设计流程图
所用到的函数、功能和原理
硬软件调试过程
源程序代码

选题背景
密码锁目的与意义
随着科学技术的不断发展,在人们的生活中人们对于安全防盗器件的要求高。传统的防盗不方便携 带,安全性都比较差,满足不了我们的日常生活,随着单片机的发展,在我们的日常生活中出现了很多电子密码锁,这些技术的发展使我们的安全性得到了显著的提高。单片机产生后,我们就将这些变为智能化,我们只需要在单片机外围接一点简单的接口电路,核心的部分只能由人为的写入程序来完成。电子密码锁可以在日常生活和现在办公来完成,在我们的住在和办公的环境中有些重要的文件和报表以及一些重要的个人资料的保存等很多场所需要使用。密码锁具有安全性高,成本低,低功耗,易操作等优点, 这样极大的提高了我们的安全性。人们对安全的重视和科学技术的发展,许多电子智能锁,例如指纹识别,IC识别等已出现在我们的生活中,这些产品的特点需要一个特别的指纹或有效卡,成本相对不高。针对当前的技术和水平,电子密码锁是这类电子防盗产品的主流。

密码锁的原理
密码锁的原密码存在单片机的某几个单元里,通过矩阵按键扫描输入的密码,若密码相同,锁打卡;否则,密码错误,蜂鸣器报警。
若想改密码,先判断是否输入正确的原密码,后允许输入新的密码并显示在数码管上且替换储存原密码单元的数。

系统方案和总体结构
整体实验功能
该密码锁完成的主要功能是当输入密码时,数码管只显示“-”,当密码位输入正确完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则开锁,此处用LED发光二极管亮一秒钟做为提示。若密码不正确,禁止按键三秒,同时发出“嘀、嘀”报警声。密码锁的密码可以修改,若想改密码,先判断是否输入正确的原密码,后允许输入新的密码并显示在数码管上且替换储存原密码单元的数。

硬件设计
实验仪器
1个蜂鸣器
1个4×4矩阵按键
1个51单片机最小系统
2个LED灯
8位数码管。

电路原理图
在这里插入图片描述

软件设计
程序设计流程图
-在这里插入图片描述

源程序代码

ORG 0000H
MOV P0,#00H
MOV P2,#0FFH
LJMP MAIN1
ORG 0100H

MAIN1:

MOV 21H,#00H  //所有状态清零
MOV 22H,#00H
MOV 23H,#00H
MOV 24H,#00H
MOV 25H,#00H
MOV 26H,#00H
MOV 27H,#00H
MOV 28H,#00H

MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV 56H,#00H
MOV 57H,#00H
MOV 58H,#00H

MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H

MOV 33H,#00H
MOV 50H,#00H

MOV 21H,#06H  //设置初始密码
MOV 22H,#03FH
MOV 23H,#066H
MOV 24H,#05BH
MOV 25H,#06FH
MOV 26H,#05BH
MOV 27H,#066H
MOV 28H,#066H


MOV R0,#51H  //两个指针清零
MOV R1,#71H

MAIN:
MOV 50H,#00H

ACALL SAOMIAO
MOV A,50H
CJNE A,#00H,QWER  //判断是否有键盘输入
LJMP QWER3

QWER:
CJNE A,#03H,QWER9  //判断是否要重置密码
JB P2.7,ERERER  //判断当前是否为改密码的状态,二者之间跳转。其中p2.7为重置密码标志位,1:正常状态;0:修改密码状态
MOV 33H,#00H
SETB P2.7

MOV R0,#51H  //状态置零
MOV R1,#71H	
	 
MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV 56H,#00H
MOV 57H,#00H
MOV 58H,#00H

MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H

LJMP QWER3
ERERER:
MOV 33H,#0FFH  //33h中为0ffh则为改密码状态,00h不是改密码状态,此处与上面的p2.7相比有点多余。
CLR P2.7

MOV R0,#51H
MOV R1,#71H
MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV 56H,#00H
MOV 57H,#00H
MOV 58H,#00H

MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H

LJMP QWER3


QWER9:
CJNE A,#02H,QWER8  //判断是否按了确定键
LCALL PANDUAN//调用判断函数

MOV R0,#51H  //判断结束后,状态清零
MOV R1,#71H

MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV 56H,#00H
MOV 57H,#00H
MOV 58H,#00H

MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H

LJMP QWER3

QWER8:
CJNE A,#01H,QWER2  //判断是否退格按键按下
CJNE R0,#51H,JIAN   //判断是否超出了八位数码管范围!这个特别重要!(低于0位)
SJMP QWER3
JIAN:
DEC R0  //退格执行语句
DEC R1
MOV @R0,#00H
MOV @R1,#00H
SJMP QWER3
QWER2:
CJNE R0,#59H,JIA  //判断是否超出了八位数码管范围!这个特别重要!(高于8位)
SJMP QWER3
JIA:
MOV @R0,#040H  //按下数字按键则累加
MOV @R1,50H
INC R0
INC R1



QWER3:
SETB P2.4  //八位数码管显示函数,为动态扫描形,p2.2、3、4为138译码器ABC接口  p0为数码管控制位
SETB P2.3
SETB P2.2
MOV P0,51H
ACALL DELAY1  //一定要记得调用延迟函数,不然会出现重影的现象

SETB P2.4
SETB P2.3
CLR P2.2
MOV P0,52H
ACALL DELAY1

SETB P2.4
CLR P2.3
SETB P2.2
MOV P0,53H
ACALL DELAY1

SETB P2.4
CLR P2.3
CLR P2.2
MOV P0,54H
ACALL DELAY1
CLR P2.4
SETB P2.3
SETB P2.2
MOV P0,55H

ACALL DELAY1
CLR P2.4
SETB P2.3
CLR P2.2
MOV P0,56H

ACALL DELAY1
CLR P2.4
CLR P2.3
SETB P2.2
MOV P0,57H
ACALL DELAY1

CLR P2.4
CLR P2.3
CLR P2.2
MOV P0,58H
ACALL DELAY1

LJMP MAIN   //循环回去,相当于C语言里面的while(1)

PANDUAN:  //判断子函数,一位一位判断,不对则调用BEE函数,蜂鸣器报警

MOV A,71H
CJNE A,21H,BEE
MOV A,72H
CJNE A,22H,BEE
MOV A,73H
CJNE A,23H,BEE
MOV A,74H
CJNE A,24H,BEE
MOV A,75H
CJNE A,25H,BEE
MOV A,76H
CJNE A,26H,BEE
MOV A,77H
CJNE A,27H,BEE
MOV A,78H
CJNE A,28H,BEE
MOV A,33H

CJNE A,#0FFH,OVER  //如果都对,判断是否当前为改密码时验证原密码的状态,如果是的,则调用改密码函数,如果不是则正常打开锁(改密码的重点)
MOV 33H,#00H   //清除33h单元标志位
SETB P2.7			  
LCALL DELAY
LCALL DELAY  //当然如果是改密码状态则p2.7灭一下后又亮,提示用户可以输入新密码了!
LCALL DELAY
CLR P2.7
LCALL SHEZHI	  //调用设置新密码函数


OVER:  //正常开锁状态
CLR P2.0
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB P2.0
MOV A,33H  //清除33h单元标志位,这里为出现bug所设置的,防止其他操作
RET


BEE:  //蜂鸣器报警函数,无源蜂鸣器,需要高低电平来回变
MOV 33H,#00H
SETB P2.7
MOV R5,#20
MOV R7,#0FFH
HAHAHA:
CPL P1.5
LCALL DELAYBEE
DJNZ R7,HAHAHA
MOV R7,#0FFH
DJNZ R5,HAHAHA
RET

SHEZHI:  //设置新密码子函数(最难点)
MOV R0,#51H
MOV R1,#71H	  //当开始清零
MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV 56H,#00H
MOV 57H,#00H
MOV 58H,#00H
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV 74H,#00H
MOV 75H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H

SHEZHIK:
MOV 50H,#00H  //和上面的正常模式其实很相似,只是我不会嵌套上面的函数,于是重新搞了一个新的函数,没有注释的地方和上面一样
LCALL SAOMIAO
MOV A,50H
CJNE A,#00H,SHEZHI1
LJMP SHEZHI5

SHEZHI1:
CJNE A,#03H,SHEZHI22  //防止用户花里胡哨操作,在改密码的时候,又突然返回了。所以全部清零,原密码不动
SETB P2.7
MOV 33H,0FFH
MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV 56H,#00H
MOV 57H,#00H
MOV 58H,#00H
MOV R0,#51H
MOV 33H,#00H  //清除33h
LJMP QWER3

SHEZHI22:
CJNE A,#01H,SHEZHI2  //是否退格
CJNE R0,#51H,JIAN1
SJMP SHEZHI5
JIAN1:
DEC R0
MOV @R0,#00H
SJMP SHEZHI5


SHEZHI2:
CJNE A,#02H,SHEZHI3  //重点!判断是否输入了确定键,如果是的,把新密码来替换原密码
MOV 21H,51H
MOV 22H,52H
MOV 23H,53H
MOV 24H,54H	  // 新密码来替换原密码
MOV 25H,55H
MOV 26H,56H
MOV 27H,57H
MOV 28H,58H

MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H  //清零,防止bug
MOV 55H,#00H
MOV 56H,#00H
MOV 57H,#00H
MOV 58H,#00H
MOV R0,#51H
SETB P2.7	  //清除p2.7
LJMP QWER3


SHEZHI3:
CJNE R0,#59H,JIA1
SJMP  SHEZHI5
JIA1:
MOV @R0,50H
INC R0



SHEZHI5:  //数码管显示函数
SETB P2.4
SETB P2.3
SETB P2.2
MOV P0,51H
ACALL DELAY1

SETB P2.4
SETB P2.3
CLR P2.2
MOV P0,52H
ACALL DELAY1

SETB P2.4
CLR P2.3
SETB P2.2
MOV P0,53H
ACALL DELAY1

SETB P2.4
CLR P2.3
CLR P2.2
MOV P0,54H
ACALL DELAY1

CLR P2.4
SETB P2.3
SETB P2.2
MOV P0,55H
ACALL DELAY1

CLR P2.4
SETB P2.3
CLR P2.2
MOV P0,56H
ACALL DELAY1

CLR P2.4
CLR P2.3
SETB P2.2
MOV P0,57H
ACALL DELAY1

CLR P2.4
CLR P2.3
CLR P2.2
MOV P0,58H
ACALL DELAY1

LJMP SHEZHIK  //注意此时不可以跳转到主函数,因为新密码还没有输出完成,所以跳转到上面的设置新密码的函数,来接受下一位密码

SAOMIAO:  //扫描矩阵键盘函数
							
CLR P2.4
CLR P2.3
CLR P2.2				  
MOV P0,#00H  //这个是为了方式bug 方式键盘输入到了第八位,继续按键的话,第八位数码管会变得很亮设置的

MOV P1,#0F0H   
JNB P1.4,Y0
JNB P1.5,Y1
JNB P1.6,Y2
JNB P1.7,Y3
RET
Y0:
MOV P1,#0FH
MOV 30H,#00H
JNB P1.0,X0
JNB P1.1,X1
JNB P1.2,X2
JNB P1.3,X3
Y1:  //矩阵键盘原理,先扫描列再扫描行,得到的结果进入计算函数来计算对应的按键值(注意51单片机如果高电平引脚与低电平引脚短接,则低电平引脚变为高,高电平引脚不变,所以检测的时候检测1,不检测0!!!)
MOV P1,#0FH
MOV 30H,#01H
JNB P1.0,X0
JNB P1.1,X1
JNB P1.2,X2
JNB P1.3,X3
Y2:
MOV P1,#0FH
MOV 30H,#02H
JNB P1.0,X0  ·//数据暂存到30h单元
JNB P1.1,X1
JNB P1.2,X2
JNB P1.3,X3
Y3:
MOV P1,#0FH
MOV 30H,#03H
JNB P1.0,X0
JNB P1.1,X1
JNB P1.2,X2
JNB P1.3,X3
X0:
MOV 31H,#00H
ACALL DELAY
MOV P1,#0F0H
LJMP JISUAN
X1:
MOV 31H,#01H
ACALL DELAY
MOV P1,#0F0H
LJMP JISUAN
X2:
MOV 31H,#02H
ACALL DELAY
MOV P1,#0F0H
LJMP JISUAN
X3:
MOV 31H,#03H
ACALL DELAY
MOV P1,#0F0H
LJMP JISUAN

JISUAN:  //开始计算,分别把值给50h,这个值是指数码管显示的数值,这个一定要区别
G0:MOV A,30H
CJNE A,#00H,A0  //其中退格是#01h,确定是#02h,设置密码是#03h
MOV A,31H
	CJNE A,#00H,G1
	MOV 50H,#02H
G1:	CJNE A,#01H,G2
	MOV 50H,#03FH
	MOV 70H,#040H
G2:	CJNE A,#02H,A0
	MOV 50H,#01H
A0:MOV A,30H
CJNE A,#01H,B0
MOV A,31H
	CJNE A,#00H,A1
	MOV 50H,#04FH
A1:	CJNE A,#01H,A2
	MOV 50H,#05BH
A2:	CJNE A,#02H,B0
	MOV 50H,#06H
B0:MOV A,30H
CJNE A,#02H,C0
MOV A,31H
	CJNE A,#00H,B1
	MOV 50H,#07DH
B1:	CJNE A,#01H,B2
	MOV 50H,#06DH
B2:	CJNE A,#02H,C0
	MOV 50H, #66H
C0:MOV A,30H
CJNE A,#03H,D0
MOV A,31H
	CJNE A,#00H,C1
	MOV 50H,#06FH
C1:	CJNE A,#01H,C2
	MOV 50H,#07FH
C2:	CJNE A,#02H,C3
	MOV 50H,#07H
C3:	CJNE A,#03H,D0
	MOV 50H,#03H
D0:RET
	
DELAY1: MOV R4,#0FFH	  //延迟函数
DJNZ R4,$
RET

DELAYBEE:MOV R4,#50

汇编51单片机密码锁(含论文、程序、AD图)单片机课程设计 点击下载

  • 45
    点赞
  • 420
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值