单片机综合实训二密码锁的设计Word文档格式.docx
- 文档编号:22508372
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:22
- 大小:863.53KB
单片机综合实训二密码锁的设计Word文档格式.docx
《单片机综合实训二密码锁的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机综合实训二密码锁的设计Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
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位(行线)有低电平,去抖延时
设置P1高4位(行线)输入状态,已经延时,准备再读
CJNEA,#0F0H,MM;
再读P1高4位(行线),仍有低电平,确认是按键,转MM
再读P1高4位(行线),无低电平,表示抖动,非有效按键,
转MAIN继续监控
MM:
MOVLINE_NO,A;
P1高4位(行线)低电平持续时间符合按键要求,有效按键,
保存行号到LINE_NO
MOVP1,#0FH;
设置P1低4位(列线)输入状态
MOVROW_NO,P1;
保存列号到ROW_NO
MMM:
设置P1高4位(行线)输入状态
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
转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:
INCBIT_SEL
MOVA,#1
D33:
MOVA,KEY_CNT
JZD331;
无输入数字按键时进行清除的处理
MOVA,KEY_VAL
CLRA;
清楚原来输入的按键值
MOVKEY_VAL,A
ACALLPASSWD;
调用密码存储子程序对当前操作进行存储
DECKEY_CNT
DECBIT_SEL
D331:
MOVA,KEY_CNT
MOVA,#0BFH
MOVP0,A
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;
开重置密码中断
BIT0:
MOVA,KEY_CNT
SUBBA,#08
JNZPWN_SOUND;
密码修改不是8位警报
LJMPBIT_close
PWN_SOUND:
JZSOUND
CLRP3.7;
密码修改错误,LED发光二极管亮并报警
SOUND:
MOVR2,#3
START1:
JNBFLAG,NEXT3;
flag=0报警低音声,flag=1报警高音声
MOVR6,#200
DV:
CPLP3.5;
P1.0产生200个500Hz脉冲,报警低音声
LCALLDELY500
DJNZR6,DV
CPLFLAG;
标志位取反,两种报警声音(500Hz和1KHz)交替鸣响
NEXT3:
DV1:
P1.0产生200个1KHz脉冲,报警高音声
DJNZR6,DV1
标志位取反,两种报警声音(500Hz和1KHz)交替鸣响
DJNZR2,NEXT4
JZNEXT5
SETBP3.7
NEXT5:
NEXT4:
LJMPSTART1
KEYVAL:
按键序号超过8个不做处理,为无效按键,序号仍然为8个,并返回主函数
SUBBA,#09
MOVP2,A;
MOVA,ROW_NO;
JNBACC.0,D1;
第1列按键,转D1
JNBACC.1,D2;
第2列按键,转D2
JNBACC.2,D3;
第3列按键,转D3
JNBACC.3,D4;
第4列按键,转D4
D1:
ADDA,LINEinitialKEYVAL;
按键号=行键初值+列键值(列键值为0)
D2:
MOVA,#1
按键号=行键初值+列键值(列键值为1)
D3:
MOVA,#2
按键号=行键初值+列键值(列键值为2)
ACALLPASSWD
D4:
MOVA,#3
按键号=行键初值+列键值(列键值为3)
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
MOVCA,@A+DPTR
MOVP2,A
RETI
修改密码实现
INTT1:
MOVR7,#1
MOVKEY_CNT,#0
MOVA,BIT_SEL
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
密码修改正确,LED发光二极管亮一秒作为提示
ACALLDELAY1S
SETBP3.7
CLREX1
MOVR7,#0
MOVKEY_CNT,#0
MOVBIT_SEL,#0
MOVA,BIT_SEL
MOVCA,@A+DPTR
MOVP2,A
RETI
依据按键序号顺序存入密码缓冲区
PASSWD:
SUBBA,#01H
JNZPD2
MOVPASSWD1,KEY_VAL
PD2:
SUBBA,#02H
JNZPD3
MOVPASSWD2,KEY_VAL
PD3:
SUBBA,#03H
JNZPD4
MOVPASSWD3,KEY_VAL
PD4:
SUBBA,#04H
JNZPD5
MOVPASSWD4,KEY_VAL
PD5:
SUBBA,#05H
JNZPD6
MOVPASSWD5,KEY_VAL
PD6:
SUBBA,#06H
JNZPD7
MOVPASSWD6,KEY_VAL
PD7:
SUBBA,#07H
JNZPD8
MOVPASSWD7,KEY_VAL
PD8:
SUBBA,#08H
JNZNEXT
MOVPASSWD8,KEY_VAL
NEXT:
RET
DELAY1S:
MOVR3,#10
DEL3:
MOVR4,#200
DEL2:
MOVR5,#125
DEL1:
DJNZR5,DEL1
DJNZR4,DEL2
DJNZR3,DEL3
DELAY:
MOVR1,#3;
延时程序
D:
MOVR2,#255
DJNZR2,$
DJNZR1,D
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个时,就关标志位和中断,把确认密码区的密码转存到初始密码区,再清除密码确认区的密码,这样就实现了密码的修改,而且中间突然不想改的话也不会影响到初始密码;
在实训过程中,还遇到一个问题,就是当代码达到一定长度时,有些跳转语句会超出地址范围,第一我在处理时,就是调整代码的布局,第二就是借助中间标志,跳转到标志处再利用长跳转语句实现。
最后连接电路图时,遇到一点点小问题,接触不良导致不能下载程序。
通过此次实训,增强了自己的动手能力,学会利用前面实训学到的知识一步步增加需要实现的功能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 综合 实训二 密码锁 设计