ID卡讀卡器源程序
文章出處:http://m.dipdnbxp.cn 作者:謝中業(yè) 人氣: 發(fā)表時間:2011年10月24日
;程序說明:本程序為讀寫器程序。
;下面將本程序所用變量及含義定義如下:
;定義SBUF(N)為串行通訊的緩沖區(qū)。
;定義CBUF(N)為讀卡卡號的緩沖區(qū)。
;
;通訊緩沖區(qū)定義
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
;讀卡緩沖區(qū)定義
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字節(jié)
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狀態(tài)。當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 ;為緩沖區(qū)設置初始值。
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 ;讀一字節(jié)卡數(shù)據(jù)。
READ_CARD:
LCALL RESET ;對MTP-K4進行復位。
LCALL CLEAR ;首先對讀卡空間和卡標志初始化.
SETB EX0
LCALL DH70MS ;等待70MS從INT0接收數(shù)據(jù)
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
;======================================
;得到字節(jié)子程序
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 ;讀一字節(jié)卡數(shù)據(jù)在A中。
MOV R0,JISHU
MOV @R0,A
INC R0
MOV JISHU,R0
POP ACC
; CLR BEEP ;蜂鳴器發(fā)聲
; SETB GREEN_LED ;綠色LED發(fā)光。
; 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
;------------------------
;串口發(fā)送字符程序,所發(fā)字符在A中,并等待發(fā)送完成。
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指令,發(fā)送卡號。并清除指令。
; 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