ID卡读卡器源程序
文章出处:http://www.nexussmartsolutions.com 作者:谢中业 人气: 发表时间:2011年10月24日
;程序说明:本程序为读写器程序。
;下面将本程序所用变量及含义定义如下:
;定义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