单片机的密码锁

单片机的密码锁... 单片机的密码锁 展开
 我来答
我de宝er
2010-10-12 · TA获得超过755个赞
知道答主
回答量:65
采纳率:0%
帮助的人:30.1万
展开全部
  TLOW EQU 00H
  THIGH EQU 0EEH
  COUN0 EQU 200 ;5ms * 200 = 1S
  COUN1 EQU 3FH ;密码的位数
  D_TIME EQU 3EH ;设置密码时的时间限制
  SEC EQU 3DH ;秒单元

  PASS_OLD EQU 30H
  PASS_NEW EQU 40H

  SDA EQU P3.4 ;24C01的串行数据线
  SCLK24 EQU P3.3 ;24C01的串行时钟线

  ;20H.0 为时间限制标记
  ;20H.1 为按错键标记
  ;20H.2 为比较对错标记
  ;20H.3 为3秒时间标记

  RS EQU P2.0
  RW EQU P2.1
  EN EQU P2.2
  X EQU 2FH ;LCD 地址变量
  BEEP EQU P3.7
  ;--------------------------------------------------
  ORG 0000H
  JMP MAIN
  ORG 0BH
  JMP T0_INT
  ;--------------------------------------------------
  MAIN:
  MOV SP,#60H
  MOV A,#00H
  MOV D_TIME,A
  MOV SEC,A
  MOV COUN1,A
  MOV R5,#06H
  MOV R0,#PASS_OLD

  CLR_01: MOV @R0,A
  INC R0
  DJNZ R5,CLR_01
  CLR EN
  CLR 20H.0
  CLR 20H.1
  CLR 20H.2
  CLR 20H.3
  CALL INIT_TIMER
  CALL SET_LCD
  CALL MENU1
  CALL PASS_READ ;读出预定密码。
  LOOP1:
  CALL SCAN_KEY
  CALL DELAY2
  CJNE A,#0fH,LOOP1 ;按F键启动进入输入密码程序
  SETB TR0

  LP0: CALL SCAN_KEY ;按住F键3秒以上蜂鸣器不响为止
  CALL DELAY2
  CJNE A,#0fH,LP3
  JB 20H.3,LP1 ;3秒到,20H.3置1。
  JMP LP0

  LP1: CLR TR0 ;停止中断
  MOV SEC,#00H ;秒单元清零
  CLR 20H.3 ;清3秒标记位

  LP2: MOV P1,#0F0H ;等待键释放
  MOV A,P1
  CJNE A,#0F0H,LP2
  CALL PASS_IN
  JB 20H.2,LOOP2 ;密码正确后方可转下一步
  JMP LP4

  LP3: CLR TR0 ;停止中断
  CLR 20H.3 ;清3秒标记位
  MOV SEC,#00H ;秒单元清零
  LP4: CALL SYS_RST ;系统复位
  RET
  NOP
  NOP
  NOP
  LJMP MAIN
  LOOP2: MOV R4,#06H ;模拟输出蜂鸣器响六声
  LOOP3: CALL BZ
  DJNZ R4,LOOP3

  MOV A,#00H

  LOOP4: CALL SCAN_KEY
  CJNE A,#0AH,LOOP6 ;按A键进入PASS_LOOK
  CALL PASS_LOOK

  LOOP5: CALL SCAN_KEY
  CJNE A,#0EH,LOOP5 ;按E键退出PASS_LOOK
  CALL MENU1
  CALL MENU2

  LOOP6: CJNE A,#0BH,LOOP8 ;按B键进入PASS_SET
  CALL PASS_SET

  LOOP7: CALL SCAN_KEY
  CJNE A,#0EH,LOOP7 ;按E键退出PASS_SET
  CALL MENU1
  CALL MENU2

  LOOP8: CJNE A,#0DH,LOOP4 ;按D键退出
  ACALL MAIN ;PASS_LOOK和PASS_SET状态

  JMP LOOP4
  SYS_RST:
  RST1: CALL SCAN_KEY
  CJNE A,#0DH,RST1 ;"D" 键
  LJMP MAIN
  RET
  NOP
  NOP
  NOP
  LJMP MAIN
  PASS_IN:

  MOV 21H,#03H ;允许输入三次密码
  P_IN1: MOV DPTR,#IN_PASS0 ;
  MOV A,#1 ;
  CALL LCD_SHOW
  MOV DPTR,#INFO2 ;指针指到显示信息2
  MOV A,#2 ;显示在第二行
  CALL LCD_SHOW

  MOV R0,#PASS_OLD
  MOV R3,#00H
  MOV R2,#09H ;设置LCD地址
  MOV COUN1,#06H ;6位密码
  SETB TR0

  P_IN2: JB 20H.0,P_IN4
  MOV P1,#0F0H
  MOV A,P1
  CJNE A,#0F0H,P_IN3
  jmp P_IN2
  P_IN3:
  CALL KEY_IN
  CALL SETDATA0
  CALL BZ
  JB 20H.1,P_IN4
  DJNZ COUN1,P_IN2
  CLR TR0
  CLR 20H.0
  CALL PASS_COMP
  JNB 20H.2,P_IN4 ;比较对错标记
  RET
  P_IN4: CLR TR0
  CLR 20H.0 ;
  CLR 20H.1 ;
  CALL INPUT_ERR
  DJNZ 21H,P_IN1 ;
  RET
  IN_PASS0:
  DB " INPUT PASSWORD ",0
  PASS_COMP:
  MOV COUN1,#06H ;比较6位数值
  MOV R0,#PASS_OLD
  MOV R1,#PASS_NEW
  P_COMP0: MOV A,@R0
  MOV B,@R1
  CJNE A,B,P_COMP1
  INC R0
  INC R1
  DJNZ COUN1,P_COMP0
  CALL INPUT_OK
  SETB 20H.2
  RET
  P_COMP1: CLR 20H.2
  ;CALL INPUT_ERR
  RET
  PASS_SET:

  MOV 21H,#05H ;允许输入三次密码

  P_SET1: MOV DPTR,#SET_PASS0 ;
  MOV A,#1 ;
  CALL LCD_SHOW
  MOV DPTR,#INFO2 ;指针指到显示信息2
  MOV A,#2 ;显示在第二行
  CALL LCD_SHOW

  MOV R3,#00H
  MOV R2,#09H ;设置LCD地址
  MOV R1,#PASS_NEW
  MOV COUN1,#06H ;6位密码
  SETB TR0

  P_SET2: JB 20H.0,P_SET4
  MOV P1,#0F0H
  MOV A,P1
  CJNE A,#0F0H,P_SET3
  jmp P_SET2
  P_SET3:
  CALL KEY_IN
  CALL SETDATA1
  CALL BZ
  JB 20H.1,P_SET4
  ;MOV R5,#04H
  ;CALL DELAY
  DJNZ COUN1,P_SET2
  CLR TR0
  CLR 20H.0
  CALL RESET_OK
  CALL EEPW
  RET
  P_SET4: CLR TR0
  CLR 20H.0 ;
  CLR 20H.1 ;
  CALL RESET_ERR
  DJNZ 21H,P_SET1 ;
  RET

  SET_PASS0:
  DB " RESET PASSWORD ",0
  MENU1: ;LCD 显示工作菜单信息
  MOV DPTR,#MENU01
  MOV A,#1 ;在第一行显示信息
  CALL LCD_SHOW
  RET
  MENU01: DB "PASSWORD CONTROL",0
  MENU2: ;LCD 显示工作菜单信息
  MOV DPTR,#MENU02
  MOV A,#2 ;在第一行显示信息
  CALL LCD_SHOW
  RET
  SETDATA1:
  MOV A,R3
  ANL A,#0FH ;取出低四位二进制数
  PUSH ACC
  CLR C
  SUBB A,#0AH ;减10
  POP ACC
  JC ASCII3 ;该数小于10,转ASCII0
  SETB 20H.1
  RET
  ADD A,#07H ;大于10的数加上37H
  ASCII3: ADD A,#30H ;小于10的数加上30H
  MOV @R1,A
  MOV B,R2
  CALL LCDP2
  INC R2
  INC R1
  RET

  SETDATA0:

  MOV A,R3
  ANL A,#0FH ;取出低四位二进制数
  PUSH ACC
  CLR C
  SUBB A,#0AH ;减10
  POP ACC
  JC ASCII4 ;该数小于10,转ASCII4
  SETB 20H.1
  RET
  ASCII4: ADD A,#30H ;小于10的数加上30H
  MOV @R0,A ;保存密码值
  MOV A,#2AH ;显示" * "
  MOV B,R2
  CALL LCDP2
  INC R2
  INC R0
  RET
  PASS_LOOK:
  MOV DPTR,#LOOK1 ;指针指到显示信息1
  MOV A,#1 ;显示在第一行
  CALL LCD_SHOW
  MOV DPTR,#LOOK2 ;指针指到显示信息2
  MOV A,#2 ;显示在第二行
  CALL LCD_SHOW
  MOV R1,#PASS_NEW
  MOV R2,#09
  MOV COUN1,#06
  LOOK0: MOV A,@R1
  MOV B,R2
  CALL LCDP2
  INC R2
  INC R1
  DJNZ COUN1,LOOK0
  RET

  LOOK1: DB " LOOK PASSWORD ",0 ;LCD 第一行显示信息
  LOOK2: DB "PASSWORD ------ ",0 ;LCD 第二行显示信息
  SCAN_KEY:
  SCAN_K: MOV P1,#0F0H
  MOV A,P1
  CJNE A,#0F0H,KEY_NUM0 ;有键按下转
  JMP KEY_END
  KEY_NUM0: CALL KEY_IN
  CALL BZ
  MOV R5,#04H
  CALL DELAY
  KEY_END: RET
  KEY_IN: MOV P1,#0F0H ;置列线为0,行线为1
  MOV A,P1
  ANL A,#0F0H
  MOV B,A
  MOV P1,#0FH ;置列线为1,行线为0
  MOV A,P1
  ANL A,#0FH
  ORL A,B ;高四位与低四位重新组合
  CJNE A,#0FFH,KEY_IN1 ;0FFH为末按键
  RET
  KEY_IN1: MOV B,A
  MOV DPTR,#KEYTABLE
  MOV R3,#0FFH
  KEY_IN2: INC R3
  MOV A,R3
  MOVC A,@A+DPTR
  CJNE A,B,KEY_IN3
  MOV A,R3 ;找到,取顺序码
  RET
  KEY_IN3: CJNE A,#0FFH,KEY_IN2 ;末完,继续查
  RET ;0FFH为结束码
  SET_LCD:
  CLR EN
  CALL INIT_LCD ;初始化 LCD
  CALL DELAY1
  MOV DPTR,#INFO1 ;指针指到显示信息1
  MOV A,#1 ;显示在第一行
  CALL LCD_SHOW
  MOV DPTR,#INFO2 ;指针指到显示信息2
  MOV A,#2 ;显示在第二行
  CALL LCD_SHOW
  RET
  INFO1: DB " ",0 ;LCD 第一行显示信息
  INFO2: DB "PASSWORD ------ ",0 ;LCD 第二行显示信息INIT_LCD: ;8位I/O控制 LCD 接口初始化
  MOV A,#38H ;双列显示,字形5*7点阵
  CALL WCOM
  CALL DELAY1
  MOV A,#38H ;双列显示,字形5*7点阵
  CALL WCOM
  CALL DELAY1
  MOV A,#38H ;双列显示,字形5*7点阵
  CALL WCOM
  CALL DELAY1
  MOV A,#0CH ;开显示,关光标,
  CALL WCOM
  CALL DELAY1
  MOV A,#01H ;清除 LCD 显示屏
  CALL WCOM
  CALL DELAY1
  RET
  LCD_SHOW: ;在LCD的第一行或第二行显示信息字符

  CJNE A,#1,LINE2 ;判断是否为第一行
  LINE1: MOV A,#80H ;设置 LCD 的第一行地址
  CALL WCOM ;写入命令
  CALL CLR_LINE ;清除该行字符数据
  MOV A,#80H ;设置 LCD 的第一行地址
  CALL WCOM ;写入命令
  JMP FILL
  LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
  CALL WCOM ;写入命令
  CALL CLR_LINE ;清除该行字符数据
  MOV A,#0C0H ;设置 LCD 的第二行地址
  CALL WCOM
  FILL: CLR A ;填入字符
  MOVC A,@A+DPTR ;由消息区取出字符
  CJNE A,#0,LC1 ;判断是否为结束码
  RET
  LC1: CALL WDATA ;写入数据
  INC DPTR ;指针加1
  JMP FILL ;继续填入字符
  RET
  CLR_LINE: ;清除该行 LCD 的字符
  MOV R0,#24
  CL1: MOV A,#' '
  CALL WDATA
  DJNZ R0,CL1
  RET
  ENABLE: ;写指令使能
  CLR RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲
  CLR RW
  SETB EN
  CALL DELAY0
  CLR EN
  RET
  ENABLE1: ;写数据使能
  SETB RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲
  CLR RW
  SETB EN
  CALL DELAY0
  CLR EN
  RET

  DELAY0: MOV R7,#250 ;延时500微秒
  DJNZ R7,$
  RET
  WCOM: ;以8位控制方式将命令写至LCD
  MOV P0,A ;写入命令
  CALL ENABLE
  RET
  WDATA: ;以8位控制方式将数据写至LCD
  MOV P0,A ;写入数据
  CALL ENABLE1
  RET
  LCDP2: ;在LCD的第二行显示字符
  PUSH ACC ;
  MOV A,B ;设置显示地址
  ADD A,#0C0H ;设置LCD的第二行地址
  CALL WCOM ;写入命令
  POP ACC ;由堆栈取出A
  CALL WDATA ;写入数据
  RET
  CONV:
  MOV X,#9 ;设置显示起始位置
  MOV A,R3
  ANL A,#0F0H ;取出高四位二进制数
  SWAP A ;高四位与低四位互换
  PUSH ACC ;压入堆栈
  CLR C ;C=0
  SUBB A,#0AH ;减10
  POP ACC ;弹出堆栈
  JC ASCII0 ;该数小于10,转ASCII0
  ADD A,#07H ;大于10的数加上37H
  ASCII0: ADD A,#30H ;小于10的数加上30H
  MOV B,X
  CALL LCDP2

  MOV A,R3
  ANL A,#0FH ;取出低四位二进制数
  PUSH ACC
  CLR C
  SUBB A,#0AH ;减10
  POP ACC
  JC ASCII1 ;该数小于10,转ASCII1
  ADD A,#07H ;大于10的数加上37H
  ASCII1: ADD A,#30H ;小于10的数加上30H
  INC X
  MOV B,X
  CALL LCDP2
  RET
  DELAY2: MOV R5,#15H
  DELAY: ;延时R5×10MS
  MOV R6,#50
  D1: MOV R7,#100
  DJNZ R7,$
  DJNZ R6,D1
  DJNZ R5,DELAY
  RET
  DELAY1: ;延时5MS
  MOV R6,#25
  D2: MOV R7,#100
  DJNZ R7,$
  DJNZ R6,D2
  RET
  KEYTABLE:
  DB 0EEH,0EDH,0EBH,0E7H,0DEH ;0,1,2,3,4, 顺序码
  DB 0DDH,0DBH,0D7H,0BEH,0BDH ;5,6,7,8,9,
  DB 0BBH,0B7H,07EH,07DH,07BH ;A,B,C,D,E,
  DB 077H,0FFH ;F 0FF为结束码

  DB 0DBH,0EEH,0DEH,0BEH,07EH ;0,1,2,3,4, 顺序码
  DB 0EDH,0DDH,0BDH,07DH,0EBH ;5,6,7,8,9,
  DB 0BBH,07BH,0E7H,0D7H,0B7H ;A,B,C,D,E,
  DB 077H,067H,066H,065H,0FFH ;F,C+F,1+F,8+C
  INIT_TIMER: ;初始化定时器
  MOV TMOD,#01H ;设置定时器0 工作模式为模式1
  MOV IE, #82H ;启用定时器0 中断产生
  MOV TL0,#TLOW
  MOV TH0,#THIGH
  RET
  T0_INT:
  PUSH ACC
  MOV TL0,#TLOW
  MOV TH0,#THIGH
  INC D_TIME
  MOV A,D_TIME ;5ms 计数值加1
  CJNE A,#COUN0,T0_T
  MOV D_TIME,#0
  INC SEC ;秒加1
  MOV A,SEC
  CJNE A,#03H,TO_INT0
  SETB 20H.3
  TO_INT0: CJNE A,#8,T0_T ;是否到8秒?
  MOV SEC,#0 ;秒单元清0
  SETB 20H.0
  T0_T: POP ACC
  RETI
  PASS_READ:
  CALL EEPR
  RET

  MOV COUN1,#06H ;6位密码数值
  MOV R7,#00H
  MOV R1,#PASS_NEW
  P_READ: MOV A,R7
  MOV DPTR,#R_TABLE
  MOVC A,@A+DPTR
  MOV @R1,A
  INC R1
  INC R7
  DJNZ COUN1,P_READ
  RET
  R_TABLE:
  DB 35H,36H,34H,34H,38H,38H
  COMP_ERR:
  MOV DPTR,#COMP_ERR1 ;
  MOV A,#2 ;
  CALL LCD_SHOW
  RET
  COMP_ERR1:
  DB " PASSWORD ERROR ",0
  COMP_OK:
  MOV DPTR,#COMP_OK0 ;
  MOV A,#2 ;
  CALL LCD_SHOW
  RET
  COMP_OK0:
  DB " PASSWORD RIGHT ",0
  RESET_ERR:
  MOV DPTR,#RESET_ERR0 ;
  MOV A,#2 ;
  CALL LCD_SHOW
  RET
  RESET_ERR0:
  DB " RESET ERROR ",0
  RESET_OK:
  MOV DPTR,#RESET_OK0 ;
  MOV A,#2 ;
  CALL LCD_SHOW
  RET
  RESET_OK0:
  DB " RESET RIGHT ",0
  INPUT_ERR:
  MOV DPTR,#INPUT_ERR0 ;
  MOV A,#2 ;
  CALL LCD_SHOW
  RET
  INPUT_ERR0:
  DB " INPUT ERROR ",0
  INPUT_OK:
  MOV DPTR,#INPUT_OK0 ;
  MOV A,#2 ;
  CALL LCD_SHOW
  RET
  INPUT_OK0:
  DB " INPUT RIGHT ",0
  EEPW: PUSH ACC
  PUSH PSW
  CLR PSW.3
  SETB PSW.4
  MOV R1,#PASS_NEW
  MOV R7,#06H ;连续写8个字节
  LCALL START
  MOV A,#0A0H ;送器件地址
  ACALL SUBS
  MOV A,#00H ;送片内字节地址
  ACALL SUBS
  AGAIN1:
  MOV A,@R1
  ACALL SUBS ;调发送单字节子程序
  INC R1
  DJNZ R7,AGAIN1 ;连续写8个字节
  LCALL STOP ;发停止信号
  POP PSW
  POP ACC
  RET
  SUBS:
  MOV R0,#08H ;发送单字节子程序
  LOOP: CLR SCLK24
  RLC A
  MOV SDA,C
  NOP
  SETB SCLK24
  ACALL DELAY24
  DJNZ R0,LOOP ;循环8次送8个bit
  CLR SCLK24
  ACALL DELAY24
  SETB SCLK24
  REP: MOV C,SDA
  JC REP ;判应答到否,未到则等待
  CLR SCLK24
  RET

  DELAY24:
  NOP
  NOP
  RET
  EEPR: PUSH ACC
  PUSH PSW
  CLR PSW.3
  SETB PSW.4
  MOV R7,#06H
  MOV R1,#PASS_NEW
  LCALL START ;发开始信号
  MOV A,#0A0H ;送器件地址
  ACALL SUBS ;调发送单字节子程序
  MOV A,#00H ;送片内字节地址
  ACALL SUBS
  LCALL START ;再发开始信号
  MOV A,#0A1H
  ACALL SUBS
  MORE: ACALL SUBR
  MOV @R1,A
  MOV A,#00H
  INC R1
  DJNZ R7,MORE
  LCALL STOP ;送停止信号
  POP PSW
  POP ACC
  RET

  SUBR: MOV R0,#08H ;接受单字节子程序
  SUBR2: SETB SCLK24
  ACALL DELAY24
  MOV C,SDA
  RLC A
  CLR SCLK24
  ACALL DELAY24
  DJNZ R0,SUBR2
  CJNE R7,#01H,ALOW
  SETB SDA ;若是最后一个字节置SDA=1
  AJMP SETOK
  ALOW:
  CLR SDA ;否则置SDA=0
  SETOK: ACALL DELAY24
  SETB SCLK24
  ACALL DELAY24
  CLR SCLK24
  ACALL DELAY24
  SETB SDA ;应答毕,SDA置1
  RET
  START:
  CLR SDA
  ACALL DELAY24
  SETB SDA
  SETB SCLK24
  ACALL DELAY24
  CLR SDA
  SETB SCLK24
  RET
  STOP:
  CLR SDA
  SETB SCLK24
  ACALL DELAY24
  SETB SDA
  ACALL DELAY24
  RET
  BZ: ;蜂鸣器
  MOV R6,#100
  B1: CALL DEX
  CPL BEEP
  DJNZ R6,B1
  MOV R5,#20
  CALL DELAY
  RET
  DEX: MOV R7,#180
  DE1: NOP
  DJNZ R7,DE1
  RET
  END
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式