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

📄 id.txt

📁 本程序RFID卡读卡器的源程序
💻 TXT
字号:
;ID卡读卡器源程序
;程序说明:本程序为读写器程序。
;下面将本程序所用变量及含义定义如下:
;定义SBUF(N)为串行通讯的缓冲区。
;定义CBUF(N)为读卡卡号的缓冲区。

;通讯缓冲区定义
    BEGIN_FLAG      EQU       20H
    END_FLAG        EQU       21H
NUM_ADD        EQU       22H
JISHU             EQU       23H
    CARD_FLAG       EQU       24H
    FIRST_HAND      EQU       25H         ;第一次握手标志,为FF为有握手,为
;00表示无。
SECOND_HAND    EQU      26H         ;第二次握手标志,为FF为有握手,
;为00表示无。
    COMMAND_FLAG  EQU     27H         ;命令标志,表示什么命令。
    S_DATA           EQU     P3.2
    RESET_K4         EQU     P1.7
    RED_LED          EQU     P1.6
    GREEN_LED       EQU     P1.5
    BEEP              EQU     P1.4
SBUF1             EQU     40H
    SBUF2             EQU     41H
    SBUF3             EQU     42H
    SBUF4             EQU     43H
    SBUF5             EQU     44H
    SBUF6             EQU     45H
    SBUF7             EQU     46H
    SBUF8             EQU     47H
    SBUF9             EQU     48H
    SBUF10            EQU     49H
    SBUF11            EQU     4AH
    SBUF12            EQU     4BH
    SBUF13            EQU     4CH
    SBUF14            EQU     4DH
    SBUF15            EQU     4EH
    SBUF16            EQU     4FH

;读卡缓冲区定义
    CBUF1             EQU     50H
    CBUF2             EQU     51H
    CBUF3             EQU     52H
    CBUF4             EQU     53H
       CBUF5  EQU       54H
       CBUF6  EQU       55H
       CBUF7  EQU       56H
       CBUF8  EQU       57H
       CBUF9  EQU       58H
      CBUF10  EQU       59H
      CBUF11  EQU       5AH
      CBUF12  EQU       5BH
      CBUF13  EQU       5CH
      CBUF14  EQU       5DH
      CBUF15  EQU       5EH
      CBUF16  EQU       5FH
;----------------
              ORG       0000H
 LJMP START
              ORG       0003H       ;INT0入口地址
 LJMP INT_0
              ORG       000BH       ;T0入口地址
 LJMP TIME0
              ORG       0013H       ;INT1入口地址
 LJMP START
              ORG       001BH       ;T1入口地址
 LJMP START
              ORG       0023H       ;串行中断S入口地址
 LJMP SERIAL

START
              CLR        BEEP
              LCALL     DH150ms
              SETB       RED_LED
              MOV       P1,#0FFH
              MOV       SP,#05FH    ;设置堆栈为高64字节
 CLR        EA         ;关闭所有中断
              MOV       PCON,#00H   ;电源控制寄存器设初值
              MOV       TCON, #00H  ;定时寄存器设初值
              MOV       TMOD,#21H   ;定时方式寄存器设初值
              MOV       TH1,#0FDH   ;设置波特率9600bps
              MOV       TL1,#0FDH
              MOV       TH0,#0FFH
              MOV       TL0,#0FFH
              MOV       SCON,#0F0H  ;设置串行中断工作在方式2状态。
;当SM2=1时,只接收地址信息,
              MOV       NUM_ADD,#31H
              MOV       IE,#0F3H
              SETB      ES
              SETB      EA
              SETB      ET0
              SETB      ET1
              SETB      TR0
              MOV       IP, #03H
              SETB      SM2
              SETB      BEEP
 CLR GREEN_LED
              MOV       JISHU,#50H  ;为缓冲区设置初始值。
              MOV       CARD_FLAG,#00H          ;无卡标志置0。
              LCALL     DH150MS
              CLR        EX0
              MOV       IE,#00H
              SETB      TR1
              SETB      ET0
; CLR       ET0
              SETB      ES
              SETB      EA
MAIN
 LCALL    DH70MS
; LCALL    READ_CARD
; LCALL    DH70MS
; LCALL    TIME0
              LJMP      MAIN

; JB S_DATA,MAIN                   ;有卡,S_DATA变低。
; AJMP     MAIN
; LCALL   GET_CHAR                ;读一字节卡数据。
READ_CARD
 LCALL   RESET                    ;对MTP-K4进行复位。
 LCALL   CLEAR                    ;首先对读卡空间和卡标志初始化.
              SETB     EX0
              LCALL   DH70MS                   ;等待70MS从INT0接收数据
              CLR      EX0
              MOV     A,50H
              CJNE     A, #02, NO_BEGIN          ;如果接收到02,表示有开始位
              MOV     A,5CH
 CJNE     A, #03, NO_END            ;如果接收到03,表示有结束位
              MOV     CARD_FLAG,#0FFH         ;标志有卡。
              MOV     JISHU, #50H
 LJMP     READ_END

NO_BEGIN
              MOV      CARD_FLAG, #00H
              MOV      JISHU, #50H
; LCALL    CLEAR                   ;首先对读卡空间和卡标志初始化.
 LJMP      READ_END
NO_END
              MOV      CARD_FLAG, #00H
              MOV      JISHU, #50H
; LCALL    CLEAR                   ;首先对读卡空间和卡标志初始化.
 LJMP      READ_END
READ_END
              RET
;--------------------------
CLEAR
              MOV       R1, #5CH
      CLR_1  MOV       A, #0FFH
              MOV       @R1, A
              DEC        R1
              MOV       A, R1
 CJNE       A, #49H, CLR_1
              RET
;======================================
;得到字节子程序
GET_CARD_CHAR
              PUSH      01H         ;R1入栈
              PUSH      02H         ;R2入栈
; JB         S_DATA, $
              LCALL    DH10US
 LCALL    DH10US
              MOV      R2, #08
LOOP
              LCALL    DH104US
              MOV     C, S_DATA
 RRC      A
 DJNZ     R2, LOOP
; LCALL    DH104US
              POP       02H
              POP       01H
              RET
;=====================================
;中断读卡程序
INT_0
              PUSH       ACC
              LCALL     GET_CARD_CHAR            ;读一字节卡数据在A中。
              MOV       R0,JISHU
              MOV       @R0, A
              INC        R0
              MOV       JISHU, R0
              POP        ACC
; CLR       BEEP                      ;蜂鸣器发声
; SETB      GREEN_LED               ;绿色LED发光。
; LCALL     DH150MS
; CLR       GREEN_LED
; SETB      BEEP
; CLR       RESET_K4                  ;对MTP-K4进行复位操作。
; SETB      RESET_K4
RETI
;======================================
;串口得到字符程序,所得字符在A中,并清除串行中断。
COM_GET_CHAR
              MOV       A, SBUF
              CLR        RI
              RET
;------------------------
;串口发送字符程序,所发字符在A中,并等待发送完成。
COM_SEND_CHAR
              MOV       SBUF, A
              JNB       TI, $
              CLR TI
              RET
;-------------------------
COM_CARD
              RET
SOUND_1
              CLR       BEEP
 LCALL    DH70MS
              SETB      BEEP
              LCALL    DH70MS
              RET
;======================================
;串行中断子程序
SERIAL
; SETB      GREEN_LED
 CLR       RI
              PUSH      ACC
              MOV      A, SBUF
 CJNE      A, #00, COMMAND_01          ;指令为与读写器连接
              MOV      A,#00H
              LCALL    COM_SEND_CHAR
              POP       ACC
 RETI
COMMAND_01
              CJNE       A, #01, COMMAND_02          ;指令为读模块版本号。
              MOV       A,#56H
              LCALL     COM_SEND_CHAR
              MOV       A,#31H
              LCALL     COM_SEND_CHAR
              MOV       A,#2EH
 LCALL     COM_SEND_CHAR
              MOV       A,#30H
              LCALL     COM_SEND_CHAR
              MOV       A,#32H
 LCALL     COM_SEND_CHAR
              POP        ACC
 CLR       GREEN_LED
              RETI
COMMAND_02
              CJNE       A, #02H, COMMAND_03
 LCALL     READ_CARD
              MOV       A, CARD_FLAG
              CJNE       A, #0FFH, COMMAND_02_ERR
              MOV       A, 51H
 LCALL     COM_SEND_CHAR
              MOV       A, 52H
 LCALL     COM_SEND_CHAR
              MOV       A, 53H
              LCALL     COM_SEND_CHAR
              MOV       A, 54H
              LCALL     COM_SEND_CHAR
              MOV       A, 55H
              LCALL     COM_SEND_CHAR
              MOV       A, 56H
 LCALL     COM_SEND_CHAR
              MOV       A, 57H
 LCALL     COM_SEND_CHAR
              MOV       A, 58H
              LCALL     COM_SEND_CHAR
              MOV       A, 59H
 LCALL     COM_SEND_CHAR
              MOV       A, 5AH
              LCALL     COM_SEND_CHAR
              MOV       A, 5BH
              LCALL     COM_SEND_CHAR
              POP       ACC
              RETI
COMMAND_02_ERR
              MOV       A, #02H
              LCALL     COM_SEND_CHAR
              POP        ACC
              RETI
COMMAND_03
              CJNE       A, #03H, COMMAND_11
              POP        ACC
              RETI
COMMAND_11
              CJNE       A, #011H, COMMAND_12
              MOV       A, #011H
              LCALL      COM_SEND_CHAR
 LCALL SOUND_1
              POP        ACC
 RETI
COMMAND_12
              CJNE       A, #012H, COMMAND_13
              MOV       A, #012H
              LCALL      COM_SEND_CHAR
 LCALL      SOUND_1
 LCALL      SOUND_1
              POP        ACC
              RETI
COMMAND_13
              CJNE       A, #013H, COMMAND_21
              MOV       A, #013H
              LCALL     COM_SEND_CHAR
              LCALL     SOUND_1
 LCALL     SOUND_1
 LCALL     SOUND_1
              POP        ACC
              RETI
COMMAND_21
              CJNE       A, #0B1H, COMMAND_22
              MOV       A,#0B1H
 LCALL     COM_SEND_CHAR
              SETB      GREEN_LED
 LCALL     DH70MS
              CLR       GREEN_LED
              POP       ACC
              RETI
COMMAND_22
              POP       ACC
 RETI

;SERIAL
; PUSH     ACC
; LCALL    COM_GET_CHAR
; CJNE     A, #23H, NO_FIRST_HAND     ;如果等于23H为第一次握
;手信号,否则不是。
; MOV      A, #45H
; LCALL    COM_SEND_CHAR
; MOV      FIRST_HAND, #0FFH          ;第一次握手标志,成功。
; MOV      COMMAND_FLAG, #00H       ;清除命令标志。
; LJMP      SER_END
;NO_FIRST_HAND
; CJNE      A, #0AAH, NO_READ_ID       ;AA为取ID卡号命令。
; MOV      COMMAND_FLAG, #0AAH
; MOV      A, #67H
; LCALL    COM_SEND_CHAR
; LJMP      SER_END
;NO_READ_ID
; CJNE      A, #89H, NO_SECOND_HAND
; MOV      A, COMMAND_FLAG
;CJNE      A, #0AAH, NEXT_COMMAND     ;如果为AA指令,发送
;卡号。并清除指令。
; LCALL    COM_SEND_ID
;NEXT_COMMAND
; MOV      COMMAND_FLAG, #00H         ;命令出错,清除所有标志。
; MOV      FIRST_HAND, #00H
; MOV      SECOND_HAND, #00H
; LJMP      SER_END
;SER_END
; POP       ACC
; RETI
;=======================================
RESET
              CLR       RESET_K4
; NOP
              SETB      RESET_K4
              RET
;=======================================
DH104US
              MOV       R1, #47
 DJNZ       R1, $
              RET
DH10US
              MOV       R1, #04
              DJNZ R1, $
              RET
;------------------
DH70MS
              MOV       R1, #09FH
        D10   MOV       R2, #0FFH
  DJNZ       R2,$
              DJNZ       R1,D10
              RET
;------------------
DH150MS
              MOV       R1, #0FFH
        DH2  MOV       R2, #0FFH
              DJNZ       R2, $
 DJNZ R1,   DH2
              RET
;-----------------------
;未用
TIME0
              CPL       RED_LED
; PUSH      ACC
; MOV      A, CARD_FLAG
; CJNE      A, #00H, LED_L
; CLR       GREEN_LED
; setb        beep
; POP       ACC
; RETI
;LED_L SETB GREEN_LED
; clr         beep
; POP       ACC
 RETI
              END

⌨️ 快捷键说明

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