非接触式IC卡门禁读卡器的程序设计 - 中国一卡通网
用户名密码 [免费注册] [找回密码] 推广技巧 发布求购 建商铺  发产品  会员体制比较  
 

非接触式IC卡门禁读卡器的程序设计

来源:中国一卡通网  作者:西安科技大学 安静宇  发布时间:2010-09-02 10:29:47  字体:[ ]

关键字:IC卡门禁  门禁读卡器  蜂呜器  非接触式IC卡  

摘   要:非接触式智能卡的软件设计分为三部分,分别为MF RC500的应用子程序的设计、主程序设计和读卡器其它电路的应用程序设计。

    非接触式智能卡的软件设计分为三部分,分别为MF RC500的应用子程序的设计、主程序设计和读卡器其它电路的应用程序设计。
 
    单片机开发所使用的语言一般为汇编语言。汇编语言的优点是:代码生成效率高,程序运行速度快。其缺点是:程序的可读性和可移植性比较差,而且用汇编语言编写单片机应用系统程序的周期长,调试和排错比较困难。c语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可用来编写计算机的系统程序,也可用来编写一般的应用程序,用它编写的程序,具有较好的可读性和可移植性。德国Keil软件公司的C51编译器可以直接对8051单片机的内部特殊功能寄存器I/O口进行操作,直接访问片内或片外存储器,还可以进行各种位操作,能够产生简洁、高效率的程序代码,在代码质量上可以与汇编语言相媲美。因此在本读卡器中使用C语言进行程序设计。
 
    非接触式Ic卡读卡器主程序设计

    读卡器对Mifare卡片的操作流程如图所示
 


读卡器对MIFARE卡片的操作流程图


    复位应答操作将通知MF RC500在天线的有效工作范围(距离)内寻找Mifare卡片。如果有Mifare卡片存在,这一操作将分别与每一张Mifare卡片进行通信,读取MIFARE卡片上的卡片类型号TAGTYPE(两个字节),由MFRC500传递给MCU,进行识别处理。如果有多余一张的Mifare卡片在读卡器天线的有效工作范围(距离)内,必须执行防重叠操作,返回一张卡片的序列号,作为本次操作的对象。而其它卡片处于等待状态。在成功执行防重叠操作之后,或在任何时候当程序员想实际地与己知序列号的卡片进行通信时,必须执行选择卡片操作,以建立与所选卡片的通信,同时返回该卡片的size(容量)字节。为了保证对卡片操作的合法性,在对卡片进行操作之前必须在卡片和读卡器之间进行认证操作。读卡器对任何一张Mifare卡片进行任何操作都要经过上述几个步骤,之后就可以具体地对卡片进行相应的读、写等操作。

    读卡器主程序框图如图所示:


读卡器主程序框图


    下面介绍主程序中调用的应用子程序:
 
     MF Rc500应用子程序设计
 
    单片机对Mifare非接触式智能卡的控制是通过MF RC500来实现的,MF RC500是单片机和MIFAR目}接触式智能卡之间的通信载体。单片机对MF RC500的控制是以单片机发出MF RC500的指令来达到的,MF RC500收到指令之后执行这些指令。单片机对MFRC500的某一指令操作不是简单的一条指令所能完成的,必须有一个程序的序列来完成,其中有对MF RC500硬件内核寄存器的读、写以及根据读出的硬件内核寄存器的内容进行语言软件上的判断和设置。例如对卡片进行读(READ)操作,则程序员必须对MF RC500内部的RegChannelRedundancy、RegInterruptEn、RegInterruptRq年lRegCommand等寄存器进行设置,同时还要对地址进行设置,并对每~个状态进行判别,最后在对读得的数据进行校验等等。就连一条最简单的停机(Halt)指令也必须首先对MF RC500内部的诸多寄存器进行设置。不同的指令将设置不同的MF RC500内部寄存器以及应有不同的编程语言程序序列””。下面介绍一下主程序中涉及到的子程序:
 
    (1)寻卡子程序是由下面的函数实现的:

    Char M500PiccRequest(unsigned char req_code,unsigned char 4atq):Request指令将通知读卡器在天线有效的工作范围(距离)内寻找Mifare卡片。如果有Mifare卡片存在,这一指令将与Mifare进行通信,读取卡片上的卡片类型号,传递给单片机,进行识别处理。程序员可以根据TAGTYPE来区别卡片的不同类型。对于Mifare卡片来说,返回卡片的TAGTYPE(2个字节)为0004h。
 
    参数:req code:52H表示当某一张卡片在天线的有效的工作范围(距离)内,Request指令在成功地读取这一张卡片之后,将一直等待卡片的使用者拿走这一张卡片,直到有新的一张卡片进入天线的有效工作范围(距离)内。26H表示连续地进行读卡操作,而不管这张卡片是否被拿走。只要有一张卡片进入天线的有效的工作范围(距离)内,Request指令将始终连续地进行读卡操作;
 
    +atq:表示16位的ATQ字节,atq[O],低位,atq[1],高位。
 
    (2)char M500PiccCascAnticoll(unsigned char select_code,unsigned char bcnt,unsigned char*sn):如果有多于一张卡片在读卡器天线的有效的工作范围(距离)内,必须使用AntiCollision指令,使读卡器能够在这一叠卡片中选择个别的一张卡片。此函数指令开始于一个AntiCollision loop(防重叠循环)。结束时,指令将提供给用户在这些卡片中选择的那张卡片的一个有效的40bit长的序列号SN(serial number)前四个字节是有意义的,第5个字节仅仅作为校验之用,而获得SN之后,~般地应在程序中对所接收到的SN进行校验,以确保数据的正确性1341I”J。
 
    select code:表示模式选择,标准的应为93H; 
    bcnt:表示读入多少个位,一般来说为32位,即四个有效字节:
    *SU:表示输入或输出四个字节。其长度由bcnt控制。
    f3)char M500PiccCascSelect(unsigned char select_code,unsigned char+snr,unsigned char*sak):为了允许在Select指令以后对卡片能进行读、写等指令的操作,Select指令是很重要,必须首先被使用。被选择的卡片将给出其自己的存储器容量即己编码的一个BYTE(字节)。
    select code:表示模式选择93H(95H或97H);
    +snr:表示由微处理器控制RC500向PICC发出四个字节的序号,然后等待卡片的回应。四个字节是在Anticoll操作中接收到的四个字节;
    *sak:表示一个字节的应答位,共8位,其中bit6与bit3可用。 

    (4)char M500PiccAuth(unsigned char auth—mode,unsigned char+snr,unsigned charkey sector,unsigned char block):在MCU将运算获得的数据,准备存储到卡片上的存储器之前,或MCU希望能读取Mifare卡片上的数据之前,程序员必须证明他的读、写请求操作是被允许的。这可以通过选择秘密地存储在MF RC500的RAM中的密码集(KEYSET)中的一组密码来进行认证而实现。如果这一组密码与Mifare卡片上的密码 

    非接触式读卡器的软件设计设计匹配,则这一次的操作就被允许。unsigned char auth_mode:表示认证模式,当用60h代码时,在KEYADDR寄存器中只能设置AB=“l”,用于选择KEYA;当用61h代码时,在KEYADDR寄存器中只能设置AB=?0’,用于选择KEYB:
    +sIlr:表示(输入)需要进行认证的四个字节地址指针;
    key :表示选择要认证的扇区( 15);_sector 0-
    block:表示选择要认证的块地址(O~64)。 

    (5)char M500PiccAuthE2(unsigned char auth—mode,unsigned char+snr,unsigned charkey sector,unsigned char sector):对存储在EEPROM中的密码进行论证,要认证的密码必须事先存放在EEPROM的指定位置。
    auth mode:表示认证模式,当用60h代码时,在KEYADDR寄存器中只能设置AB=“l”,用于选择KEYA;当用61h代码时,在KEYADDR寄存器中只能设置AB=?0’,用于选择KEYB:
    ·sⅢ:表示(输入)需要进行认证的四个字节地址指针;
    kez sector:表示选择要认证的扇区(0~15);
    sector:表示选择要认证的扇区地址(¨15)。 

    (6)char M500HostcodeKey(unsigned char+uncoded, unsigned char+coded):这个功能是完成为了认证在的过程,完成将RC500密码缓冲器中主存密码的非编码信息(6字节)进行编码(12字节)。
    *uncoded:输入;
    *coded:输出。 

    (7)char M500PiccAuthKey(unsigned char auth_mode,unsigned char+snr,unsigned char4keys,unsigned char sector):这个功能完成直接对微处理器加载进行的密码进行认证,在执行这条命令前,M500HostCodeKey命令必须先执行。
auth—mode:表示认证模式,当用60h代码时,在KEYADDR寄存器中只能设置AB=“1”,用于选择KEYA;当用61h代码时,在KEYADDR寄存器中只能设置AB=?0’,用于选择KEYB[36J;
    +Sill':表示(输入)需要进行认证的四个字节地址指针;
    keys:表示己进行编码的12字节密码流: 
    sector:表示选择要认证的扇区地址(o~15)。
    (8)char M500PiccRead(unsigned char addr,unsigned char+一data):功能是完成读取卡片的指定地址的16个数据。存放到指定的单元。
    Addr:表示块地址(0-63);
    +data:表示输出数据指针。 

    (9)char M500PiccWrite(unsigned char addr,unsigned char+一data):功能是完成将数据写入指定的地址中。写入后等待卡片的应答。
    Addr:表示块地址(0-63);
    +data:表示输出数据指针。 

    蜂鸣器驱动程序设计 

    蜂呜器发出声音的条件是晶体管不断ON/OFF交互变化,也即是P3.5不断的输出“1”电位及?0’电位,如果P3.5输出一直是“1”或输出一直是?0电位,则蜂鸣器无法产生声音。程序设计除了要让蜂鸣器能够发出声音之外,还要让蜂鸣器能够连续发出不同音长及音调的声音,使蜂鸣器能够基于不同功能发出不同的报警信号。

更多

新闻投稿合作邮箱:yktchina-admin@163.com    字体[ ] [收藏] [进入论坛]

推荐文章

论坛热帖