标题:
一个汇编语言单片机电子密码锁程序+Proteus仿真
[打印本页]
作者:
初学者52
时间:
2021-4-18 20:03
标题:
一个汇编语言单片机电子密码锁程序+Proteus仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png
(31.09 KB, 下载次数: 103)
下载附件
2021-4-18 22:22 上传
单片机汇编语言源程序如下:
;===================================================
;
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
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电子密码锁.rar
(121.75 KB, 下载次数: 52)
2021-4-18 20:02 上传
点击文件名下载附件
师兄改的
下载积分: 黑币 -5
作者:
Flechazo77
时间:
2022-5-27 09:01
请问原本设定好的密码是什么呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1