1、单片机综合实训二密码锁的设计密码锁的设计报告一、 设计内容:用4*3的键盘组成09的数字键及确认键、删除键;用8位数码管组成显示电路提示信息,当输入密码时,只显示“”,当密码位数输入完毕按下确认键时,对输入的密码和设定的初始密码进行比较,若密码正确,则开锁,此时P3.0口的LED(即黄灯)亮一秒作为提示;若密码不正确,禁止输入3秒种,同时发出报警声。初始密码为8位。 增加功能:利用外部中断0和1分别实现复位和密码修改功能,说明见原理图参考器件:89C51, RES, CAP, CAP-ELEC, CRYSTAL, LED-YELLOW,7SEG-MPX8-CC-BLUE, SOUNDER, B
2、UTTON, 74LS245 二、 原理图:三、流程图:是是是是是是是 是是四、实物图:五、源程序LINE_NO EQU 20H;行号ROW_NO EQU 31H;列号LINEinitialKEYVAL EQU 30H;行初始键值KEY_VAL EQU 32HKEY_CNT EQU 33H;数字按键的序号,如按键541,这时KEYORDER=3BIT_SEL EQU 34HFLAG BIT 00H;初始密码存储区LED_BIT1 EQU 41H LED_BIT2 EQU 42HLED_BIT3 EQU 43HLED_BIT4 EQU 44HLED_BIT5 EQU 45HLED_BIT6 EQ
3、U 46HLED_BIT7 EQU 47HLED_BIT8 EQU 48H;输入密码存储区PASSWD1 EQU 51HPASSWD2 EQU 52HPASSWD3 EQU 53HPASSWD4 EQU 54HPASSWD5 EQU 55HPASSWD6 EQU 56HPASSWD7 EQU 57HPASSWD8 EQU 58HORG 0000HLJMP STARTORG 0003HLJMP INTT0 ;中断处理,实现复位功能,清楚所有的有关操作ORG 0013HLJMP INTT1 ORG 0040HSTART: MOV SP,#70H MOV P0,#0FFH MOV A,#0FFH M
4、OV R0,#00H MOV R7,#0 MOV BIT_SEL,#0 ;显示数码管的位数初始为0 MOV KEY_CNT,#0 ;按键序号初始为0 MOV DPTR,#TAB ;设置初始密码 MOV LED_BIT1,#6 MOV LED_BIT2,#7 MOV LED_BIT3,#8 MOV LED_BIT4,#9 MOV LED_BIT5,#0 MOV LED_BIT6,#1 MOV LED_BIT7,#2 MOV LED_BIT8,#3MAIN: SETB EX0 SETB IT0 SETB EA; 开中断总允许 SETB PX0 MOV P1,#0F0H ;设置P1高4位(行线)输入
5、状态 MOV A,P1 CJNE A,#0F0H,M ; P1高4位(行线)有低电平,转M进一步判断是按键还是抖动 SJMP MAIN ; P1高4位(行线)无低电平,转MAIN继续监控M: ACALL DELAY ; P1高4位(行线)有低电平,去抖延时 MOV P1,#0F0H ; 设置P1高4位(行线)输入状态,已经延时,准备再读 MOV A,P1 CJNE A,#0F0H,MM ; 再读P1高4位(行线),仍有低电平,确认是按键,转MM SJMP MAIN ; 再读P1高4位(行线),无低电平,表示抖动,非有效按键,;转MAIN继续监控MM: MOV LINE_NO,A ; P1高4位
6、(行线)低电平持续时间符合按键要求,有效按键,;保存行号到LINE_NO MOV P1,#0FH ; 设置P1低4位(列线)输入状态 MOV ROW_NO,P1 ; 保存列号到ROW_NOMMM: MOV P1,#0F0H ; 设置P1高4位(行线)输入状态 MOV A,P1 CJNE A,#0F0H,MMM ; 读出P1高4位(行线)是否低电平(未松开键)? ; 未松开转MMM,继续监控松开否。 ; P1高4位(行线)有低电平,表明按键松开, ; 完成一次按键动作,执行下面语句 JNB LINE_NO.4, E1 ; LINE_NO.4!=1第1行有按键,转E1, ; 否则第1行无按键,执行
7、下面语句,判断其他行有按键否JNB LINE_NO.5, E2 ; LINE_NO.5!=1第2行有按键,转E2, ; 否则第1、2行无按键,执行下面语句,判断其他行有按键否JNB LINE_NO.6, E3 ; LINE_NO.6!=1第3行有按键,转E3,LJMP MAIN ; 否则无按键,转MAIN重新监控E1: MOV LINEinitialKEYVAL,#0 ;第1行有按键,该行键初值(30H内容)为0 LJMP KEYVAL ;转KEYVAL,求按键号E2: MOV LINEinitialKEYVAL,#4 ;第2行有按键,该行键初值(30H内容)为4 LJMP KEYVAL ;
8、转KEYVAL,求按键号E3: MOV LINEinitialKEYVAL,#8 ; 第3行有按键,该行键初值(30H内容)为8 MOV A, ROW_NO ; 将31H单元内容-列号取出 JNB ACC.0,D31 ; 第3行第1列按键,转D31, JNB ACC.1,D32 ; 第3行第2列按键,转D32 JNB ACC.2,D33 ; 第3行第3列按键,转D33 JNB ACC.3,D34 ; 第3行第4列按键,转D34 D31: MOV R0,KEY_CNT INC R0 MOV KEY_CNT, R0 ;按键序号KEY_CNT增1 MOV A,KEY_CNT ;按键序号超过9个不做处
9、理 SUBB A,#09 JZ NEXT1 INC BIT_SEL MOV A, BIT_SEL MOVC A,A+DPTR MOV P2,A ;选择要显示的数码管 ;MOV BIT_SEL, A ;数码管位号BIT_SEL左移1位 MOV A,#0 ADD A, LINEinitialKEYVAL MOV KEY_VAL, A ;MOVC A,A+DPTR ; 从键值代码显示表tab中查到该按键号对应的显示代码 MOV A,#0BFH MOV P0,A MOV P1,#0F0H ACALL PASSWD LJMP MAIND32: MOV R0,KEY_CNT INC R0 MOV KEY_
10、CNT, R0 ;按键序号KEY_CNT增1 MOV A,KEY_CNT ;按键序号超过9个不做处理 SUBB A,#09 JZ NEXT1 INC BIT_SEL MOV A, BIT_SEL MOVC A,A+DPTR MOV P2,A ;选择要显示的数码管 ;MOV BIT_SEL, A ;数码管位号BIT_SEL左移1位 MOV A,#1 ADD A, LINEinitialKEYVAL MOV KEY_VAL, A ;MOVC A,A+DPTR ; 从键值代码显示表tab中查到该按键号对应的显示代码 MOV A,#0BFH MOV P0,A MOV P1,#0F0H ACALL PA
11、SSWD LJMP MAIND33: MOV A,KEY_CNT JZ D331 ;无输入数字按键时进行清除的处理 MOV A,KEY_VAL CLR A ;清楚原来输入的按键值 MOV KEY_VAL,A ACALL PASSWD ;调用密码存储子程序对当前操作进行存储 DEC KEY_CNT DEC BIT_SELD331: MOV A, KEY_CNT MOVC A,A+DPTR MOV P2,A ;选择要显示的数码管 MOV A,#0BFH MOV P0,A MOV P1,#0F0H LJMP MAIN NEXT1: MOV KEY_CNT,#08 LJMP PWN_SOUND ;超过
12、8个按键时的警告D34: MOV A,R7 JNZ BIT0 MOV A,LED_BIT1 ;初始密码 CJNE A,PASSWD1,PWN_SOUND ;初始密码与输入密码进行比较 MOV A,LED_BIT2 CJNE A,PASSWD2,PWN_SOUND MOV A,LED_BIT3 CJNE A,PASSWD3,PWN_SOUND MOV A,LED_BIT4 CJNE A,PASSWD4,PWN_SOUND MOV A,LED_BIT5 CJNE A,PASSWD5,PWN_SOUND MOV A,LED_BIT6 CJNE A,PASSWD6,PWN_SOUND MOV A,LE
13、D_BIT7 CJNE A,PASSWD7,PWN_SOUND MOV A,LED_BIT8 CJNE A,PASSWD8,PWN_SOUND CLR P3.0 ;密码正确,LED发光二极管亮一秒作为提示 ACALL DELAY1S SETB P3.0 SETB EX1 ;开重置密码中断 LJMP MAIN BIT0: MOV A,KEY_CNT SUBB A,#08 JNZ PWN_SOUND ;密码修改不是8位警报 LJMP BIT_closePWN_SOUND: MOV A,R7 JZ SOUND CLR P3.7 ;密码修改错误,LED发光二极管亮并报警SOUND: MOV R2,#3
14、START1: JNB FLAG, NEXT3 ; flag=0报警低音声,flag=1报警高音声 MOV R6,#200DV: CPL P3.5 ; P1.0产生200个500Hz脉冲,报警低音声 LCALL DELY500 LCALL DELY500 DJNZ R6,DV CPL FLAG ;标志位取反,两种报警声音(500Hz和1KHz)交替鸣响NEXT3: MOV R6,#200DV1: CPL P3.5 ; P1.0产生200个1KHz脉冲,报警高音声 LCALL DELY500 DJNZ R6,DV1 CPL FLAG ; 标志位取反,两种报警声音(500Hz和1KHz)交替鸣响
15、DJNZ R2,NEXT4 MOV A,R7 JZ NEXT5 SETB P3.7NEXT5: LJMP MAIN NEXT4:LJMP START1KEYVAL: MOV R0,KEY_CNT INC R0 MOV KEY_CNT, R0 ;按键序号KEY_CNT增1 MOV A,KEY_CNT ;按键序号超过8个不做处理,为无效按键,序号仍然为8个,并返回主函数 SUBB A,#09 JZ NEXT1 INC BIT_SEL MOV A, BIT_SEL MOVC A,A+DPTR MOV P2,A ;选择要显示的数码管 ;MOV BIT_SEL, A ;数码管位号BIT_SEL左移1位
16、MOV A, ROW_NO ; 将31H单元内容-列号取出 JNB ACC.0,D1 ; 第1列按键,转D1 JNB ACC.1,D2 ; 第2列按键,转D2 JNB ACC.2,D3 ; 第3列按键,转D3 JNB ACC.3,D4 ; 第4列按键,转D4D1: MOV A,#0 ADD A, LINEinitialKEYVAL ; 按键号=行键初值+列键值(列键值为0 ) MOV KEY_VAL, A ;MOVC A,A+DPTR ; 从键值代码显示表tab中查到该按键号对应的显示代码 MOV A,#0BFH MOV P0,A MOV P1,#0F0H ACALL PASSWD LJMP
17、MAIND2: MOV A,#1 ADD A, LINEinitialKEYVAL ; 按键号=行键初值+列键值(列键值为1) MOV KEY_VAL, A ;MOVC A,A+DPTR ; 从键值代码显示表tab中查到该按键号对应的显示代码 MOV A,#0BFH MOV P0,A MOV P1,#0F0H ACALL PASSWD LJMP MAIND3: MOV A,#2 ADD A, LINEinitialKEYVAL ; 按键号=行键初值+列键值(列键值为2) MOV KEY_VAL, A ;MOVC A,A+DPTR ; 从键值代码显示表tab中查到该按键号对应的显示代码 MOV
18、A,#0BFH MOV P0,A MOV P1,#0F0H ACALL PASSWD LJMP MAIND4: MOV A,#3 ADD A, LINEinitialKEYVAL ; 按键号=行键初值+列键值(列键值为3) MOV KEY_VAL, A ;MOVC A,A+DPTR ; 从键值代码显示表tab中查到该按键号对应的显示代码 MOV A,#0BFH MOV P0,A MOV P1,#0F0H ACALL PASSWD LJMP MAIN DELY500: MOV R0,#250 ;500us软件延迟程序,用于报警LOOP: NOPDJNZ R0,LOOPRET;复位实现INTT0:
19、 MOV PASSWD1,#0 MOV PASSWD2,#0 MOV PASSWD3,#0 MOV PASSWD4,#0 MOV PASSWD5,#0 MOV PASSWD6,#0 MOV PASSWD7,#0 MOV PASSWD8,#0 MOV KEY_CNT,#0 MOV BIT_SEL,#0 MOV A, BIT_SEL MOVC A,A+DPTR MOV P2,A MOV A,#0BFH MOV P0,A RETI;修改密码实现INTT1: MOV R7,#1 MOV KEY_CNT,#0 MOV BIT_SEL,#0 MOV A, BIT_SEL MOVC A,A+DPTR MOV
20、 P2,A MOV A,#0BFH MOV P0,A LJMP MAINBIT_close: MOV LED_BIT1,PASSWD1 MOV LED_BIT2,PASSWD2 MOV LED_BIT3,PASSWD3 MOV LED_BIT4,PASSWD4 MOV LED_BIT5,PASSWD5 MOV LED_BIT6,PASSWD6 MOV LED_BIT7,PASSWD7 MOV LED_BIT8,PASSWD8 MOV PASSWD1,#0 MOV PASSWD2,#0 MOV PASSWD3,#0 MOV PASSWD4,#0 MOV PASSWD5,#0 MOV PASSWD
21、6,#0 MOV PASSWD7,#0 MOV PASSWD8,#0 CLR P3.7 ;密码修改正确,LED发光二极管亮一秒作为提示 ACALL DELAY1S SETB P3.7 CLR EX1 MOV R7,#0 MOV KEY_CNT,#0 MOV BIT_SEL,#0 MOV A, BIT_SEL MOVC A,A+DPTR MOV P2,A RETI ;依据按键序号顺序存入密码缓冲区PASSWD: MOV A,KEY_CNT SUBB A,#01H JNZ PD2 MOV PASSWD1,KEY_VALPD2: MOV A,KEY_CNT SUBB A,#02H JNZ PD3 M
22、OV PASSWD2,KEY_VALPD3: MOV A,KEY_CNT SUBB A,#03H JNZ PD4 MOV PASSWD3,KEY_VALPD4: MOV A,KEY_CNT SUBB A,#04H JNZ PD5 MOV PASSWD4,KEY_VALPD5: MOV A,KEY_CNT SUBB A,#05H JNZ PD6 MOV PASSWD5,KEY_VALPD6: MOV A,KEY_CNT SUBB A,#06H JNZ PD7 MOV PASSWD6,KEY_VAL PD7: MOV A,KEY_CNT SUBB A,#07H JNZ PD8 MOV PASSWD
23、7,KEY_VALPD8: MOV A,KEY_CNT SUBB A,#08H JNZ NEXT MOV PASSWD8,KEY_VALNEXT: RETDELAY1S:MOV R3,#10DEL3: MOV R4,#200DEL2: MOV R5,#125DEL1: NOP NOP DJNZ R5,DEL1 DJNZ R4,DEL2 DJNZ R3,DEL3 RETDELAY: MOV R1,#3 ; 延时程序D: MOV R2,#255 DJNZ R2,$ DJNZ R1,D RETTAB:;DB 0C0H,0F9H,0A4H,0B0H ;DB 99H,92H,82H,0F8H,80H,9
24、0H,88H,83H ;DB 0C6H,0A1H,86H,8EH DB 00H,01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFHEND六、心得体会 在这次实训中,基本功能的实现几乎没有遇到很大的问题,只是做完后发现有些错误没有进行处理,如密码按键超过8个,或者开始就按清除键,这些我在处理时利用判断语句,若超过8个的即不增加按键序号值KEY_CNT,仍保持8个,不做响应,同理,清除键的处理也是,当按键序号值为0时,不进行减操作,跳过清除程序;最后完成以后,由于有时间剩余,加上之前做过的实训,就想到利用
25、了外部中断进行密码修改和复位,其中复位功能的实现原理就是清除密码区的值以及按键序号值、数码管显示位数值,我做了最久的是密码修改功能,这里用到了标志位来辨别是否是密码修改功能,因此无论在确认还是报警处都要增加判断标志位来识别是否是修改密码,开始我是想到每次按键时都判断一下是否是修改密码,是就存储在初始密码区,不是就存储在确认密码区,后来发现这种做法很复杂,而且按一个就改一个,若中间我不想改了,就会导致只改了一部分,因此后来想到了一个巧妙的方法,就是利用密码确认区先存储要修改的密码,这样就省了每次0按键时的判断,而且当密码输入8个时,就关标志位和中断,把确认密码区的密码转存到初始密码区,再清除密码确认区的密码,这样就实现了密码的修改,而且中间突然不想改的话也不会影响到初始密码;在实训过程中,还遇到一个问题,就是当代码达到一定长度时,有些跳转语句会超出地址范围,第一我在处理时,就是调整代码的布局,第二就是借助中间标志,跳转到标志处再利用长跳转语句实现。最后连接电路图时,遇到一点点小问题,接触不良导致不能下载程序。通过此次实训,增强了自己的动手能力,学会利用前面实训学到的知识一步步增加需要实现的功能。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1