• <bdo id="i0k2q"><xmp id="i0k2q">
      • <menu id="i0k2q"><em id="i0k2q"></em></menu>
        歡迎您訪問鄭州興邦電子股份有限公司官方網(wǎng)站!
        阿里巴巴誠信通企業(yè)
        全國咨詢熱線:40000-63966
        興邦電子,中國水控機(jī)第一品牌

        聯(lián)系興邦電子

        全國咨詢熱線:40000-63966

        售后:0371-55132951/55132952

        工廠:河南省 鄭州市 高新區(qū)蓮花街電子電器產(chǎn)業(yè)園

        關(guān)于非接觸式IC智能(射頻)卡及其讀寫設(shè)備內(nèi)核技術(shù)的研究與應(yīng)用開發(fā)(連載8)

        文章出處:http://www.mjagi.com 作者:張敏&nbsp;&nbsp; 人氣: 發(fā)表時(shí)間:2011年11月01日

        [文章內(nèi)容簡介]:關(guān)于非接觸式IC智能(射頻)卡及其讀寫設(shè)備內(nèi)核技術(shù)的研究與應(yīng)用開發(fā)(連載8)

        一). 對MCM200(SB201)操作指令的程序設(shè)計(jì)和開發(fā)
          對MCM指令的說明:
          MCU對MCM的控制是以MCU發(fā)出MCM的指令來達(dá)到的。MCU對MCM的控制事實(shí)上也就是對 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 停機(jī)指令等。因?yàn)樗鼈兛梢酝瓿蒑CU對Mifare 1 非接觸式IC射頻卡的很多應(yīng)用場合的控制。例如 門禁控制系統(tǒng)(Door Access System),高速公路不停車收費(fèi)系統(tǒng),停車場收費(fèi)管理系統(tǒng),公交/地鐵非接觸式IC智能射頻卡的“刷卡”讀寫器(收費(fèi)管理系統(tǒng)),機(jī)關(guān)/企業(yè)內(nèi)部考勤管理系統(tǒng),醫(yī)療保險(xiǎn)管理系統(tǒng),出租車收費(fèi)管理系統(tǒng),銀行服務(wù)“一卡通”等等。
          MCU對MCM的某一指令操作不是簡單的一條指令所能完成的,必須有一個程序的序列來完成,其中有對MCM硬件內(nèi)核寄存器的設(shè)置以及匯編語言軟件上的判斷和設(shè)置。例如對卡片進(jìn)行讀(READ)操作,則程序員必須對MCM內(nèi)部的BCNTR寄存器,BCNTS寄存器,TOC寄存器,STACON寄存器等進(jìn)行設(shè)置,同時(shí)還必須對地址進(jìn)行設(shè)置,對每一個狀態(tài)進(jìn)行判別等等,對最終讀得的數(shù)據(jù)還必須進(jìn)行校驗(yàn)等等。就連一條最簡單的停機(jī)(Halt)指令也必須首先對MCM內(nèi)部的諸多寄存器進(jìn)行設(shè)置,等等。不同的指令將設(shè)置不同的MCM內(nèi)部寄存器以及應(yīng)有不同的匯編語言程序序列。
          1.對MCM200(SB201)“Request std”和“ Request all”指令的匯編語言應(yīng)用程序的設(shè)計(jì)
          功能:調(diào)用該匯編語言子程序,將執(zhí)行MCM “Request std”或“ Request all”指令操作,讀取Mifare 1 非接觸式IC射頻卡的TAGTYPE字節(jié),建立與卡片的第一步必不可少的通信聯(lián)系。

        程序說明:
          1.在以下的匯編語言程序中,如果要調(diào)用該MCM指令操作,則應(yīng)首先設(shè)置MCU的R2的值: R2=”00H”  執(zhí)行Request std操作;
        R2=”01H”  執(zhí)行Request all操作;
          在該指令程序中用到了一些其他的子程序分別為:
        D500US: 為500us的延時(shí)子程序;
        H_SEND_TO_BUF01:
          DEMO電路中,將A寄存器中的數(shù)據(jù)送顯示電路中的高四位中的第0,1位,以準(zhǔn)備顯示,地址為34H,35H;
        H_SEND_TO_BUF23:
          DEMO電路中,將A寄存器中的數(shù)據(jù)送顯示電路中的高四位中的第2,3位,以準(zhǔn)備顯示,地址為32H,33H;
        SEND_TO_BUF01:
          DEMO電路中,將A寄存器中的數(shù)據(jù)送顯示電路中的低四位中的第0,1位,以準(zhǔn)備顯示,地址為39H,3AH;
        SEND_TO_BUF23:
          DEMO電路中,將A寄存器中的數(shù)據(jù)送顯示電路中的低四位中的第2,3位,以準(zhǔn)備顯示,地址為37H,38H;
        DISPLAY:
          DEMO電路中,顯示8位數(shù)據(jù)中的低4位數(shù)據(jù)值。即將存儲在37H至3AH顯示內(nèi)存中的低四位數(shù)據(jù)顯示在LED上。
        H_DISPLAY:
          DEMO電路中,顯示8位數(shù)據(jù)中的高4位數(shù)據(jù)值。即將存儲在31H至34H顯示內(nèi)存中的高四位數(shù)據(jù)顯示在LED上。

        2.在以下的匯編語言程序中,讀者可能會碰到一些寄存器變量,或其他應(yīng)用子程序,這些可能是用于主控程序或是調(diào)試而用。特加以說明。

          程序清單如下:
        ;======================== MCM REQUEST OPERATION ===================
        request:
        REPEAT_RQT:
        _1_STACON:           ;設(shè)置MCM中的STACON寄存器為 : 0CH
            MOV A,#0CH       ;設(shè)置A寄存器 = 0CH
            MOV R0,#01H       ;STACON 寄存器地址為01H
            MOVX @R0,A       ;將A寄存器內(nèi)容送入STACON寄存器中
        _2_BAUDRATE: ;設(shè)置MCM中的BAUDRATE寄存器為:0EH
            MOV A,#0EH
            MOV R0,#05H
            MOVX @R0,A
        _3_ENABLE:            ;設(shè)置MCM中的ENABLE寄存器為:0C0H
            MOV A,#0C0H
            MOV R0,#02H
            MOVX @R0,A
        _4_MODE:  ;設(shè)置MCM中的MODE寄存器為:0C6H
            MOV A,#0D6H ;(如果采用SB201,則MODE寄存器應(yīng)為: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:    ??;根據(jù)R2值, 判斷是執(zhí)行Request std操作
            MOV A,R2         ;還是Request all操作
            XRL A,#01H
            JNZ RQT_STD
        ;----------------------------------------------------------------    
        RQT_ALL:
            MOV A,#52H
            AJMP _11_RQT_MCM
        RQT_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   ;延時(shí)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”(防卡片重疊) 指令的匯編語言應(yīng)用程序的設(shè)計(jì)
        功能:調(diào)用該匯編語言子程序,將執(zhí)行MCM “AntiCollision”(防卡片重疊) 指令操作。如果卡片讀寫器的天線之有效工作距離內(nèi)有多張重疊的Mifare 1 非接觸式IC射頻卡,則該指令將幫助程序員選擇其中指定的一張卡片進(jìn)行操作?!癆ntiCollision”(防卡片重疊) 指令操作將讀取卡片的系列號(SERIAL NUMBER)字節(jié)。
        程序說明:
        1.)在以下的匯編語言程序中,用到了一些其他的子程序(和上述的“Request std和Request all”指令操作中的相同),分別為:
        D500US: 為500us的延時(shí)子程序;
        H_SEND_TO_BUF01:(同上)
        H_SEND_TO_BUF23:(同上)
        SEND_TO_BUF01:(同上)
        SEND_TO_BUF23:(同上)
        DISPLAY:(同上)
        H_DISPLAY:(同上)
        2.)在以下的匯編語言程序中,讀者可能會碰到一些寄存器變量,或其他應(yīng)用子程序,這些可能是用于主控程序或是調(diào)試而用。特加以說明。等等。
        3.)在本匯編語言子程序中,校驗(yàn),計(jì)算卡片序列號的方法采用了相鄰兩個字節(jié)相互異或,得出的結(jié)果與下一個字節(jié)再異或這樣一種方法。前四個字節(jié)異或的結(jié)果與第5個字節(jié)應(yīng)該相同,即與第5個字節(jié)異或的結(jié)果應(yīng)為“00H”,否則MCU讀到的卡片的序列號有錯。因此對于我們來說,卡片的序列號前四個字節(jié)是有意義的,第5個字節(jié)僅僅用于校驗(yàn)之用。并無實(shí)際意義。我們通常所說的序列號指的是前4個字節(jié)。并不包括第5個字節(jié)。這五個字節(jié)被存儲在卡片的第0扇區(qū)的第0塊中,由卡片的生產(chǎn)商制定,固化,不得更改,且在世面上流通的Mifare 1 S50系列的非接觸式IC射頻卡中,每一張卡片的序列號都不相同,都是唯一的。
        例如,某一張卡片的序列號為:007e0a42H,則計(jì)算異或方法如下:
        00h異或7eh:(第一和第二字節(jié)異或)
        0000 0000
        0111 1110
                ---------------------------
        第一次異或結(jié)果為: 0111 1110      為7eh;
        將7eh與0ah相異或:  0111 1110
        0000 1010
               -------------------------------
        第二次異或結(jié)果為:   0111 0100     為74h;
        將74h與42h相異或:  0111 0100
                    0100 0010
                -------------------------------
        第三次異或結(jié)果為:   0011 0110     為36h;
        這樣前四個字節(jié)得到的異或結(jié)果為36H,如果讀到的卡片上的序列號的第5個字節(jié)為36H,則證明此次得到的卡片的序列號是有效的。如果讀到的卡片上的序列號的第5個字節(jié)不為36H,則證明此次得到的卡片的序列號是無效的。
        第四次異或?yàn)椋骸?將第三次異或結(jié)果36h與第5個字節(jié)相異或,如果第5個字節(jié)讀到的值為36H,則:
        將36h與36h相異或:  0011 0110
                    0011 0110
                -------------------------------
        第四次異或結(jié)果為:   0000 0000     為00h
        這樣四次異或結(jié)果為00H,表明MCU讀取的卡片序列號是有效的。具體的程序如下,請讀者仔細(xì)分析,定能理解上述關(guān)于卡片序列號的校驗(yàn)方法。

        程序清單如下:
        ;======================== 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 = 0AH
        ANTI_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,#00H
        ANTI_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_EXIT
        ANTI_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_HIGH
        ANTI_ERR_EXIT:
        ANTI_OK_EXIT:
            RET
        ;-------------------- End of MCM AntiCollision Operation -----------------

        本文關(guān)鍵詞:關(guān)于非接觸式IC智能射頻卡及其讀寫設(shè)備內(nèi),于非接觸式IC智能射頻卡及其讀寫設(shè)備內(nèi)核,非接觸式IC智能射頻卡及其讀寫設(shè)備內(nèi)核技,接觸式IC智能射頻卡及其讀寫設(shè)備內(nèi)核技術(shù),觸式IC智能射頻卡及其讀寫設(shè)備內(nèi)核技術(shù)的,式IC智能射頻卡及其讀寫設(shè)備內(nèi)核技術(shù)的研,IC智能射頻卡及其讀寫設(shè)備內(nèi)核技術(shù)的研究,C智能射頻卡及其讀寫設(shè)備內(nèi)核技術(shù)的研究與,智能射頻卡及其讀寫設(shè)備內(nèi)核技術(shù)的研究與應(yīng),能射頻卡及其讀寫設(shè)備內(nèi)核技術(shù)的研究與應(yīng)用,射頻卡及其讀寫設(shè)備內(nèi)核技術(shù)的研究與應(yīng)用開,頻卡及其讀寫設(shè)備內(nèi)核技術(shù)的研究與應(yīng)用開發(fā),卡
        回到頂部
        亚洲天堂国产视频,在线观看黄V免费网站免费,国产自无码视频在线观看手机,亚洲AV无码乱码国产精品9 亚洲96在线观看 免费三级片中文字幕无码
      • <bdo id="i0k2q"><xmp id="i0k2q">
          • <menu id="i0k2q"><em id="i0k2q"></em></menu>