📄 untitled document.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0064)http://www.flyring.com.cn/chinese/UploadFiles/20044216953538.htm -->
<HTML><HEAD><TITLE>Untitled Document</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY background="" bgColor=#ffffff text=#000000>
<DIV align=center>
<P><FONT color=#0000ff><B>关于非接触式IC智能(射频)卡及其读写设备内核技术的研究与应用开发(连载8) <BR><BR>作者:
上海华东磁记录电子公司 张敏 <BR></B></FONT></P>
<TABLE border=1 borderColor=#ff9900 width="80%">
<TBODY>
<TR>
<TD align=left height=5176 vAlign=top>
<P><BR><BR>(一).
对MCM200(SB201)操作指令的程序设计和开发<BR> 对MCM指令的说明:<BR> MCU对MCM的控制是以MCU发出MCM的指令来达到的。MCU对MCM的控制事实上也就是对
Mifare 1 非接触式IC射频卡的控制。<BR> 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智能射频卡的“刷卡”读写器(收费管理系统),机关/企业内部考勤管理系统,医疗保险管理系统,出租车收费管理系统,银行服务“一卡通”等等。<BR> MCU对MCM的某一指令操作不是简单的一条指令所能完成的,必须有一个程序的序列来完成,其中有对MCM硬件内核寄存器的设置以及汇编语言软件上的判断和设置。例如对卡片进行读(READ)操作,则程序员必须对MCM内部的BCNTR寄存器,BCNTS寄存器,TOC寄存器,STACON寄存器等进行设置,同时还必须对地址进行设置,对每一个状态进行判别等等,对最终读得的数据还必须进行校验等等。就连一条最简单的停机(Halt)指令也必须首先对MCM内部的诸多寄存器进行设置,等等。不同的指令将设置不同的MCM内部寄存器以及应有不同的汇编语言程序序列。<BR> 1.对MCM200(SB201)“Request
std”和“ Request all”指令的汇编语言应用程序的设计<BR> 功能:调用该汇编语言子程序,将执行MCM “Request
std”或“ Request all”指令操作,读取Mifare 1
非接触式IC射频卡的TAGTYPE字节,建立与卡片的第一步必不可少的通信联系。</P>
<P align=left>程序说明:<BR> 1.在以下的汇编语言程序中,如果要调用该MCM指令操作,则应首先设置MCU的R2的值:
R2=”00H” 执行Request std操作;<BR>R2=”01H” 执行Request
all操作;<BR> 在该指令程序中用到了一些其他的子程序分别为:<BR>D500US:
为500us的延时子程序;<BR>H_SEND_TO_BUF01:<BR> DEMO电路中,将A寄存器中的数据送显示电路中的高四位中的第0,1位,以准备显示,地址为34H,35H;<BR>H_SEND_TO_BUF23:<BR> DEMO电路中,将A寄存器中的数据送显示电路中的高四位中的第2,3位,以准备显示,地址为32H,33H;<BR>SEND_TO_BUF01:<BR> DEMO电路中,将A寄存器中的数据送显示电路中的低四位中的第0,1位,以准备显示,地址为39H,3AH;<BR>SEND_TO_BUF23:<BR> DEMO电路中,将A寄存器中的数据送显示电路中的低四位中的第2,3位,以准备显示,地址为37H,38H;<BR>DISPLAY:<BR> DEMO电路中,显示8位数据中的低4位数据值。即将存储在37H至3AH显示内存中的低四位数据显示在LED上。<BR>H_DISPLAY:<BR> DEMO电路中,显示8位数据中的高4位数据值。即将存储在31H至34H显示内存中的高四位数据显示在LED上。</P>
<P
align=left>2.在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,这些可能是用于主控程序或是调试而用。特加以说明。</P>
<P align=left> 程序清单如下:<BR>;======================== MCM REQUEST OPERATION
===================<BR>request:<BR>REPEAT_RQT:<BR>_1_STACON: ;设置MCM中的STACON寄存器为
: 0CH<BR> MOV A,#0CH ;设置A寄存器 = 0CH<BR> MOV R0,#01H
;STACON 寄存器地址为01H<BR> MOVX
@R0,A ;将A寄存器内容送入STACON寄存器中<BR>_2_BAUDRATE:
;设置MCM中的BAUDRATE寄存器为:0EH<BR> MOV A,#0EH<BR> MOV R0,#05H<BR> MOVX
@R0,A<BR>_3_ENABLE: ;设置MCM中的ENABLE寄存器为:0C0H<BR> MOV
A,#0C0H<BR> MOV R0,#02H<BR> MOVX @R0,A<BR>_4_MODE:
;设置MCM中的MODE寄存器为:0C6H<BR> MOV A,#0D6H
;(如果采用SB201,则MODE寄存器应为:0D6H)<BR> MOV R0,#07H<BR> MOVX
@R0,A<BR>_5_STACON_AGAIN:<BR> MOV A,#0CH<BR> MOV R0,#01H<BR> MOVX
@R0,A<BR>_6_RCODE:<BR> MOV A,#02H<BR> MOV R0,#0EH<BR> MOVX
@R0,A<BR>_7_BCNTS:<BR> MOV A,#07H<BR> MOV R0,#03H<BR> MOVX
@R0,A<BR>_8_BCNTR:<BR> MOV A,#10H<BR> MOV R0,#04H<BR> MOVX
@R0,A<BR>;---------------------------------------------------------------- <BR>JUDG_RQT_STD_OR_ALL: ;根据R2值,
判断是执行Request std操作<BR> MOV A,R2 ;还是Request all操作<BR> XRL
A,#01H<BR> JNZ
RQT_STD<BR>;---------------------------------------------------------------- <BR>RQT_ALL:<BR> MOV
A,#52H<BR> AJMP _11_RQT_MCM<BR>RQT_STD:<BR> MOV
A,#26H<BR>_11_RQT_MCM:<BR> MOV R0,#00H<BR> MOVX
@R0,A<BR>_12_TOC:<BR> MOV A, #0AH<BR> MOV R0,#06H<BR> MOVX
@R0,A ;TOC =
0AH<BR>;---------------------------------------------------------------- <BR>RD_STACON: <BR> MOV
R0,#01H<BR> MOVX
A,@R0 ;READ STACON()<BR>;================================================================<BR>JUDG_DV_BIT:<BR> JNB
ACC.7,RD_STACON
; RD_STACON<BR>;================================================================<BR> mov
r7,a ;protect A =
stacon()<BR>;================================================================<BR> MOV
A, #00H<BR> MOV R0,#06H<BR> MOVX
@R0,A ;TOC=00H<BR>;================================================================<BR> mov
a,r7 ;return stacon() value to A<BR>;================= ;for
BE and TE error-flag<BR> ACALL H_SEND_TO_BUF23 ;DISPLAY R7XX --->
R7 =
STACON()<BR>;================================================================<BR>_13_JUDG_ERR:<BR> JB
ACC.6,TE_ERR ; TE_ERR<BR> JB ACC.3,BE_ERR ;
BE_ERR<BR>;================================================================<BR> MOV
R0,#00H ;READ_TAGTYPE_0<BR> MOVX A,@R0</P>
<P align=left> MOV 45H,A<BR> ACALL SEND_TO_BUF01 ;SEND TAGTYPE 0
TO
DISP_BUF_LOW<BR>;---------------------------------------------------------------- <BR> mov
r0,#00h<BR> MOVX A,@R0 ;READ_TAGTYPE_1</P>
<P align=left> MOV 46H,A<BR> ACALL SEND_TO_BUF23 ;SEND TAGETYPE 1
TO
DISP_BUF_HIGH<BR>;---------------------------------------------------------------- <BR> MOV
B,#00H ;00H is OK
flag<BR>;================================================================<BR> mov
a,b<BR> ACALL
H_SEND_TO_BUF01 ;XXBB<BR>;================================================================<BR> SETB
P2.6 ;OK LAMP NOW WORKING <BR> mov a,#00h<BR> ACALL
SPK_ON ;if ok then spk on<BR> LJMP request_exit ;exit and
RET<BR>;---------------------------------------------------------------- <BR>TE_ERR:
MOV B,#01 ;TE error flag is 01H<BR> MOV R6,B </P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -