新闻  |   论坛  |   博客  |   在线研讨会
电子密码锁源程序(ASM)(1)
szyth | 2008-08-15 10:40:53    阅读:1568   发布文章

本系统由单片机系统、矩阵键盘、LED显示和报警系统组成。系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。除上述基本的密码锁功能外,还具有调电存储、声光提示等功能,依据实际的情况还可以添加遥控功能。本系统成本低廉,功能实用

关键词:AT89S51;AT24C02;电子密码锁;矩阵键盘

        ;********************************************
        ;*********        电子密码锁        *********
        ;********************************************
        ;*********        2005/12/24        *********
        ;********************************************
        ;显示缓冲区
        ;LED1    EQU    6FH
        BUFF    EQU    6EH
        TIMERS1 EQU    6DH     ;输入回车的次数
        TIMERS2 EQU    6CH     ;报警的次数
        TIMERS  EQU    6BH     ;输入数字的位数
        ;LED6  EQU    6AH
        ;密码缓冲区
        PS1   EQU    69H
        PS2   EQU    68H
        PS3   EQU    67H
        PS4   EQU    66H
        PS5   EQU    65H
        PS6   EQU    64H
        ;AT24C02读取缓冲区
        AT1   EQU    63H
        AT2   EQU    62H
        AT3   EQU    61H
        AT4   EQU    60H
        AT5   EQU    5FH
        AT6   EQU    5EH
        ;按键标志位
        F_1   BIT   20H
        F_2   BIT   21H
        F_3   BIT   22H
        F_4   BIT   23H
        BUF_FULL BIT 24H    ;密码已经够六位的标志位,为1表示满
        CH_STATE BIT 25H    ;系统更改的状态标志位,为1表示busy
        FLAG1 BIT    26H    ;功能键标志位,为1表示功能按键。
        F_F1  BIT    27H
        F_F2  BIT    28H
        PSW_F BIT    29H    ;密码是否正确的标志位
        ;口资源定义
        SPK   BIT    P2.1
        JDQ   BIT    P2.3
        SDA   BIT    P2.4   ;定义串口数据端
        SCL   BIT    P2.5
        ;发光二极管灯
        L1    BIT    P1.0
        L2    BIT    P1.1
        L3    BIT    P1.2
        ;
        ORG   0000H
        AJMP  MAIN
        ORG   000BH
        ;AJMP  TIMER0
        ORG   001BH
        ;AJMP  TIMER1
        ORG   0030H
   MAIN:MOV   SP,    #70H
        MOV   TMOD,  #11H
        MOV   TH0,   #3CH
        MOV   TL0,   #0B0H
        MOV   TH1,   #3CH
        MOV   TL1,   #0B0H
        CLR   F_1             ;清除标志位
        CLR   F_2
        CLR   F_3
        CLR   F_4
        CLR   BUF_FULL
        CLR   CH_STATE
        CLR   FLAG1
        CLR   F_F1
        CLR   F_F2
        CLR   PSW_F
        MOV   BUFF,#00H        ;调用
        LCALL INITPS           ;初始化环境
        LCALL INITAT
        LCALL  XSA            ;调用默认显示
        MOV    TIMERS1,#00H
        NOP
        MOV   PS1,  #11H     ;初始化密码830620
        MOV   PS2,  #0AH
        MOV   PS3,  #02H
        MOV   PS4,  #13H
        MOV   PS5,  #0BH
        MOV   PS6,  #02H
  START:NOP                  ;程序开始
        LCALL CH_KEY         ;检查键盘
        AJMP  START          ;返回

 CH_KEY:LCALL KS             ;检查有没有按键按下
        JNZ   LK1
        AJMP  CH_KEY
    LK1:
        LCALL T12MS
        ACALL KS
        JNZ   LK2
        RET

    LK2:
        NOP
        LCALL SBIE            ;按键识别子程序
        MOV   BUFF,  A        ;送缓冲区以识别是数字键还是功能键?
        LCALL CH_KF           ;判断按键功能。
        JB    FLAG1  ,KEY_FUN ;标志为1,则为功能键
;***********数字按键输入并且存放到缓冲区内等待比较***********
KEY_DIG:NOP                   ;设一标志,辨别输入是否满
        ;SETB  TR0
        INC   TIMERS          ;输入数字的位数
        MOV   A,    TIMERS
        CLR   C
        SUBB  A,    #01H
        JNZ   PS_2
        MOV   PS1,  BUFF         ;依照顺序存放密码
        AJMP  NEXT
   PS_2:MOV   A,   TIMERS
        SUBB  A,    #02H
        CLR   C
        JNZ   PS_3
        MOV   PS2,   BUFF
        AJMP  NEXT
   PS_3:MOV   A,   TIMERS
        CLR   C
        SUBB  A,    #03H
        JNZ   PS_4
        MOV   PS3,   BUFF
        AJMP  NEXT
   PS_4:MOV   A,    TIMERS
        CLR   C
        SUBB  A,    #04
        JNZ   PS_5
        MOV   PS4,  BUFF
        AJMP  NEXT
   PS_5:MOV   A,    TIMERS
        CLR   C
        SUBB  A,    #05
        JNZ   PS_6
        MOV   PS5,  BUFF
        AJMP  NEXT
   PS_6:MOV   A,    TIMERS
        CLR   C
        SUBB  A,    #06H
        JNZ   CH_KEY
        MOV   PS6,  BUFF
   NEXT:LCALL XSC
        MOV   R7,   TIMERS    ;比较输入的次数。
        CJNE  R7,   #06H  ,FULL
   FULL:JC    NEXT9
        SETB  BUF_FULL
        MOV   TIMERS,#06H
        CLR   L3
        NOP
        CLR   P2.1
        LCALL T100MSD
        SETB  P2.1
        NOP
        AJMP  CH_KEY
  NEXT9:CLR   P2.1            ;密码输入一位,鸣叫一声。
        CLR   L3
        LCALL T100MSD         ;延时100ms
        SETB  L3
        SETB  P2.1
        AJMP  CH_KEY
;*****************功能按键比较并且跳转*************
KEY_FUN:
        CLR   FLAG1
        CLR   C
        MOV   A,   BUFF
        SUBB  A,   #03H     ;按键CL跳转
        JNZ   EN_C
        AJMP  CL
   EN_C:CLR   C
        MOV   A,   BUFF     ;按键EN跳转
        SUBB  A,   #00H
        JNZ   F1_C
        AJMP  EN
   F1_C:CLR   C
        MOV   A,   BUFF
        SUBB  A,   #1BH
        JNZ   F2_C
        AJMP  FU1
   F2_C:CLR   C
        MOV   A,   BUFF
        SUBB  A,   #1AH
        JNZ   F3_C
        AJMP  FU2
   F3_C:CLR   C
        MOV   A,   BUFF
        SUBB  A,   #19H
        JNZ   F4_C
        AJMP  FU3
   F4_C:CLR   C
        MOV   A,   BUFF
        SUBB  A,   #18H
        JZ    FU4
  EXIT8:NOP
        LJMP  CH_KEY
;***************开门子程序 ********************************
     CL:NOP
        SETB  L3
        MOV   BUFF, #00H             ;消密码缓冲
        MOV   TIMERS,#00H
        LCALL INITPS              ;消除AT缓冲,加调电存储后一定要加上
        LCALL XSC
        LCALL BP
        LCALL BP
        LCALL T100MSD
        LCALL BP
        CLR   FLAG1
        AJMP  CH_KEY

    FU4:NOP
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL T100MSD
        LCALL BP
        CLR   FLAG1
        AJMP  CH_KEY

    FU3:NOP
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL KILLXS ;关闭显示
        CLR   FLAG1
        AJMP  CH_KEY

    FU1:NOP
        LCALL XSC
        JB    F_F1,   NEXT_F1
        CLR   L1
        LCALL BP
        SETB  F_F1
        AJMP  CH_KEY
NEXT_F1:SETB  L1
        LCALL BP
        CLR   F_F1
        ;LCALL CH_STATE            ;查看现在的状态以防误按
        ;SETB  TR1                ;报警限制暂时不开
        ;INC   F_F1
        CLR    FLAG1
        AJMP  CH_KEY

    FU2:NOP
        JB    F_F2,   NEXT_F2
        CLR   L2
        LCALL BP
        SETB  F_F2
        AJMP  CH_KEY
NEXT_F2:SETB  L2
        LCALL BP
        CLR   F_F2
        CLR   FLAG1
        AJMP  CH_KEY
;***************按键的功能描述*************************
     EN:NOP
        JB    BUF_FULL,   GOON
        AJMP  EXIT
   GOON:CLR   BUF_FULL
        JB    F_F2, AT_WRON             ;F2按键标志,若为1,则调用修改密码子程序。
        LCALL AT_RADE
        LCALL C_PSW                  ;比较密码子程序
        JB    PSW_F,OPEN             ;密码比较正确,则调用开锁子程序
        LCALL XSD
        INC   TIMERS2
        MOV   R7,TIMERS2            ;密码错误,调入输入密码输入次数,准备锁定键盘
        CJNE  R7,#03H,D0
     D0:JC    NEXT1                 ;错误次数小3次
        LCALL XSE               ;锁定5分钟
        LCALL WARN2S
        LCALL LOCK_1M
  NEXT1:LCALL WARN2S            ;报警2分钟
        LCALL XSA
   EXIT:LCALL INITPS
        MOV   BUFF,   #00H
        CLR   FLAG1
        MOV   TIMERS, #00H
        AJMP  CH_KEY                 ;跳出
       
AT_WRON:LCALL AT_WR
        LCALL XSF
        LCALL BP
        LCALL T100MSD
        LCALL BP
        LCALL T500MSD
        LCALL KILLXS
        LCALL T500MSD
        LCALL XSF
        LCALL T500MSD
        LCALL KILLXS
        LCALL T500MSD
        LCALL XSF
        LCALL T500MSD
        NOP
        NOP
        LCALL XSA
        AJMP  EXIT

     OPEN:MOV  A,     TIMERS1
         CJNE A,     #09H,CLT1
    CLT1:JC   GOON1
         MOV  TIMERS1,#00H
   GOON1:INC  TIMERS1                ;输入回车的次数
         MOV  TIMERS2,#00H
         SETB  L3
         CLR   PSW_F
         LCALL XSB
         CLR  JDQ             ;开门
         LCALL BP
         LCALL BP
         LCALL BP
         LCALL BP
         LCALL SEC
         LCALL SEC
         LCALL SEC
         LCALL SEC
         LCALL SEC
         LCALL SEC
         LCALL SEC
         LCALL SEC
         SETB  JDQ
         LCALL XSA
         NOP
         AJMP  EXIT


;**************各类子程序********************************
;****  注意清楚缓冲区时AT1...AT6不应在初始化中执行,以 ***
;****  防两缓冲区都为0,相同开锁                       ***
;********************************************************

CLR_BUF:MOV   R7,   #06H
        MOV   R0,  #6FH
  LOOP1:MOV   A,   #00H
        MOV   @R0, A
        DEC   R0
        DJNZ  R7,LOOP1
        RET
;*************初始化显示缓冲区以及其他缓冲区**************
 INITPS:PUSH  ACC
        PUSH  PSW
        MOV   R7,  #06H
        MOV   R1,  #PS1
        MOV   A,   #00H
INIT_PS:MOV   @R1, A
        DEC   R1
        DJNZ  R7,  INIT_PS
        POP   PSW
        POP   ACC
        NOP
        RET

 INITAT:PUSH  ACC
        PUSH  PSW
        MOV   R7,#06H
        MOV   R1,#AT1
        MOV   A, #00H
INIT_AT:MOV   @R1, A
        DEC   R1
        DJNZ  R7,  INIT_AT
        MOV   TIMERS,#00H     ;密码输入的次数清零。
        POP   PSW
        POP   ACC
        RET

;*************  按键识别子程序  ***************************
   SBIE:MOV   R2,   #0EFH      ;识别按键子程序,数据送A保存,课本P146页。
        MOV   R4,   #00H
    LK4:MOV   A,    R2
        MOV   P0,   A
        NOP
        MOV   A,    P0
        JB    ACC.0,LONE
        MOV   A,    #00H
        AJMP  LKP
   LONE:JB    ACC.1,LTWO
        MOV   A,    #08H
        AJMP  LKP
   LTWO:JB    ACC.2,LTHR
        MOV   A,   #10H
        AJMP  LKP
   LTHR:JB    ACC.3,NEXTT     ;判断下一列
        MOV   A,   #18H
    LKP:ADD   A,   R4
        PUSH  ACC
    LK3:ACALL KS
        JNZ   LK3
        POP   ACC
        RET
  NEXTT:INC   R4
        MOV   A,   R2
        JNB   ACC.7,KND
        RL    A
        MOV   R2,  A
        AJMP  LK4
    KND:AJMP  CH_KEY

     KS:MOV   P0,    #0FH
        NOP
        MOV   A,     P0
        CPL   A
        ANL   A,     #0FH
        NOP
        RET

  CH_KF:CLR   C
        MOV   A,   BUFF       ;判断是数字按键还是功能按键,为1表示功能键
        CJNE  A,   #17H,  KY
     KY:JC    SET_CH         ;假若是数字按键则标志置为0
        SETB  FLAG1          ;假若是功能按键则标志置为1
        AJMP  CHKE_END
 SET_CH:CLR   C
        MOV   A,   BUFF
        SUBB  A,   #00H
        JNZ   EN_CH
        SETB  FLAG1
        AJMP  CH_END
  EN_CH:MOV   A,   BUFF
        SUBB  A,   #03H
        JNZ   DIG
        SETB  FLAG1
        AJMP  CH_END
    DIG:CLR   FLAG1
 CH_END:NOP
CHKE_END:RET

   T12MS:MOV     R7,   #18H
     TM1:MOV     R6,   #0FFH
    TM66:DJNZ    R6,   TM66
         DJNZ    R7,   TM1
         RET

;****************检验密码正误******************************
   C_PSW:PUSH  PSW
         PUSH  ACC
         MOV  R2,#06H
         MOV  R0,#PS1
         MOV  R1,#AT1
     C_P:CLR  C
         MOV  A,@R0
         SUBB A,@R1
         JNZ  RETURN
         DEC  R0
         DEC  R1
         DJNZ R2,C_P
         NOP
         SETB PSW_F
         AJMP EXIT7
  RETURN:CLR  PSW_F
   EXIT7:NOP
         POP  ACC
         POP  PSW
         RET
;×××××××××××××××××锁定,鸣笛子程序××××××××××××
 LOCK_1M:MOV  R4,#3CH                   ;锁定1分钟
 M1_LOOP:LCALL SEC
         DJNZ  R4,M1_LOOP
         NOP
         RET

    WARN2S:PUSH  PSW
          PUSH  ACC
          MOV   R5, #14H      ;调用20次BP,报警2s
     WARN:LCALL BP
          DJNZ  R5,WARN
          NOP
          POP   ACC
          POP   PSW
          NOP
          RET
      BP:CLR   SPK            ;鸣笛子程序
         LCALL T100MSD
         SETB  SPK
         NOP
         RET

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客