您的当前位置:首页正文

51单片机密码锁程序

2022-01-12 来源:客趣旅游网
;初始正确密码为000000 ;密码错误,错误灯亮;

;密码连续错误3次锁定灯亮,机器锁定 ;按下接触锁定方可继续运行;

;密码正确,正确灯亮,输入新密码,输入完成灯灭; ;密码被更改,开始新的循环;

;断电后整机复位,初始密码恢复000000;

KEYBUF EQU 30H ;键值暂存单元,查表时用 ;************************************* ;* * ;* 主程序和中断程序入口 * ;* * ;************************************* ORG 0000H ;程序执行开始地址

AJMP MAIN1 ;跳至MAIN执行 ;************************************* ;* * ;* 主 程 序 * ;* * ;************************************* ORG 0040H MAIN1: MOV R1,#30H ; 设置R1初始值30h CLR 21H.0 ; 清零设置的错误标志位

MOV R4,#00H MOV P2,#00H MAIN: MOV P1,#0FFH CLR P2.0

;

; ; ;

连续错误次数初始值0次

LCALL KEYSCAN ;主体程序。调用查键子程序

CJNE R1,#36H,JI ; 按键不到(36-30)=6次,跳转。 MOV R1,#30H ; 按键次数回归初始值

JNB 21H.0,JI1 ; 判断是否有错 ,无错跳转 INC R4 ; 连续错误次数加1 CLR 21H.0 ; 清除错误标志 SETB P2.1 ; LCALL DELAY1S ; CLR P2.1 ; CJNE R4,#3,JI ; 判断是否连续错3次,不到3次跳转。 MOV R4,#00H ; SETB P2.3 ; JB P1.3,$ ; CLR P2.3 ; AJMP JI ; JI1:

SETB P2.2 ; LCALL DELAY1S ; MOV R4,#00H ; SHURU: lcall keyscan ; CJNE R1,#36H,SHURU ;输入6位后继续往下 MOV R1,#30H CLR P2.2 JI:

LJMP MAIN ;转MAIN循环 NOP ;软件陷阱 NOP NOP

LJMP MAIN

;************************************* ;* * ;* 键盘工作子程序(4 * 4 阵列) * ;* 出口为各键工作程序入口 P1口 * ;************************************* KEYSCAN:

MOV P1,#0FFH;清P1口,初始化键低电平有效 CLR P1.4;清P1.4口

MOV A,P1;读P1口状态

ANL A,#0FH;清高4位,保留低四位低电平有效

XRL A,#0FH;异或相同则为0不同结果为1,为0则表示无键被按下(这一行) JZ NOKEY1;为0则转下一行键值处理

LCALL DL10MS;有键按下则延时10ms再测一次抗干扰 MOV A,P1 ANL A,#0FH XRL A,#0FH

JZ NOKEY1;是干扰则转下一行键值处理程序 MOV A,P1

ANL A,#0FH;保留低四? KB1:

CJNE A,#0EH,KB2;如果值为#0E则为P1.4与P1.0组合的键 MOV KEYBUF,#1;赋键值 LJMP KEYWORK;转键处理

KB2: CJNE A,#0DH,KB3;如果值为#0D则为P1.4与P1.1组合的键 MOV KEYBUF,#2 LJMP KEYWORK

KB3: CJNE A,#0BH,KB5;如果值为#0B则为P1.4与P1.2组合的 MOV KEYBUF,#3 LJMP KEYWORK KB5: NOP

NOKEY1:

MOV P1,#0FFH CLR P1.5 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DL10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P1 ANL A,#0FH

CJNE A,#0EH,KB6 MOV KEYBUF,#4 LJMP KEYWORK KB6: CJNE A,#0DH,KB7 MOV KEYBUF,#5 LJMP KEYWORK

KB7: CJNE A,#0BH,KB9 MOV KEYBUF,#6 LJMP KEYWORK KB9: NOP

NOKEY2:

MOV P1,#0FFH CLR P1.6 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DL10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P1 ANL A,#0FH

CJNE A,#0EH,KB10 MOV KEYBUF,#7 LJMP KEYWORK KB10: CJNE A,#0DH,KB11 MOV KEYBUF,#8 LJMP KEYWORK KB11: CJNE A,#0BH,KB13 MOV KEYBUF,#9 LJMP KEYWORK KB13: NOP

NOKEY3:

MOV P1,#0FFH CLR P1.7 MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DL10MS MOV A,P1 ANL A,#0FH XRL A,#0FH JZ NOKEY4

MOV A,P1 ANL A,#0FH

CJNE A,#0EH,KB14 MOV KEYBUF,#10 LJMP KEYWORK KB14: CJNE A,#0DH,KB15 MOV KEYBUF,#0 LJMP KEYWORK KB15: CJNE A,#0BH,KB17 MOV KEYBUF,#11 LJMP KEYWORK KB17: NOP

NOKEY4: RET

KEYWORK:

JNB P2.2,DUZHI ;正确灭,跳转,读取密码,否则输入密码。 MOV A,KEYBUF;得到键值

MOV @R1,A;输入密码到寄存器 INC R1 AJMP WAITFREE DUZHI: MOV A,KEYBUF;得到键值 MOV 22H,A ;存键值到22h中

MOV A,@R1 ;R1指向地址30h-35h内的数据送a CJNE A,22H,ERR INC R1 WAITFREE:

MOV A,P1;以下程序等待键释放 MOV KEYBUF,#00H ANL A,#0FH XRL A,#0FH JNZ WAITFREE RET

ERR:SETB 21H.0 INC R1

AJMP WAITFREE ;

;************************************* ;* * ;* 延时513 us * ;* * ;*************************************

;

;513微秒延时程序

DELAY: MOV R2,#0FEH DELAY1: DJNZ R2,DELAY1 RET ; ; ;

;************************************* ;* * ;* 延时10ms * ;* * ;************************************* ;

;10毫秒延时程序

DL10MS: MOV R3,#14H

DL10MS1: MOV R2,#0FEH DL10MS2: DJNZ R2,DL10MS2 DJNZ R3,DL10MS1 RET DELAY1S : MOV R3,#008H ZL10MS1: MOV R2,#0FEH

ZL10MS2: MOV R6,#0FEH ZL10MS3: DJNZ R6,ZL10MS3 DJNZ R2,ZL10MS2 DJNZ R3,ZL10MS1 RET;

end

因篇幅问题不能全部显示,请点此查看更多更全内容