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

📄 u2270c.asm

📁 EM卡解码程序
💻 ASM
字号:
;*****************************************************************
;本程序用来读取慢码,并通过串口将ID号传入上位机
;工作环境:U2270B.pcb
;*****************************************************************
;define pin for AT89C2051
;-----------------------------------------------------------------
D0          bit   p1.1
CFE         bit   p1.2
beep        bit   p1.4
LED1        BIT   P1.6    ;双色灯(红)高电平亮
LED2        BIT   P1.5    ;双色灯(绿)高电平亮
;-----------------------------------------------------------------
quhao_h     data  50h
quhao_m     data  51h   ;QU HAO-M
quhao_l     data  52h   ;QU HAO-L
card_idh    data  53h   ;card id high bits
card_idl    data  54h   ;card id low bits
;-----------------------------------------------------------------
FLAG1       DATA  21H
FLAG2       DATA  22H
P_0           BIT    FLAG1.0
p_1           bit    flag1.1
p_2           bit    flag1.2
p_3           bit    flag1.3
parity_flag   bit    flag1.4
c_parity_flag bit    flag1.5
parity_ok     bit    flag1.6

CHECK         BIT    FLAG2.0
CARDRD0       BIT    FLAG2.1
ST_RD0        BIT    FLAG2.2
IN0           BIT    FLAG2.3
OKK           BIT    FLAG2.4
;------------------------------------------------------------------
       ORG   0000H
       LJMP  START

       ORG   000BH
       LJMP  T0_INTR

       ORG   0023H
       RETI
       ORG   0030H
START:
       MOV  SP,#76H
       MOV  TMOD,#21H           ;单片机初始化
       CLR   EA
       setb  PS
       mov   psw,#00h
       MOV   SCON,#50H          ;IN MODEL1
       MOV   PCON,#00H
       MOV   TH1,#0E8H          ;9600BITS/S
       MOV   TL1,#0E8H
       setb  TR1
       CLR   ET0
       CLR   TR0
       CLR   ST_RD0
       CLR   CHECK
       CLR   CARDRD0
       CLR   PARITY_FLAG
       setb  beep
       setb  led1
       lcall delay_100ms
       clr   beep
       clr   led1
       lcall delay_100ms
       lcall delay_100ms
       setb  beep
       setb  led2
       lcall delay_100ms
       clr   beep
       clr   led2
       lcall delay_100ms
       setb  led1
       SETB  CFE
       clr   p1.0
       setb  p1.1
       setb  p1.3
       setb  ea
       setb  es
;****************************检测起始9个"1"***********************
MAIN:   CLR     TR0
        MOV     TH0,#00H
        MOV     TL0,#00H             ;记时器初始化
        mov     r5,#08h
MAINL:
        JNB     P1.1,MAINL
        JNB     P1.1,MAINL
        JNB     P1.1,MAINL
        JNB     P1.1,MAINL
        lcall   delay_400us
        JNB     P1.1,MAINL
        JNB     P1.1,MAINL
        MOV     R1,#01H
                                    ;循环等待稳定低电平
MAIN0:  MOV     A,#00H
        MOV     C,P1.1
        RLC     A
        MOV     R7,A
        XRL     A,R1
        JNZ     MAINM1              ;跳变检测,等待上升沿
        AJMP    MAIN0
MAINM1: MOV     TH0,#00H
        MOV     TL0,#00H
        SETB    TR0                 ;开始记时,256us
MAINM:  MOV     B,R7
        MOV     R1,B                ;R1=01H
MAIN1:
        MOV     A,#00H
        MOV     C,P1.1
        RLC     A
        MOV     R7,A
        XRL     A,R1
        JNZ     MAIN2               ;跳变检测,等待下降沿
        AJMP    MAIN1
MAIN2:  MOV     B,R7
        MOV     R1,B                ;R1=00H
        CLR     TR0
        mov     21h,TH0
        mov     22h,TL0
        MOV     TH0,#00H
        MOV     TL0,#00H
        SETB    TR0
                                    ;180uS(b4)<21h,22h<400uS(190)半个周期
        mov     a,21h
        cjne    a,#00h,comp_0
        mov     a,22h
        clr     c
        subb    a,#0a0h
        jnc     right
        ajmp    error
comp_0:
        cjne    a,#01h,error
        mov     a,22h
        clr     c
        subb    a,#90h
        jc      right
error:
        ljmp    main
RIGHT:                              ;从新开始记时
MAIN5:  MOV     A,#00H
        MOV     C,P1.1
        RLC     A
        MOV     R7,A
        XRL     A,R1
        JNZ     MAIN6               ;跳变检测,检查低电平宽度
        AJMP    MAIN5
MAIN6:  MOV     B,R7
        MOV     R1,B
        CLR     TR0
        mov     21h,th0
        mov     22h,TL0
        MOV     TH0,#00H
        MOV     TL0,#00H
        SETB    TR0
                                   ;180uS(b4h)<21h,22h<400uS(190)半个周期
        mov     a,21h
        cjne    a,#00h,comp_1
        mov     a,22h
        clr     c
        subb    a,#0a0h
        jnc     right3
        ajmp    error1
comp_1:
        cjne    a,#01h,error1
        mov     a,22h
        clr     c
        subb    a,#90h
        jc      right3
error1:
        ljmp    main
right3: djnz    r5,right4
        clr     tr0
        ajmp    loop
right4: ljmp    mainM
;**************************************************************************
;ID卡数据检测程序
;**************************************************************************
LOOP:
      MOV   R3,#11D
      MOV   R0,#40H
READ1:
      MOV   R5,#05H
READ3:
      LCALL DELAY_300US
      JB    P1.1,D0_0
      clr   C
      JNB   P1.1,$
      AJMP  READ2
D0_0: setb  C
      JB    P1.1,$
READ2:
      MOV   A,@R0
      RLC   A
      MOV   @R0,A
      DJNZ  R5,READ3
      CJNE  R3,#01H,ROW1
      AJMP  READ4
ROW1:                                   ;行校验
      LCALL row_parity
      JB    parity_FLAG,read4
      LJMP  MAIN
READ4:INC   R0
      DJNZ  R3,READ1
;----------------------------------------------------------------------
      dec   r0
      mov   a,@r0
      rrc   a
      anl   a,#0fh
      mov   @r0,a
                                                                       
      mov     r0,#40h                   ;进行列校验
      mov     r1,#30h
      mov     r2,#11d
column1:
      mov     a,@r0
      mov     @r1,a
      inc     r0
      inc     r1
      djnz    r2,column1
      lcall   Column_parity
      jb      c_parity_flag,ok_2
      ljmp    main
;**********************************************************************
;ID卡的卡号整理
;**********************************************************************
ok_2:
        MOV     R0,#40H
        MOV     R1,#50H
        MOV     R2,#05H
LOOP3:
        MOV     A,@R0
        SWAP    A
        INC     R0
        XCHD    A,@R0
        MOV     @R1,A
        INC     R0
        INC     R1
        DJNZ    R2,LOOP3
;*********************************************************************
;将卡号转换为ASCII码,并上传给上位机
;*********************************************************************
        lcall hex_bcd
        lcall send_ascii
;        LCALL SEND_CARD
        setb  BEEP
        clr   led1
        setb  led2
        LCALL DELAY_200MS
        clr   BEEP
        clr   led2
        setb  led1
;********************************************************************
;检测ID卡是否取走
;********************************************************************
loop1:
        JNB     P1.1,LOOP1
        LCALL   DELAY_100
        JNB     P1.1,LOOP1
        LCALL   DELAY_100
        JNB     P1.1,LOOP1
        LCALL   DELAY_100
        JNB     P1.1,LOOP1
        LCALL   DELAY_100
        JNB     P1.1,LOOP1
        LCALL   DELAY_100
        JNB     P1.1,LOOP1
        LCALL   DELAY_100
        JNB     P1.1,LOOP1
        LJMP    MAIN
;*********************************************************************
;以十进制的方式上传给上位机
;*********************************************************************
Send_CARD:
      clr   ea
      clr   es
      mov   r0,#50h     ;61h
      mov   r1,#05D
loop8:
      mov   a,@r0
      lcall byte_send
      inc   r0
      djnz  r1,loop8
      setb  ea
      setb  es
      ret
;*********************************************************************
;以ASCII码的方式上传给上位机
;*********************************************************************
send_ASCII:
      clr   ea
      clr   es
      mov   r0,#61h
      mov   r1,#05d
s_a_1:
      mov   a,@r0
      swap  a
      lcall hex_asc
      lcall byte_send

      mov   a,@r0
      lcall hex_asc
      lcall byte_send
      inc   r0
      djnz  r1,s_a_1

      mov   a,#0dh
      lcall byte_send
      mov   a,#0ah
      lcall byte_send
      setb  ea
      setb  es
      ret
;*********************************************************************
BYTE_SEND:
        CLR     TB8
        MOV     SBUF,A
        JNB     TI,$
        CLR     TI
        RET
;---------------------------------------------------------------------
ASC_HEX:
        CLR     C
        SUBB    A,#30H
        PUSH    ACC
        SUBB    A,#0AH
        JC      A_H_1

        POP     ACC
        SUBB    A,#07H
        ANL     A,#0FH
        RET

A_H_1:  POP     ACC
        ANL     A,#0FH
        RET
;---------------------------------------------------------------------
HEX_ASC:
        ANL     A,#0FH
        PUSH    ACC
        ADD     A,#0F6H
        POP     ACC
        JNC     H_A_1
        ADD     A,#07H
H_A_1:  ADD     A,#30H
        RET
;*********************************************************************
;行校验
;*********************************************************************
row_parity:
        mov     a,@r0
        jb      acc.0,row_1
        clr     p_2           ; PS0=0
        AJMP    ROW_2
ROW_1:
        SETB    P_2           ; PS0=1 ,A中“1”的个数为奇数
ROW_2:
        rrc     a
        anl     a,#0fh
        MOV     @r0,A
        jb      p,ROW_3
        JNB     P_2,OK
        LJMP    ERR
ROW_3:
        JB      P_2,OK
ERR:    clr     parity_flag
        ret
ok:     setb    parity_flag
        ret
;******************************************************************************
;列校验
;******************************************************************************
column_parity:
        mov     r6,#04h       ;4 column
c_p_0:
        clr     c
        mov     r2,#08h
        mov     r3,#02h
        mov     r0,#30h
        mov     r1,#23h          ;暂存
c_p_1:
        mov     a,@r0
        rrc     a
        mov     @r0,a
        mov     a,@r1
        rlc     a
        mov     @r1,a
        inc     r0
        djnz    r2,c_p_1
        inc     r1
c_p_2:
        mov     a,@r0
        rrc     a
        mov     @r0,a
        mov     a,@r1
        rlc     a
        mov     @r1,a
        inc     r0
        djnz    r3,c_p_2
c_p_3:                           ;进行校验
        mov     a,@r1
        anl     a,#03h
        jb      p,c_p_4
        clr     p_1
        ajmp    c_p_5
c_p_4:  setb    p_1
c_p_5:  dec     r1
        mov     a,@r1
        jb      p,c_p_6
        jb      p_1,c_p_7
        clr     p_3
        ajmp    c_p_9
c_p_6:
        jb      p_1,c_p_8
c_p_7:  setb    p_3
        ajmp    c_p_9
c_p_8:  clr     p_3
c_p_9:  mov     a,@r0
        rrc     a
        mov     @r0,a
        jnc     c_p_10
        jb      p_3,c_ok
        ajmp    c_err
c_p_10:
        jb      p_3,c_err
c_ok:
        djnz    r6,c_p_0
        setb    c_parity_flag
        ret
c_err:
        clr     c_parity_flag
        ret
;******************************************************************************
;添加功能:把卡号转换为十进制输出(十进制数从高到低依次存在61H,62H,63H,64H,65h)
;******************************************************************************
HEX_BCD:
        mov      r0,#65h
        mov      r7,#05h
        clr      a
loop5:
        mov      @r0,a
        dec      r0
        djnz     r7,loop5

        mov      r7,#32D
loop4:  mov      r1,#CARD_IDL                ;card_idl
        mov      r6,#04h
        clr      c
loop2:  mov      a,@r1
        rlc      a
        mov      @r1,a
        dec      r1
        djnz     r6,loop2

        mov      r5,#05h
        mov      r0,#65h
loop6:
        mov      a,@r0
        addc     a,@r0
        da       a
        mov      @r0,a
        dec      r0
        djnz     r5,loop6
        djnz     r7,loop4
        ret
;--------------------------------------------------------------
T0_INTR:
        SETB    OK
        RETI
delay_180us:
           mov     r7,#50d
d_180:     nop
           nop
           djnz    r7,d_180
           ret
DELAY_300US:
           MOV     R7,#85D
D_300:     NOP
           NOP
           DJNZ    R7,D_300
           RET
delay_400us:
           mov     r7,#95d
d_400:     nop
           nop
           djnz    r7,d_400
           ret
;---------------------------------------------------------------------
DELAY_1MS:
           MOV     R5,#230D
D_1_1:     NOP
           NOP
           DJNZ    R5,D_1_1
           RET
;---------------------------------------------------------------------
DELAY_100MS:
           MOV     R6,#100D
D_1_3:     LCALL   DELAY_1MS
           DJNZ    R6,D_1_3
           RET
delay_200ms:
           mov     r6,#200d
d_200:     lcall   delay_1ms
           djnz    r6,d_200
           ret

DELAY_100:
        MOV R5,#25D
D_20:
        NOP
        NOP
        DJNZ R5,D_20
        RET
;---------------------------------------------------------------------
DELAY_1S:
           MOV     R4,#10D
D_1_4:     LCALL   DELAY_100MS
           DJNZ    R4,D_1_4
           RET
delay:
          MOV   TH0,#0FEH
          MOV   TL0,#0EEH
          SETB  ET0
          SETB  TR0
          JB    OKK,$
          CLR   OK
          CLR   ET0
          CLR   TR0
          RET

            END

⌨️ 快捷键说明

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