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

📄 untitled document.htm

📁 内附IC读卡器设计方案,该设计使用89C52和MCM200,里面有详细的设计过程及程序代码,相信有一定IC卡经验
💻 HTM
📖 第 1 页 / 共 2 页
字号:
      <P align=left>    LJMP 
      RQT_EXIT<BR>;----------------------------------------------------------------    <BR>BE_ERR: 
      MOV R7,#0AH       ;READY TO DELAY 500us<BR>    ACALL D500US 
        ;延时500us<BR>    MOV B,#0BH       ;BE error flag is 0BH    </P>
      <P align=left>    ; MOV A,#88H<BR>    ; ACALL SEND_TO_BUF01<BR>    ; ACALL 
      SEND_TO_BUF23<BR>;----------------------------------------------------------------    <BR>RQT_EXIT:<BR>    LJMP REPEAT_RQT<BR>;----------------------------------------------------------------    <BR>request_exit:<BR>    RET<BR>;==================End 
      of MCM Request Operation =======================</P>
      <P align=left></P>
      <P align=left>2. 对MCM200(SB201)“AntiCollision”(防卡片重叠) 
      指令的汇编语言应用程序的设计<BR>功能:调用该汇编语言子程序,将执行MCM “AntiCollision”(防卡片重叠) 
      指令操作。如果卡片读写器的天线之有效工作距离内有多张重叠的Mifare 1 
      非接触式IC射频卡,则该指令将帮助程序员选择其中指定的一张卡片进行操作。“AntiCollision”(防卡片重叠) 
      指令操作将读取卡片的系列号(SERIAL 
      NUMBER)字节。<BR>程序说明:<BR>1.)在以下的汇编语言程序中,用到了一些其他的子程序(和上述的“Request std和Request 
      all”指令操作中的相同),分别为:<BR>D500US: 
      为500us的延时子程序;<BR>H_SEND_TO_BUF01:(同上)<BR>H_SEND_TO_BUF23:(同上)<BR>SEND_TO_BUF01:(同上)<BR>SEND_TO_BUF23:(同上)<BR>DISPLAY:(同上)<BR>H_DISPLAY:(同上)<BR>2.)在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,这些可能是用于主控程序或是调试而用。特加以说明。等等。<BR>3.)在本汇编语言子程序中,校验,计算卡片序列号的方法采用了相邻两个字节相互异或,得出的结果与下一个字节再异或这样一种方法。前四个字节异或的结果与第5个字节应该相同,即与第5个字节异或的结果应为“00H”,否则MCU读到的卡片的序列号有错。因此对于我们来说,卡片的序列号前四个字节是有意义的,第5个字节仅仅用于校验之用。并无实际意义。我们通常所说的序列号指的是前4个字节。并不包括第5个字节。这五个字节被存储在卡片的第0扇区的第0块中,由卡片的生产商制定,固化,不得更改,且在世面上流通的Mifare 
      1 
      S50系列的非接触式IC射频卡中,每一张卡片的序列号都不相同,都是唯一的。<BR>例如,某一张卡片的序列号为:007e0a42H,则计算异或方法如下:<BR>00h异或7eh:(第一和第二字节异或)<BR>0000 
      0000<BR>0111 1110<BR>        ---------------------------<BR>第一次异或结果为: 0111 
      1110      为7eh;<BR>将7eh与0ah相异或:  0111 1110<BR>0000 
      1010<BR>       -------------------------------<BR>第二次异或结果为:   0111 
      0100     为74h;<BR>将74h与42h相异或:  0111 0100<BR>            0100 
      0010<BR>        -------------------------------<BR>第三次异或结果为:   0011 
      0110     
      为36h;<BR>这样前四个字节得到的异或结果为36H,如果读到的卡片上的序列号的第5个字节为36H,则证明此次得到的卡片的序列号是有效的。如果读到的卡片上的序列号的第5个字节不为36H,则证明此次得到的卡片的序列号是无效的。<BR>第四次异或为:  
      将第三次异或结果36h与第5个字节相异或,如果第5个字节读到的值为36H,则:<BR>将36h与36h相异或:  0011 0110 
      <BR>            0011 0110<BR>        
      -------------------------------<BR>第四次异或结果为:   0000 0000     
      为00h<BR>这样四次异或结果为00H,表明MCU读取的卡片序列号是有效的。具体的程序如下,请读者仔细分析,定能理解上述关于卡片序列号的校验方法。</P>
      <P align=left>程序清单如下:<BR>;======================== MCM ANTICOLLISION 
      OPERTION ====================<BR>anticollision:</P>
      <P align=left>ANTI_REPEAT:<BR>    MOV A, #10H<BR>    MOV 
      R0,#03H<BR>    MOVX @R0,A   ;BCNTS = 10H<BR>    MOV A, #0CH<BR>    SETB 
      ACC.0   ;AC = 1<BR>    MOV R0,#01H<BR>    MOVX @R0,A   <BR>    MOV 
      R7,#02H   ;DELAY 1000US<BR>    ACALL D500US<BR>    MOV A, #93H<BR>    MOV 
      R0,#00H<BR>    MOVX @R0,A   ;DATA = 93H (ANTICOLLISION OPERATION 
      CODE)<BR>    MOV A, #20H<BR>    MOV R0,#00H<BR>    MOVX @R0,A   ;DATA = 
      20H<BR>    MOV A, #28H<BR>    MOV R0,#04H<BR>    MOVX @R0,A   ;BCNTR = 
      28H    <BR>    MOV A, #0AH<BR>    MOV R0,#06H<BR>    MOVX @R0,A   ;TOC = 
      0AH<BR>ANTI_RD_STACON:<BR>    MOV R0,#01H<BR>    MOVX A,@R0   ;READ: 
      STACON ==&gt; A<BR>    JNB ACC.7,ANTI_RD_STACON    ;IF DV = 1? NO,IT WILL 
      READ AGAIN<BR>;--------------------- NOW DV=1, JUDG OTHER 
      FLAGS---------------------<BR>    MOV A, #00H<BR>    MOV 
      R0,#06H<BR>    MOVX @R0,A   ;TOC = 00H<BR>    JB ACC.6, ANTI_TE_ERR      
      ;TE ERR<BR>    JB ACC.3, ANTI_BE_ERR      ;BE ERR<BR>;----------------NOW 
      NO ERRORS OCCUR,CAN READ SNR ----------------<BR>    MOV R7,#04H   ;R7 IS 
      A COUNTER,FOR READING 4-BYTE SERIAL NUMBER<BR>    MOV B,#00H<BR>    MOV 
      R1,#40H<BR>    MOV R0,#00H<BR>ANTI_LOOP:<BR>    MOVX A,@R0   <BR>    MOV 
      @R1,A    ;STORE SNR(1)--(4) IN 40H,41H,42H,43H<BR>    XRL B,A     
      ;CACULATE<BR>    INC R1<BR>    DJNZ R7,ANTI_LOOP<BR>    MOVX A,@R0   ;READ 
      5th CHK_SUM_VALUE<BR>    XRL A,B     ;CACULATE<BR>    JNZ 
      ANTI_CHK_ERR_EXIT ;If Z=0? If Not,CHK_SUM_VALUE 
      ERROR<BR>;------------------------- NOW THE SNR IS VALID 
      ----------------------------<BR>_OK:<BR>;MOV B,#00H       ;IF SNR OK,THEN 
      (B) = 00H &lt;----RETURN_VALUE</P>
      <P align=left>    MOV R1,#40H       ;(40H) ==&gt; SNR(1)<BR>    MOV 
      A,@R1<BR>    ACALL SEND_TO_BUF01  ;SEND SNR(1) TO DISP_BUF_LOW<BR>    INC 
      R1         ;(41H) ==&gt; SNR(2)<BR>    MOV A,@R1<BR>    ACALL 
      SEND_TO_BUF23  ;SEND SNR(2) TO DISP_BUF_HIGH<BR>    INC R1         ;(42H) 
      ==&gt; SNR(3)<BR>    MOV A,@R1<BR>    ACALL H_SEND_TO_BUF01  ;SEND SNR(3) 
      TO H_DISP_BUF_LOW<BR>    INC R1         ;(43H) ==&gt; SNR(4)<BR>    MOV 
      A,@R1<BR>    ACALL H_SEND_TO_BUF23  ;SEND SNR(4) TO H_DISP_BUF_HIGH</P>
      <P align=left>    SETB P2.6       ;OK LAMP NOW WORKING P2.3<BR>    ACALL 
      SPK_ON      ;if ok then spk on<BR>    MOV B,#00H       ;IF SNR OK,THEN (B) 
      = 00H &lt;----RETURN_VALUE<BR>    AJMP 
      ANTI_OK_EXIT<BR>;----------------------ERROR 
      PROCESS-------------------------------<BR>ANTI_TE_ERR:<BR>    MOV 
      B,#01H       ;IF TE_ERR, THEN (B) = 01H<BR>    AJMP 
      ANTI_ERR_EXIT<BR>ANTI_BE_ERR:<BR>    MOV B,#0AH       ;IF BE_ERR, THEN (B) 
      = 01H<BR>    AJMP ANTI_ERR_EXIT<BR>;------------------------------ exit 
      process -----------------------------<BR>ANTI_CHK_ERR_EXIT:<BR>    MOV 
      B,#08H<BR>    MOV A,B<BR>    ;ACALL H_SEND_TO_BUF23   ;SEND 
      RETURN_ERR_VALUE TO 
      DISP_BUF_HIGH<BR>ANTI_ERR_EXIT:<BR>ANTI_OK_EXIT:<BR>    RET<BR>;-------------------- 
      End of MCM AntiCollision Operation -----------------</P>
      <P align=left>(待续)<BR><BR><BR>来源: 《金卡工程》2000.9 <BR><BR><BR></P>
      <P align=right></P>
      <P align=right></P>
      <P align=right></P>
      <P align=right><A href="file:///E|/index/index.htm">返回首页</A> 
  </P></TD></TR></TBODY></TABLE><B></B></DIV></BODY></HTML>

⌨️ 快捷键说明

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