单片机综合实训二密码锁的设计.docx
《单片机综合实训二密码锁的设计.docx》由会员分享,可在线阅读,更多相关《单片机综合实训二密码锁的设计.docx(22页珍藏版)》请在冰豆网上搜索。
![单片机综合实训二密码锁的设计.docx](https://file1.bdocx.com/fileroot1/2023-2/3/4ab96a14-b720-4c86-9a0c-8cbe515b5e7c/4ab96a14-b720-4c86-9a0c-8cbe515b5e7c1.gif)
单片机综合实训二密码锁的设计
密码锁的设计报告
一、设计内容:
用4*3的键盘组成0~9的数字键及确认键、删除键;用8位数码管组成显示电路提示信息,当输入密码时,只显示“—”,当密码位数输入完毕按下确认键时,对输入的密码和设定的初始密码进行比较,若密码正确,则开锁,此时P3.0口的LED(即黄灯)亮一秒作为提示;若密码不正确,禁止输入3秒种,同时发出报警声。
初始密码为8位。
增加功能:
利用外部中断0和1分别实现复位和密码修改功能,说明见原理图
参考器件:
89C51,RES,CAP,CAP-ELEC,CRYSTAL,LED-YELLOW,
7SEG-MPX8-CC-BLUE,SOUNDER,BUTTON,74LS245
二、原理图:
三、流程图:
是
是
是
是
是
是
是
是
是
四、实物图:
五、源程序
LINE_NOEQU20H;行号
ROW_NOEQU31H;列号
LINEinitialKEYVALEQU30H;行初始键值
KEY_VALEQU32H
KEY_CNTEQU33H;数字按键的序号,如按键"541",这时KEYORDER=3
BIT_SELEQU34H
FLAGBIT00H
;初始密码存储区
LED_BIT1EQU41H
LED_BIT2EQU42H
LED_BIT3EQU43H
LED_BIT4EQU44H
LED_BIT5EQU45H
LED_BIT6EQU46H
LED_BIT7EQU47H
LED_BIT8EQU48H
;输入密码存储区
PASSWD1EQU51H
PASSWD2EQU52H
PASSWD3EQU53H
PASSWD4EQU54H
PASSWD5EQU55H
PASSWD6EQU56H
PASSWD7EQU57H
PASSWD8EQU58H
ORG0000H
LJMPSTART
ORG0003H
LJMPINTT0;中断处理,实现复位功能,清楚所有的有关操作
ORG0013H
LJMPINTT1
ORG0040H
START:
MOVSP,#70H
MOVP0,#0FFH
MOVA,#0FFH
MOVR0,#00H
MOVR7,#0
MOVBIT_SEL,#0;显示数码管的位数初始为0
MOVKEY_CNT,#0;按键序号初始为0
MOVDPTR,#TAB
;设置初始密码
MOVLED_BIT1,#6
MOVLED_BIT2,#7
MOVLED_BIT3,#8
MOVLED_BIT4,#9
MOVLED_BIT5,#0
MOVLED_BIT6,#1
MOVLED_BIT7,#2
MOVLED_BIT8,#3
MAIN:
SETBEX0
SETBIT0
SETBEA;开中断总允许
SETBPX0
MOVP1,#0F0H;设置P1高4位(行线)输入状态
MOVA,P1
CJNEA,#0F0H,M;P1高4位(行线)有低电平,转M进一步判断是按键还是抖动
SJMPMAIN;P1高4位(行线)无低电平,转MAIN继续监控
M:
ACALLDELAY;P1高4位(行线)有低电平,去抖延时
MOVP1,#0F0H;设置P1高4位(行线)输入状态,已经延时,准备再读
MOVA,P1
CJNEA,#0F0H,MM;再读P1高4位(行线),仍有低电平,确认是按键,转MM
SJMPMAIN;再读P1高4位(行线),无低电平,表示抖动,非有效按键,
;转MAIN继续监控
MM:
MOVLINE_NO,A;P1高4位(行线)低电平持续时间符合按键要求,有效按键,
;保存行号到LINE_NO
MOVP1,#0FH;设置P1低4位(列线)输入状态
MOVROW_NO,P1;保存列号到ROW_NO
MMM:
MOVP1,#0F0H;设置P1高4位(行线)输入状态
MOVA,P1
CJNEA,#0F0H,MMM;读出P1高4位(行线)是否低电平(未松开键)?
;未松开转MMM,继续监控松开否。
;P1高4位(行线)有低电平,表明按键松开,
;完成一次按键动作,执行下面语句
JNBLINE_NO.4,E1;LINE_NO.4!
=1第1行有按键,转E1,
;否则第1行无按键,执行下面语句,判断其他行有按键否
JNBLINE_NO.5,E2;LINE_NO.5!
=1第2行有按键,转E2,
;否则第1、2行无按键,执行下面语句,判断其他行有按键否
JNBLINE_NO.6,E3;LINE_NO.6!
=1第3行有按键,转E3,
LJMPMAIN;否则无按键,转MAIN重新监控
E1:
MOVLINEinitialKEYVAL,#0;第1行有按键,该行键初值(30H内容)为0
LJMPKEYVAL;转KEYVAL,求按键号
E2:
MOVLINEinitialKEYVAL,#4;第2行有按键,该行键初值(30H内容)为4
LJMPKEYVAL;转KEYVAL,求按键号
E3:
MOVLINEinitialKEYVAL,#8;第3行有按键,该行键初值(30H内容)为8
MOVA,ROW_NO;将31H单元内容-列号取出
JNBACC.0,D31;第3行第1列按键,转D31,
JNBACC.1,D32;第3行第2列按键,转D32
JNBACC.2,D33;第3行第3列按键,转D33
JNBACC.3,D34;第3行第4列按键,转D34
D31:
MOVR0,KEY_CNT
INCR0
MOVKEY_CNT,R0;按键序号KEY_CNT增1
MOVA,KEY_CNT;按键序号超过9个不做处理
SUBBA,#09
JZNEXT1
INCBIT_SEL
MOVA,BIT_SEL
MOVCA,@A+DPTR
MOVP2,A;选择要显示的数码管
;MOVBIT_SEL,A;数码管位号BIT_SEL左移1位
MOVA,#0
ADDA,LINEinitialKEYVAL
MOVKEY_VAL,A
;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码
MOVA,#0BFH
MOVP0,A
MOVP1,#0F0H
ACALLPASSWD
LJMPMAIN
D32:
MOVR0,KEY_CNT
INCR0
MOVKEY_CNT,R0;按键序号KEY_CNT增1
MOVA,KEY_CNT;按键序号超过9个不做处理
SUBBA,#09
JZNEXT1
INCBIT_SEL
MOVA,BIT_SEL
MOVCA,@A+DPTR
MOVP2,A;选择要显示的数码管
;MOVBIT_SEL,A;数码管位号BIT_SEL左移1位
MOVA,#1
ADDA,LINEinitialKEYVAL
MOVKEY_VAL,A
;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码
MOVA,#0BFH
MOVP0,A
MOVP1,#0F0H
ACALLPASSWD
LJMPMAIN
D33:
MOVA,KEY_CNT
JZD331;无输入数字按键时进行清除的处理
MOVA,KEY_VAL
CLRA;清楚原来输入的按键值
MOVKEY_VAL,A
ACALLPASSWD;调用密码存储子程序对当前操作进行存储
DECKEY_CNT
DECBIT_SEL
D331:
MOVA,KEY_CNT
MOVCA,@A+DPTR
MOVP2,A;选择要显示的数码管
MOVA,#0BFH
MOVP0,A
MOVP1,#0F0H
LJMPMAIN
NEXT1:
MOVKEY_CNT,#08
LJMPPWN_SOUND;超过8个按键时的警告
D34:
MOVA,R7
JNZBIT0
MOVA,LED_BIT1;初始密码
CJNEA,PASSWD1,PWN_SOUND;初始密码与输入密码进行比较
MOVA,LED_BIT2
CJNEA,PASSWD2,PWN_SOUND
MOVA,LED_BIT3
CJNEA,PASSWD3,PWN_SOUND
MOVA,LED_BIT4
CJNEA,PASSWD4,PWN_SOUND
MOVA,LED_BIT5
CJNEA,PASSWD5,PWN_SOUND
MOVA,LED_BIT6
CJNEA,PASSWD6,PWN_SOUND
MOVA,LED_BIT7
CJNEA,PASSWD7,PWN_SOUND
MOVA,LED_BIT8
CJNEA,PASSWD8,PWN_SOUND
CLRP3.0;密码正确,LED发光二极管亮一秒作为提示
ACALLDELAY1S
SETBP3.0
SETBEX1;开重置密码中断
LJMPMAIN
BIT0:
MOVA,KEY_CNT
SUBBA,#08
JNZPWN_SOUND;密码修改不是8位警报
LJMPBIT_close
PWN_SOUND:
MOVA,R7
JZSOUND
CLRP3.7;密码修改错误,LED发光二极管亮并报警
SOUND:
MOVR2,#3
START1:
JNBFLAG,NEXT3;flag=0报警低音声,flag=1报警高音声
MOVR6,#200
DV:
CPLP3.5;P1.0产生200个500Hz脉冲,报警低音声
LCALLDELY500
LCALLDELY500
DJNZR6,DV
CPLFLAG;标志位取反,两种报警声音(500Hz和1KHz)交替鸣响
NEXT3:
MOVR6,#200
DV1:
CPLP3.5;P1.0产生200个1KHz脉冲,报警高音声
LCALLDELY500
DJNZR6,DV1
CPLFLAG;标志位取反,两种报警声音(500Hz和1KHz)交替鸣响
DJNZR2,NEXT4
MOVA,R7
JZNEXT5
SETBP3.7
NEXT5:
LJMPMAIN
NEXT4:
LJMPSTART1
KEYVAL:
MOVR0,KEY_CNT
INCR0
MOVKEY_CNT,R0;按键序号KEY_CNT增1
MOVA,KEY_CNT;按键序号超过8个不做处理,为无效按键,序号仍然为8个,并返回主函数
SUBBA,#09
JZNEXT1
INCBIT_SEL
MOVA,BIT_SEL
MOVCA,@A+DPTR
MOVP2,A;选择要显示的数码管
;MOVBIT_SEL,A;数码管位号BIT_SEL左移1位
MOVA,ROW_NO;将31H单元内容-列号取出
JNBACC.0,D1;第1列按键,转D1
JNBACC.1,D2;第2列按键,转D2
JNBACC.2,D3;第3列按键,转D3
JNBACC.3,D4;第4列按键,转D4
D1:
MOVA,#0
ADDA,LINEinitialKEYVAL;按键号=行键初值+列键值(列键值为0)
MOVKEY_VAL,A
;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码
MOVA,#0BFH
MOVP0,A
MOVP1,#0F0H
ACALLPASSWD
LJMPMAIN
D2:
MOVA,#1
ADDA,LINEinitialKEYVAL;按键号=行键初值+列键值(列键值为1)
MOVKEY_VAL,A
;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码
MOVA,#0BFH
MOVP0,A
MOVP1,#0F0H
ACALLPASSWD
LJMPMAIN
D3:
MOVA,#2
ADDA,LINEinitialKEYVAL;按键号=行键初值+列键值(列键值为2)
MOVKEY_VAL,A
;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码
MOVA,#0BFH
MOVP0,A
MOVP1,#0F0H
ACALLPASSWD
LJMPMAIN
D4:
MOVA,#3
ADDA,LINEinitialKEYVAL;按键号=行键初值+列键值(列键值为3)
MOVKEY_VAL,A
;MOVCA,@A+DPTR;从键值代码显示表tab中查到该按键号对应的显示代码
MOVA,#0BFH
MOVP0,A
MOVP1,#0F0H
ACALLPASSWD
LJMPMAIN
DELY500:
MOVR0,#250;500us软件延迟程序,用于报警
LOOP:
NOP
DJNZR0,LOOP
RET
;复位实现
INTT0:
MOVPASSWD1,#0
MOVPASSWD2,#0
MOVPASSWD3,#0
MOVPASSWD4,#0
MOVPASSWD5,#0
MOVPASSWD6,#0
MOVPASSWD7,#0
MOVPASSWD8,#0
MOVKEY_CNT,#0
MOVBIT_SEL,#0
MOVA,BIT_SEL
MOVCA,@A+DPTR
MOVP2,A
MOVA,#0BFH
MOVP0,A
RETI
;修改密码实现
INTT1:
MOVR7,#1
MOVKEY_CNT,#0
MOVBIT_SEL,#0
MOVA,BIT_SEL
MOVCA,@A+DPTR
MOVP2,A
MOVA,#0BFH
MOVP0,A
LJMPMAIN
BIT_close:
MOVLED_BIT1,PASSWD1
MOVLED_BIT2,PASSWD2
MOVLED_BIT3,PASSWD3
MOVLED_BIT4,PASSWD4
MOVLED_BIT5,PASSWD5
MOVLED_BIT6,PASSWD6
MOVLED_BIT7,PASSWD7
MOVLED_BIT8,PASSWD8
MOVPASSWD1,#0
MOVPASSWD2,#0
MOVPASSWD3,#0
MOVPASSWD4,#0
MOVPASSWD5,#0
MOVPASSWD6,#0
MOVPASSWD7,#0
MOVPASSWD8,#0
CLRP3.7;密码修改正确,LED发光二极管亮一秒作为提示
ACALLDELAY1S
SETBP3.7
CLREX1
MOVR7,#0
MOVKEY_CNT,#0
MOVBIT_SEL,#0
MOVA,BIT_SEL
MOVCA,@A+DPTR
MOVP2,A
RETI
;依据按键序号顺序存入密码缓冲区
PASSWD:
MOVA,KEY_CNT
SUBBA,#01H
JNZPD2
MOVPASSWD1,KEY_VAL
PD2:
MOVA,KEY_CNT
SUBBA,#02H
JNZPD3
MOVPASSWD2,KEY_VAL
PD3:
MOVA,KEY_CNT
SUBBA,#03H
JNZPD4
MOVPASSWD3,KEY_VAL
PD4:
MOVA,KEY_CNT
SUBBA,#04H
JNZPD5
MOVPASSWD4,KEY_VAL
PD5:
MOVA,KEY_CNT
SUBBA,#05H
JNZPD6
MOVPASSWD5,KEY_VAL
PD6:
MOVA,KEY_CNT
SUBBA,#06H
JNZPD7
MOVPASSWD6,KEY_VAL
PD7:
MOVA,KEY_CNT
SUBBA,#07H
JNZPD8
MOVPASSWD7,KEY_VAL
PD8:
MOVA,KEY_CNT
SUBBA,#08H
JNZNEXT
MOVPASSWD8,KEY_VAL
NEXT:
RET
DELAY1S:
MOVR3,#10
DEL3:
MOVR4,#200
DEL2:
MOVR5,#125
DEL1:
NOP
NOP
DJNZR5,DEL1
DJNZR4,DEL2
DJNZR3,DEL3
RET
DELAY:
MOVR1,#3;延时程序
D:
MOVR2,#255
DJNZR2,$
DJNZR1,D
RET
TAB:
;DB0C0H,0F9H,0A4H,0B0H
;DB99H,92H,82H,0F8H,80H,90H,88H,83H
;DB0C6H,0A1H,86H,8EH
DB00H,01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
END
六、心得体会
在这次实训中,基本功能的实现几乎没有遇到很大的问题,只是做完后发现有些错误没有进行处理,如密码按键超过8个,或者开始就按清除键,这些我在处理时利用判断语句,若超过8个的即不增加按键序号值KEY_CNT,仍保持8个,不做响应,同理,清除键的处理也是,当按键序号值为0时,不进行减操作,跳过清除程序;最后完成以后,由于有时间剩余,加上之前做过的实训,就想到利用了外部中断进行密码修改和复位,其中复位功能的实现原理就是清除密码区的值以及按键序号值、数码管显示位数值,我做了最久的是密码修改功能,这里用到了标志位来辨别是否是密码修改功能,因此无论在确认还是报警处都要增加判断标志位来识别是否是修改密码,开始我是想到每次按键时都判断一下是否是修改密码,是就存储在初始密码区,不是就存储在确认密码区,后来发现这种做法很复杂,而且按一个就改一个,若中间我不想改了,就会导致只改了一部分,因此后来想到了一个巧妙的方法,就是利用密码确认区先存储要修改的密码,这样就省了每次0按键时的判断,而且当密码输入8个时,就关标志位和中断,把确认密码区的密码转存到初始密码区,再清除密码确认区的密码,这样就实现了密码的修改,而且中间突然不想改的话也不会影响到初始密码;在实训过程中,还遇到一个问题,就是当代码达到一定长度时,有些跳转语句会超出地址范围,第一我在处理时,就是调整代码的布局,第二就是借助中间标志,跳转到标志处再利用长跳转语句实现。
最后连接电路图时,遇到一点点小问题,接触不良导致不能下载程序。
通过此次实训,增强了自己的动手能力,学会利用前面实训学到的知识一步步增加需要实现的功能。