设为首页 | 成都一卡通
当前位置: 首页 > 一 卡 通 > 其他一卡通 >
其他一卡通
关于非接触式IC智能(射频)卡及其读写设备内核技术的研究与应用开
发布时间:2013-04-26 来源:未知
一). 对MCM200(SB201)操作指令的程序设计和开发
对MCM指令的说明:
MCU对MCM的控制是以MCU发出MCM的指令来达到的。MCU对MCM的控制事实上也就是对 Mifare 1 非接触式IC射频卡的控制。
MCM的指令主要有这样一些:Request std, Request all,  Anticollision, Select, Load_key, Authentication(Auth_1a,Auth_1b), Read, Write, Increment, Decrement, Restore, Transfer, Halt 等等。其中比较重要的是前8条指令,以及Halt 停机指令等。因为它们可以完成MCU对Mifare 1 非接触式IC射频卡的很多应用场合的控制。例如 门禁控制系统(Door Access System),高速公路不停车收费系统,停车场收费管理系统,公交/地铁非接触式IC智能射频卡的“刷卡”读写器(收费管理系统),机关/企业内部考勤管理系统,医疗保险管理系统,出租车收费管理系统,银行服务“一卡通”等等。
MCU对MCM的某一指令操作不是简单的一条指令所能完成的,必须有一个程序的序列来完成,其中有对MCM硬件内核寄存器的设置以及汇编语言软件上的判断和设置。例如对卡片进行读(READ)操作,则程序员必须对MCM内部的BCNTR寄存器,BCNTS寄存器,TOC寄存器,STACON寄存器等进行设置,同时还必须对地址进行设置,对每一个状态进行判别等等,对还不错终读得的数据还必须进行校验等等。就连一条还不错简单的停机(Halt)指令也必须首先对MCM内部的诸多寄存器进行设置,等等。不同的指令将设置不同的MCM内部寄存器以及应有不同的汇编语言程序序列。
1.对MCM200(SB201)“Request std”和“ Request all”指令的汇编语言应用程序的设计
功能:调用该汇编语言子程序,将执行MCM “Request std”或“ Request all”指令操作,读取Mifare 1 非接触式IC射频卡的TAGTYPE字节,建立与卡片的较好的步必不可少的通信联系。 程序说明:
1.在以下的汇编语言程序中,如果要调用该MCM指令操作,则应首先设置MCU的R2的值: R2=”00H”  执行Request std操作;R2=”01H”  执行Request all操作;
在该指令程序中用到了一些其他的子程序分别为:D500US: 为500us的延时子程序;H_SEND_TO_BUF01:
DEMO电路中,将A寄存器中的数据送显示电路中的高四位中的第0,1位,以准备显示,地址为34H,35H;H_SEND_TO_BUF23:
DEMO电路中,将A寄存器中的数据送显示电路中的高四位中的第2,3位,以准备显示,地址为32H,33H;SEND_TO_BUF01:
DEMO电路中,将A寄存器中的数据送显示电路中的低四位中的第0,1位,以准备显示,地址为39H,3AH;SEND_TO_BUF23:
DEMO电路中,将A寄存器中的数据送显示电路中的低四位中的第2,3位,以准备显示,地址为37H,38H;DISPLAY:
DEMO电路中,显示8位数据中的低4位数据值。即将存储在37H至3AH显示内存中的低四位数据显示在LED上。H_DISPLAY:
DEMO电路中,显示8位数据中的高4位数据值。即将存储在31H至34H显示内存中的高四位数据显示在LED上。2.在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,这些可能是用于主控程序或是调试而用。特加以说明。
程序清单如下:;======================== MCM REQUEST OPERATION ===================request:REPEAT_RQT:_1_STACON:




 ;设置MCM中的STACON寄存器为 : 0CH

MOV A,#0CH


 ;设置A寄存器 = 0CH

MOV R0,#01H


;STACON 寄存器地址为01H

MOVX @R0,A


 ;将A寄存器内容送入STACON寄存器中_2_BAUDRATE: ;设置MCM中的BAUDRATE寄存器为:0EH

MOV A,#0EH

MOV R0,#05H

MOVX @R0,A_3_ENABLE:




  ;设置MCM中的ENABLE寄存器为:0C0H

MOV A,#0C0H

MOV R0,#02H

MOVX @R0,A_4_MODE:  ;设置MCM中的MODE寄存器为:0C6H

MOV A,#0D6H ;(如果采用SB201,则MODE寄存器应为:0D6H)

MOV R0,#07H

MOVX @R0,A_5_STACON_AGAIN:

MOV A,#0CH

MOV R0,#01H

MOVX @R0,A_6_RCODE:

MOV A,#02H

MOV R0,#0EH

MOVX @R0,A_7_BCNTS:

MOV A,#07H

MOV R0,#03H

MOVX @R0,A_8_BCNTR:

MOV A,#10H

MOV R0,#04H

MOVX @R0,A;----------------------------------------------------------------

JUDG_RQT_STD_OR_ALL:

 ;根据R2值, 判断是执行Request std操作

MOV A,R2



 ;还是Request all操作

XRL A,#01H

JNZ RQT_STD;----------------------------------------------------------------

RQT_ALL:

MOV A,#52H

AJMP _11_RQT_MCMRQT_STD:

MOV A,#26H_11_RQT_MCM:

MOV R0,#00H

MOVX @R0,A_12_TOC:

MOV A, #0AH

MOV R0,#06H

MOVX @R0,A


 ;TOC = 0AH;----------------------------------------------------------------

RD_STACON:

 MOV R0,#01H

MOVX A,@R0


 ;READ STACON();================================================================JUDG_DV_BIT:

JNB ACC.7,RD_STACON
; RD_STACON;================================================================

mov r7,a



;protect A = stacon();================================================================

MOV A, #00H

MOV R0,#06H

MOVX @R0,A


 ;TOC=00H;================================================================

mov a,r7



;return stacon() value to A;=================


 ;for BE and TE error-flag

ACALL H_SEND_TO_BUF23  ;DISPLAY R7XX ---> R7 = STACON();================================================================_13_JUDG_ERR:

JB ACC.6,TE_ERR

; TE_ERR

JB ACC.3,BE_ERR

; BE_ERR;================================================================

MOV R0,#00H


;READ_TAGTYPE_0

MOVX A,@R0

MOV 45H,A

ACALL SEND_TO_BUF01
;SEND TAGTYPE 0 TO DISP_BUF_LOW;----------------------------------------------------------------



mov r0,#00h

MOVX A,@R0


 ;READ_TAGTYPE_1

MOV 46H,A

ACALL SEND_TO_BUF23
;SEND TAGETYPE 1 TO DISP_BUF_HIGH;----------------------------------------------------------------



MOV B,#00H


 ;00H is OK flag;================================================================

mov a,b

ACALL H_SEND_TO_BUF01
;XXBB;================================================================

SETB P2.6


  ;OK LAMP NOW WORKING

mov a,#00h

ACALL SPK_ON


;if ok then spk on

LJMP request_exit
  ;exit and RET;----------------------------------------------------------------

TE_ERR: MOV B,#01


  ;TE error flag is 01H

MOV R6,B







LJMP RQT_EXIT;----------------------------------------------------------------

BE_ERR: MOV R7,#0AH


;READY TO DELAY 500us

ACALL D500US
;延时500us

MOV B,#0BH


 ;BE error flag is 0BH


  ; MOV A,#88H
  ; ACALL SEND_TO_BUF01
  ; ACALL SEND_TO_BUF23;----------------------------------------------------------------

RQT_EXIT:

LJMP REPEAT_RQT;----------------------------------------------------------------

request_exit:

RET;==================End of MCM Request Operation =======================2. 对MCM200(SB201)“AntiCollision”(防卡片重叠) 指令的汇编语言应用程序的设计功能:调用该汇编语言子程序,将执行MCM “AntiCollision”(防卡片重叠) 指令操作。如果卡片读写器的天线之有效工作距离内有多张重叠的Mifare 1 非接触式IC射频卡,则该指令将帮助程序员选择其中指定的一张卡片进行操作。“AntiCollision”(防卡片重叠) 指令操作将读取卡片的系列号(SERIAL NUMBER)字节。程序说明:1.)在以下的汇编语言程序中,用到了一些其他的子程序(和上述的“Request std和Request all”指令操作中的相同),分别为:D500US: 为500us的延时子程序;H_SEND_TO_BUF01:(同上)H_SEND_TO_BUF23:(同上)SEND_TO_BUF01:(同上)SEND_TO_BUF23:(同上)DISPLAY:(同上)H_DISPLAY:(同上)2.)在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,这些可能是用于主控程序或是调试而用。特加以说明。等等。3.)在本汇编语言子程序中,校验,计算卡片序列号的方法采用了相邻两个字节相互异或,得出的结果与下一个字节再异或这样一种方法。前四个字节异或的结果与第5个字节应该相同,即与第5个字节异或的结果应为“00H”,否则MCU读到的卡片的序列号有错。因此对于我们来说,卡片的序列号前四个字节是有意义的,第5个字节仅仅用于校验之用。并无实际意义。我们通常所说的序列号指的是前4个字节。并不包括第5个字节。这五个字节被存储在卡片的第0扇区的第0块中,由卡片的生产商制定,固化,不得更改,且在世面上流通的Mifare 1 S50系列的非接触式IC射频卡中,每一张卡片的序列号都不相同,都是的。例如,某一张卡片的序列号为:007e0a42H,则计算异或方法如下:00h异或7eh:(较好的和第二字节异或)0000 00000111 1110


  ---------------------------较好的次异或结果为: 0111 1110


为7eh;将7eh与0ah相异或:
0111 11100000 1010


 -------------------------------第二次异或结果为:
 0111 0100

为74h;将74h与42h相异或:
0111 0100





0100 0010


  -------------------------------第三次异或结果为:
 0011 0110

为36h;这样前四个字节得到的异或结果为36H,如果读到的卡片上的序列号的第5个字节为36H,则证明此次得到的卡片的序列号是有效的。如果读到的卡片上的序列号的第5个字节不为36H,则证明此次得到的卡片的序列号是无效的。第四次异或为:  将第三次异或结果36h与第5个字节相异或,如果第5个字节读到的值为36H,则:将36h与36h相异或:
0011 0110





0011 0110


  -------------------------------第四次异或结果为:
 0000 0000

为00h这样四次异或结果为00H,表明MCU读取的卡片序列号是有效的。具体的程序如下,请读者仔细分析,定能理解上述关于卡片序列号的校验方法。程序清单如下:;======================== MCM ANTICOLLISION OPERTION ====================anticollision:ANTI_REPEAT:

MOV A, #10H

MOV R0,#03H

MOVX @R0,A
 ;BCNTS = 10H

MOV A, #0CH

SETB ACC.0
 ;AC = 1

MOV R0,#01H

MOVX @R0,A


 MOV R7,#02H
;DELAY 1000US

ACALL D500US

MOV A, #93H

MOV R0,#00H

MOVX @R0,A
 ;DATA = 93H (ANTICOLLISION OPERATION CODE)

MOV A, #20H

MOV R0,#00H

MOVX @R0,A
 ;DATA = 20H

MOV A, #28H

MOV R0,#04H

MOVX @R0,A
 ;BCNTR = 28H



MOV A, #0AH

MOV R0,#06H

MOVX @R0,A
 ;TOC = 0AHANTI_RD_STACON:

MOV R0,#01H

MOVX A,@R0
 ;READ: STACON ==> A

JNB ACC.7,ANTI_RD_STACON

;IF DV = 1? NO,IT WILL READ AGAIN;--------------------- NOW DV=1, JUDG OTHER FLAGS---------------------

MOV A, #00H

MOV R0,#06H

MOVX @R0,A
 ;TOC = 00H

JB ACC.6, ANTI_TE_ERR

  ;TE ERR

JB ACC.3, ANTI_BE_ERR

  ;BE ERR;----------------NOW NO ERRORS OCCUR,CAN READ SNR ----------------

MOV R7,#04H
;R7 IS A COUNTER,FOR READING 4-BYTE SERIAL NUMBER

MOV B,#00H

MOV R1,#40H

MOV R0,#00HANTI_LOOP:

MOVX A,@R0


 MOV @R1,A
  ;STORE SNR(1)--(4) IN 40H,41H,42H,43H

XRL B,A

;CACULATE

INC R1

DJNZ R7,ANTI_LOOP

MOVX A,@R0
 ;READ 5th CHK_SUM_VALUE

XRL A,B

;CACULATE

JNZ ANTI_CHK_ERR_EXIT ;If Z=0? If Not,CHK_SUM_VALUE ERROR;------------------------- NOW THE SNR IS VALID ----------------------------_OK:;MOV B,#00H


;IF SNR OK,THEN (B) = 00H <----RETURN_VALUE

MOV R1,#40H


;(40H) ==> SNR(1)

MOV A,@R1

ACALL SEND_TO_BUF01
;SEND SNR(1) TO DISP_BUF_LOW

INC R1



 ;(41H) ==> SNR(2)

MOV A,@R1

ACALL SEND_TO_BUF23
;SEND SNR(2) TO DISP_BUF_HIGH

INC R1



 ;(42H) ==> SNR(3)

MOV A,@R1

ACALL H_SEND_TO_BUF01  ;SEND SNR(3) TO H_DISP_BUF_LOW

INC R1



 ;(43H) ==> SNR(4)

MOV A,@R1

ACALL H_SEND_TO_BUF23
;SEND SNR(4) TO H_DISP_BUF_HIGH

SETB P2.6


 ;OK LAMP NOW WORKING P2.3

ACALL SPK_ON


;if ok then spk on

MOV B,#00H


;IF SNR OK,THEN (B) = 00H <----RETURN_VALUE

AJMP ANTI_OK_EXIT;----------------------ERROR PROCESS-------------------------------ANTI_TE_ERR:

MOV B,#01H


 ;IF TE_ERR, THEN (B) = 01H

AJMP ANTI_ERR_EXITANTI_BE_ERR:

MOV B,#0AH


 ;IF BE_ERR, THEN (B) = 01H

AJMP ANTI_ERR_EXIT;------------------------------ exit process -----------------------------ANTI_CHK_ERR_EXIT:

MOV B,#08H

MOV A,B

;ACALL H_SEND_TO_BUF23
;SEND RETURN_ERR_VALUE TO DISP_BUF_HIGHANTI_ERR_EXIT:ANTI_OK_EXIT:

RET;-------------------- End of MCM AntiCollision Operation -----------------