⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mms.asm

📁 Proteus设计的51单片机电子密码锁.rar
💻 ASM
字号:
;===================================================
;名    称:电子密码锁
;作    者:小发
;日    期:2007年06月13日
;修改日期:2007年06月18日
;说    明:首先显示器提示输入密码,密码在12.5S内输入有效,
;         输入次三次错误报警10S,输入正确开门,7秒后返回初态
;         以上参数均可在主程序里设定,修改系统密码在程序的结尾
;===================================================

        RS BIT P2.7 
        RW BIT P2.6
        E BIT P2.5
        ENTER BIT 22H.0
        OPEN BIT P3.6
        SPEAK BIT P3.7
        PASSBUF EQU 40H
        KEYNUMBER EQU 41H       ;存放识别后的按键号
	ORG 0000H
        AJMP MAIN
        ORG 0003H
        JMP KEY_INT
        ORG 000BH
        AJMP INTT0
        ORG 001BH
        AJMP INTT1
        ORG 0030H
;========== 主程序开始 ==============
MAIN:   MOV 30H,#07H          ;输入密码为7位  最高只可设15位
        MOV 42H,#200         ;设定报警的时间,42H单元里的数*50MS
	MOV 43H,#250          ;设定开门时间     14的倍数(实际上液晶显示器执行指令占用了时间,开门时间会比14*250MS大)
	;44H号单元存放输入错误的次数
        ;45H为定时器0中断次数
	;46H为定时器1中断次数
        MOV 47H,#250          ;输入密码时间设定,50MS倍数
	MOV SP,#60H
        CLR OPEN
        CLR SPEAK              ;初始化输出设备
        CLR ENTER              ;标志位初始化
	
        MOV TMOD,#11H          ;定时器工作方式2
        MOV TH0,#3CH           ;初值50MS
        MOV TL0,#0BH 
	MOV TH1,#3CH           
        MOV TL1,#0BH 
        SETB EA
	SETB ET0
	SETB ET1
        
        MOV TCON,#00000000B     ;电平触发
START:  MOV R0,30H
        MOV R1,#31H
SS1:	MOV @R1,#00H
	INC R1
        DJNZ R0,SS1            ;将输入密码缓冲单元清零
        MOV P1,#0FH            ;初始化按键口
	MOV R1,#31H             ;从31号单元开始存放按建输入的密码          
        CLR 20H                 ;报警标志清零
	CLR 21H                 ;密码超时标志
	MOV 46H,#00H           ;超时后对定时器中断次数清零,便于下一轮重新计时
INIT:   ACALL SELLCD            ;设定液晶工作方式
        ACALL LINE1             ;在第一行显示
        MOV DPTR,#MES_P         ;显示请输入密码
        ACALL DISPLAY
	setb EX0               ;开中断,允许键盘输入
KEYIN:  JB  21H,ERR             ;超时转到错误程序
        JNB ENTER,KEYIN         ;等待ENTER按下
        CLR ENTER
	clr EX0                ;密码输入完后锁定键盘
;当使用边沿触发时用上面的指令为什么禁止不了中断???
;========== 密码判断程序 ============
COMP:            
        MOV DPTR,#PASS
        MOV R4,30H             ;密码的长度
        MOV A,#0
        MOV R1,#31H            
LOOP:   MOV R5,A
        MOVC A,@A+DPTR
        MOV PASSBUF,A          ;取出系统设定的密码
        MOV A,@R1              ;从31号单元开始取出输入的密码
        CJNE A,PASSBUF,ERR     ;比较
        MOV A,R5
        INC A
        INC R1                 ;取下一位
        DJNZ R4,LOOP

;正确
MATCH:  MOV A,#01H
        ACALL ENABLE           ;清屏,光标复位
        ACALL LINE1            ;从第一行开始显示
        MOV DPTR,#MES_C
        ACALL DISPLAY          ;显示"请进"
	ACALL LINE2
	MOV DPTR,#TAB_1
	ACALL DISPLAY
        SETB OPEN              ;开门
	MOV 44H,#00H           ;输入错误次数清零
        MOV R6,43H                
        ACALL DELAY
	CLR OPEN               ;复位
        JMP START            
;错误
ERR:    ACALL BACK
        MOV R6,#03H
        ACALL DELAY
	ACALL BACK           ;输错提示音,鸣两下
        MOV A,#01H
        ACALL ENABLE
        ACALL LINE1
        MOV DPTR,#MES_E
        ACALL DISPLAY       ;显示错误
        MOV R6,#40H
        ACALL DELAY         
	INC  44H
	MOV A,44H
        CJNE A,#03H,EE0
EE0:    JC  ERROUT        ;输错不到三次返回
	MOV 44H,#00H        ;清零
	ACALL WRANING       ;报警
ERROUT: JMP START

;=========== 按键中断服务程序 ==========
KEY_INT:push acc
        push psw
	clr ex0
        acall delay10ms     ;延时消抖
        SETB TR1            ;启动定时器
        ACALL SMKEY         ;按键识别
	MOV A,KEYNUMBER     ;返回按键号
        ACALL BACK          ;按键发声
        MOV R3,A
        CJNE R3,#0BH,K1     ;ENTER是否按下
        SETB ENTER
	clr tr1             ;按下确认后关毕定时器
	mov 46h,#00h        ;对中断次数清零
        AJMP KEY_RTN
K1:     ADD A,#30H          ;将按键号转换为ASCⅡ码
        MOV @R1,A           ;将输入的密码存入缓冲单元
        INC R1              ;修改地址
        
        ACALL WRDATA        ;输入一位显示一个"*"
        
KEY_RTN:pop psw
        pop acc
	setb ex0
        RETI


;=========== 按键识别程序 ==========
SMKEY:   
         MOV A,P1
	 ANL A,#0FH
WKEY:    MOV B,A               ;反转法查询  
         MOV P1,#0F0H
	 NOP
	 MOV A,P1
	 ANL A,#0F0H
	 ORL A,B
	 MOV P1,#0FH         ;还原P1口初态
	 CJNE A,#0EEH,WKEY1
	 MOV KEYNUMBER,#00H       
	 AJMP RETURN
WKEY1:   CJNE A,#0EDH,WKEY2
	 MOV KEYNUMBER,#01H
	 AJMP RETURN
WKEY2:   CJNE A,#0EBH,WKEY3
	 MOV KEYNUMBER,#02H
	 AJMP RETURN
WKEY3:   CJNE A,#0E7H,WKEY4
	 MOV KEYNUMBER,#03H
	 AJMP RETURN
WKEY4:   CJNE A,#0DEH,WKEY5
	 MOV KEYNUMBER,#04H
	 AJMP RETURN
WKEY5:   CJNE A,#0DDH,WKEY6
	 MOV KEYNUMBER,#05H
	 AJMP RETURN
WKEY6:   CJNE A,#0DBH,WKEY7
	 MOV KEYNUMBER,#06H
	 AJMP RETURN
WKEY7:   CJNE A,#0D7H,WKEY8
	 MOV KEYNUMBER,#07H
	 AJMP RETURN
WKEY8:   CJNE A,#0BEH,WKEY9
	 MOV KEYNUMBER,#08H
	 AJMP RETURN
WKEY9:   CJNE A,#0BdH,WKEY10
	 MOV KEYNUMBER,#09H
	 AJMP RETURN
WKEY10:  CJNE A,#0BbH,WKEY11
	 MOV KEYNUMBER,#0AH
	 AJMP RETURN
WKEY11:  CJNE A,#0B7H,RETURN
	 MOV KEYNUMBER,#0BH       ;判断哪个键按下,返回相应按键号码
RETURN:  MOV P1,#0FH
         NOP
         NOP 
         MOV A,P1
         CPL A
	 ANL A,#0FH
	 JNZ RETURN              ;等待按键松开
         RET



;========== 液晶工作方式设置 ============
SELLCD: MOV A,#01H          ;清屏,光标复位    
        ACALL ENABLE
        MOV A,#38H          ;设置显示模式,8位两行,5*7点阵
        ACALL ENABLE
        MOV A,#0DH          ;显示器开,允许内烁
        ACALL ENABLE      
        MOV A,#06H          ;文字不动,光标右移
        ACALL ENABLE
        RET

;========== 液晶执行指令 ============
ENABLE: CLR RS
        CLR RW              ;RS,RW同为低电平时写入指令
        MOV P0,A
	CLR E               ;E由高变低时执行指令
        ACALL WAIT
        SETB E
        RET

;========== WAIT ============
;判断液晶是否忙的子程序
WAIT:   MOV P0,#0FFH
        CLR RS
	SETB RW             ;RW为高,RS为低时可读忙信号
	CLR E
	NOP
	SETB E
	JB P0.7,WAIT
	RET


        
;========== 显示的起始地址 ============
;在第一行
LINE1:  MOV A,#80H
        ACALL ENABLE
        RET
;在第二行
LINE2:  MOV A,#0C0H
        ACALL ENABLE
        RET


;=========== 显示程序 ============
DISPLAY:MOV R7,#00H
NEXT:   MOV A,R7
        MOVC A,@A+DPTR
        CJNE A,#10H,DSP
        RET
DSP:    ACALL WRDATA
        INC R7
        AJMP NEXT

;========== 将A里面的数据写入液晶 ============
WRDATA: SETB RS
        CLR RW
	MOV P0,A
	CLR E
	ACALL WAIT
	SETB E
	RET

;=========== 报警程序 ============ 
WRANING: SETB TR0
	 ACALL BACK
	 MOV R4,#00H
	 ACALL D2
	 JNB 20H, WRANING
         RET
;=========== 发声程序 ============ 
BACK:    MOV R0,#100
KK1:     CPL  SPEAK
         LCALL DELAY2MS
	 DJNZ  R0,KK1             ;不断取反P2.0使其产生一定频率的方波推动扬声器
	 RET                      ;延时的长短可以改变输出的频率 

;=========== INTT0 ============ 
;报警时间设定
INTT0:   PUSH ACC
         PUSH PSW                  
         MOV TH0,#3CH           
         MOV TL0,#0BH
         INC 45H
         MOV A,45H
         CJNE A,42H,INTT0OUT 
         MOV 45H,#00H
         SETB 20H                 ;置标志位
         CLR TR0                  ;关闭定时器
INTT0OUT:POP PSW
         POP ACC
         RETI
;=========== INTT1 ============ 
;输入超时
INTT1:   PUSH ACC
         PUSH PSW
	 INC 46H
	 MOV A,46H
         CJNE A,47H,INTT1OUT
	 CLR TR1                 ;关闭定时器
	 SETB 21H                ;时间到置标志位	
	 MOV 47H,#00H            ;中断次数清零
INTT1OUT:POP PSW
         POP ACC
         RETI  
;=========== 延时程序 ============
DELAY:    MOV R4,#38H
D1:       MOV R5,#0F9H
          DJNZ R5,$
          DJNZ R4,D1
          DJNZ R6,DELAY        ;14R6毫秒
          RET
DELAY2MS: MOV R4,#02H
D2:       MOV R5,#0F0H
          DJNZ R5,$
 	  DJNZ R4,D2
	  RET 
DELAY10ms:  MOV R4,#20
D3:         MOV R5,#248
            DJNZ R5,$
            DJNZ R4,D3
            RET

PASS:   DB "1314520"
MES_P:  DB "Password?",10H
MES_C:  DB "   welcome!",10H
MES_E:  DB "Error!",10H
TAB_1:  DB "xiao_fa office",10h     

        END


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -