一种非接触式IC卡读卡器设计

著录项
  • CN201610234495.3
  • 20160418
  • CN107305618A
  • 20171031
  • 湖南百里目科技有限责任公司
  • 不公告发明人
  • G06K7/10
  • G06K7/10

  • 湖南省长沙市天心湘府西路229号文苑(保利花园)三期11栋606房
  • 湖南(43)
摘要
本发明涉及一种非接触式IC卡读卡器设计,本发明开发了一种读写距离为25MM的非接触式IC卡读卡器,本发明详细地阐述了非接触式IC卡读卡器的硬件和软件设计,给出了每一部分的实际电路图和应用程序。读卡器的硬件设计包括电源供应电路、蜂鸣器驱动电路、RS232通信电路、MCU的连接、MFRC500接口电路和读卡器天线这几部分的设计。软件设计分包括对MFRC500的应用程序的设计、对读卡器其他电路的应用程序设计和主程序设计三个部分,每一部分都给出了具体程序并对程序进行了详细的说明。本发明具有典型读写距离为20~25MM、配有RS232通讯接口,便于同上位机通讯、专为门禁系统设计、小巧,价格便宜等特点。
权利要求

1.本发明涉及一种非接触式IC卡读卡器设计,本发明开发了一种读写距离为25MM的非接触式IC卡读卡器,本发明详细地阐述了非接触式IC卡读卡器的硬件和软件设计,给出了每一部分的实际电路图和应用程序;读卡器的硬件设计包括电源供应电路、蜂鸣器驱动电路、RS232通信电路、MCU的连接、MFRC500接口电路和读卡器天线这几部分的设计;软件设计分为对MFRC500的应用程序的设计、对读卡器其他电路的应用程序设计和主程序设计三个部分,每一部分都给出了具体程序并对程序进行了详细的说明;本发明具有典型读写距离为20~25MM、配有RS232通讯接口,便于同上位机通讯、专为门禁系统设计、小巧,价格便宜等特点。

2.根据权利要求1所述的一种非接触式IC卡读卡器设计,其特征在于,本发明CPU采用8位微处理器中选取了ATMEL公司生产的AT89C51;所使用的仿真器为南京WAVE公司生产的G6W型,该仿真器支持汇编语言、C51高级语言、PL/M语言;编程器为TOP2000型编程器。

3.根据权利要求1所述的一种非接触式IC卡读卡器设计,其特征在于,本发明读卡器采用串行接口芯片MAX232通过标准的DB9直接与PC机相连。

4.根据权利要求1所述的一种非接触式IC卡读卡器设计,其特征在于,本发明读卡器内所有芯片的工作电压均为5V,读卡器采用外接电源供电,220V市电经变压器降压,再经稳压电路稳压成5V后供应读卡器内芯片;本读卡器选用7805芯片进行稳压。

说明书
技术领域

本发明涉及读卡器领域,尤其涉及一种非接触式IC卡读卡器设计。

智能卡的名称来源于英文名词“Smart card”,又称集成电路卡,即IC卡。它将一个集成电路芯片镶嵌于塑料基片中,封装成卡的形式,其外形与覆盖磁条的磁卡相似。

IC卡的概念是70年代初提出来的,法国布尔(BULL)公司于1976年首先创造出IC卡产品,并将这项技术应用到金融、交通、医疗、身份证明等多个行业,它将微电子技术和计算机技术结合在一起,提高了人们生活和工作的现代化程度。在此后的十几年间,除法国的布尔公司之外,世界上先后有Motorola、TI、Thomson、Hitachi、OKI、Toshiba、Sharp、Atmel、Gemplus、Schlumberger、Philips等十几家公司相继投入了智能卡芯片和卡片成品的开发与生产,形成了一个世界性的新兴技术产业。

当前,用于信息处理的卡片种类繁多,而且基本上都采用了较新的技术,IC卡脱颖而出的原因在于它对于磁卡、PET卡、光卡和凸字卡等其它种类的卡具有存储容量大、体积小、重量轻,抗干扰能力强,便于携带、安全性高、对网络的要求不高等突出的特点,正是由于这些特点,使得IC卡从诞生至今虽然只有短短数年,但其市场却遍布世界各地。在全球智能卡蓬勃发展之际,中国于1993年提出了“金卡工程”。金卡工程是以电子货币应用为重点的各类卡基应用系统工程,是为了实现电子货币大范围流通的跨部门、跨地区和跨世纪的系统工程。在“金卡工程”提出至今10年来,我国IC卡应用发展迅猛,累计发卡约10亿张,据不完全统计,仅2015年一年,我国发行使用各类IC卡约3.5亿张左右。IC卡目前已在商贸、交通、电信、医疗、卫生保健、社会保险、金融、税务、工商、公安、组织机构代码和城市公共事业管理等许多领域得到广泛应用,并取得了初步的社会和经济效益。它对提高现代化管理水平和人民的生活质量,推动整个社会信息化进程具有重要作用。本发明正是在这种环境下提出的。

本发明涉及一种非接触式IC卡读卡器设计,本发明开发了一种读写距离为25MM的非接触式IC卡读卡器,本发明详细地阐述了非接触式IC卡读卡器的硬件和软件设计,给出了每一部分的实际电路图和应用程序。读卡器的硬件设计包括电源供应电路、蜂鸣器驱动电路、RS232通信电路、MCU的连接、MFRC500接口电路和读卡器天线这几部分的设计。软件设计分为对MFRC500的应用程序的设计、对读卡器其他电路的应用程序设计和主程序设计三个部分,每一部分都给出了具体程序并对程序进行了详细的说明。本发明具有典型读写距离为20~25MM、配有RS232通讯接口,便于同上位机通讯、专为门禁系统设计、小巧,价格便宜等特点。

图1:非接触式IC卡读卡器结构框图。

图2:MAX232的电路连接图。

图3:电源供应电路图。

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

图5:读卡器主程序框图。

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明涉及一种非接触式IC卡读卡器设计,本发明开发了一种读写距离为25MM的非接触式IC卡读卡器,本发明详细地阐述了非接触式IC卡读卡器的硬件和软件设计,给出了每一部分的实际电路图和应用程序。读卡器的硬件设计包括电源供应电路、蜂鸣器驱动电路、RS232通信电路、MCU的连接、MFRC500接口电路和读卡器天线这几部分的设计。软件设计分为对MFRC500的应用程序的设计、对读卡器其他电路的应用程序设计和主程序设计三个部分,每一部分都给出了具体程序并对程序进行了详细的说明。本发明具有典型读写距离为20~25MM、配有RS232通讯接口,便于同上位机通讯、专为门禁系统设计、小巧,价格便宜等特点。

图1为本发明的非接触式IC卡读卡器结构框图。非接触式IC卡读卡器硬件电路包括以下几个部分:微控制器、MIFARE读写芯片、天线匹配电路、天线、RS232通信电路、复位电路、电源电路、LED状态显示和蜂鸣器驱动电路等,分布于两块电路板上,即控制电路板和天线电路板。

本发明CPU采用8位微处理器中选取了ATMEL公司生产的AT89C51(其指令与MCS51系列兼容)。所使用的仿真器为南京WAVE公司生产的G6W型,该仿真器支持汇编语言、C51高级语言、PL/M语言。编程器为TOP2000型编程器。

本发明读卡器采用串行接口芯片MAX232通过标准的DB9直接与PC机相连。MAX232是XIM公司生产的专用串行接口芯片,包括2路接收器和驱动器,本发明只用其中一路发器。芯片内部有一个电源电压变换器可把输入的+5V电源电压变换为RS232输出电所需的±10V电压。所以使用此接口芯片的串行通信系统只需单一的+5V电在本发明中硬件上采用3线制(RXD、TXD、GND)软握手的零MODEM方式,即PC机和单片机的发送数据线(TXD)与接收数据(RXD)交叉连接,二者的地线(GND)接相连,而其它信号线如握手信号线均不用,而采用软件握手。MAX232的电路连接如图2所示。

本发明读卡器内所有芯片的工作电压均为5V,读卡器采用外接电源供电,220V市电经变压器降压,再经稳压电路稳压成5V后供应读卡器内芯片。本读卡器选用7805芯片进行稳压,电路图如图3所示。

本发明电感藕合式射频识别系统的读写器天线用于产生磁通量,而磁通量用于向非接触式IC卡提供电源并在读卡器与非接触式IC卡之间传输信息。因此,对读卡器天线的构造就有三个基本要求:首先是使天线线圈的电流最大,用于产生最大的磁通量:其次是功率要匹配,以最大程度地利用产生磁通量的可用能量;最后是要有足够的带宽,以无失真地传送用数据调制的载波信号。

本发明软件设计分为三部分,即对MFRC500的应用程序的设计、对读卡器其他电路的应用程序设计和主程序设计。对MFRC500的应用程序的设计既是对MFCM200操作指令的程序设计;对读卡器的其他电路的应用程序的设计包括LED状态显示程序设计、蜂鸣器程序设计和RS232通信程序设计。

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

本发明读卡器主程序框图如图5所示。

要让蜂鸣器发出声音,必须要让晶体管不断ON/OFF交互变化,即P2.3不断的输出“1”电位和“0”电位,如果P2.3输出一直是“1”电位或一直是“0电位,则蜂鸣器将无法发出声音。程序设计除了要让蜂鸣器能够发出声音之外还要让蜂鸣器能够连续发出不同音长及音调的声音,使蜂鸣器能够基于不同功能发出不同的报警信号。蜂鸣器驱动子程序如下:

初始化寄存器程序:

registerwrite(RegClockQControl,0x0);//设置时钟控制初始值

register_write(RegClockQControl,Ox40);

registerwrite(RegTxControl,0x58);//设置发送控制初始值

register_write(RegRxControll,0x73);

registerwrite(RegDeeoderControl,Ox08);//设置译码控制初始值

register_write(RegBitPhase,0xAD);//初始化位相

register_write(RegRxTl'treshold,0xFF);//初始化最小阀值

register write@egRxControl2,OxOD;//根据运行环境的处理速率可调整该值

register_write(ReIFOLevel,OxOS);//初始化FIFO缓存

register_write(RegTimerClock,Ox07);//定时器初始值装载

register_write(RegTimerReload,0xoa);

询问程序:

unsigned char Mf500PiccCommonRequest(int req_code,int+atq)

{

regwrite(RegInterruptEn.0xTV);//禁止所有中断

regwritefRegInterruptRq.0x7F);//使能request中断

regwrite(RegCommand.PCD_IDLE);//中止可能正在运行的其它程序

regwrite(RegControl,regread(RegContr01)I Ox01);//清空FIFO

regwrite(RegFIFOData,req_eode);//写入request命令代码

regwrite(RegCommand.PCD"IRANSCEIVE);//命令开始执行

regwrite(RegInterruptEn,0x7F);//禁止所有中断

regwrite(RegInterruptRq.0x7F);//使能request中断

mrc500_cnt---Ox00;

while((!(regread(RegPrimaryStatus)&0x08))&&(mrc500_cnt<50))

{mrc500_cm+=l;}//等待命令执行完或超时退出

if(mrc500_ent>40)//mrc500 timeout(about 18ms)

{

regwrite(RegCommand,OxOO);//中止程序

status=MI_ACCESsTIMEOUt

return status;

}

status=regread(RegErrorFlag)&0x07;//读取错误标志

if(status)

{

if(status&0x01)

status=MI._COLLERR;//判断为冲突检测错误

if(status&0x02)

status=MI PARITYERR;//判断为校验错误

if(status&Ox04)

status=MLFRAM玳GERR;//判断为帧错误

}

else

{

if(tegread(RegFIFOLength)==0x02)//判断接收到的数据长度

{

stams=MI_OK:

atq[O]=regread(RegFIFOData);//读取ATQ

atq[11=regread(RegFIFOData);

}

else

status=MI_BITCOUNTERR;

{

regwritefRegCommand,PCD_IDLE);//程序终止

return status;

}

unsigned char M500PiccCascAnticoll(unsigncd char bent,unsigned char+snr)

{

unsigned char complete=0:

unsigned char status=MLoK;

complete=0:

while((complete==0)&&(status==MI_OK))

{

nBytesReceived=0;

/*P禁止RxCRC和TxCRC,校验使能*/

regwrite(RegChannelRedundancy,Ox03);

nbits=bent%8;//位个数

if(nbits)

{

regwrite(RegBitFraming,nbits<《4 I nbits);

nbytes=bent/8+1;//字节个数

}

elsenbytes=bent:

for(i=0;i

snr in[i]=coll_data[i];

NVB=0x20+((bent/8)<<4|nbits;//要发送的字节数

regwrite(RegInterruptEn,0x70;//禁止所有中断

regwrite(RegInterruptRq,Ox7F);//复位request中断

regwrite(RegCommand,PCD_IDLE);//中止可能正在运行的程序

regwrite(RegControl,regread(RegContr01)10x01);//清空FIFO

regwrite(RegFIFOData,0x93);//写入”SEL”命令代码

regwrite(RegFIFOData,NVB);//写入”NVB”命令代码

for(i=0;i

regwrite(RegFlFOData,snr_in[i]);

regwrite(RegInterruptEn.0x84);//TimerIRq和IdlelRq使能

regwrite(RegCommand,PCD_TRANSCEIVE);//命令开始执行

mrc500_cnt=Ox00;

while((t(regread(RegPfimaryStatus)&0x08))&&(mrc500_cnt<200))

{mrc500_cnt+=l;)//超时或命令结束判断

if(mrc500 cnt>15)//超时判断

{

regwrite(RegCommand,PCD IDI E);//中止程序

status=MI_ACCFSTIMEOUT;

return status;

}

status=regread(RegErrorFlag)&Ox07;//读取错误标志

nBytesReceived=regread(RegFIFOLength);//读取数据长度

for(i=0;i

if(rcgread(RegFIFOLength)>=Ox04);//判断接收的数据长度是否正确

{

for(status--O;status<4;status++)

SIII'_]’n[status]=regread(RegFIFOData);

status=MLOK;

}

……}

if(status==MI—OK)

{

memcpy(snr,snr_in,4);//保存Slit

}

else

memcpy(snr,0000,4);

/*冲突禁止后置0*/

regwrite(RegDecoderControl,regread(RegDecoderContr01)&(0x20));

regwrite(RegCommand,PCD_IDI E);//中止程序

return

status;

}

选择卡片程序:

unsigned char Mf500PiccCaseSeleet(int snrI])

{

regwrite(RegInterruptEn,0x7F);//禁止所有中断

regwrite(RegInterruptRq,0x7F);//复位request中断

regwrite(RegCommand,PCD roLE);//中止可能正在运行的其它程序

regwrite(RegControl,regread(RegContr01)1 0x01);//清空FIFO

regwrite(RegFIFOData,Ox93);//写入”SEL”命令代码

regwrite(RegFIFOData,OxTO);//写入”NVB”命令代码

for(status=O;status<4;status++)

regwrite(RegFIFOData,snr[status]);//写Sill"到FIFO

status=snr[0]“snr[1]“snr[2]“snr[3];//计算BCC

regwrite(RegFIFOData,status);//将BCC写入FIFO

regwrite(RegInterruptEn,0xA4);//使能TimerlRq和IdlelRq

regwrite(RegCommand,PCD_TRANSCEIVE);//命令开始执行

mrc500_cnt=0x00;

while((!(regread(RegPfimaryStatus)&Ox08))&&(mrc500_cnt<110))

{mrc500_cnt+=1;}//超时或命令结束判断

if(mrc500_cnt>100)//超时判断

{

regwrite(RegCommand,PCD_IDLE);//中止程序

status=MIACCESSTIMEOUT.//置超时标志

return status;

}

status=regread(RegErrorFlag)&Ox07;//读取错误标志

if(status)

{

if(status&Ox01)

status=MI_COLLERR;//1判断为冲突检测错误

else if(status&0x02)

status=MI_PARITYERR;//判断为校验错误

else if(status&Ox04)

status=MI_FRAMINGERR;//判断为帧错误

}

else

{

if(regread(RegFIFOLength)==0x01)//判断接收数据长度是否正确

{

if(regread(RegFIFOData)&ox04)

status=MI_SAKERR;//判断为SAK错误

else status=MI-OK;

}

else

status=MI_BITCOUNTERR;//数据长度不符合则为计数错误

}

regwrite(RegCommand,PCD_IDLE);//程序终止

returns

tatus;

}

认证程序:

unsigned char M500PiceLoadKey(unsigned char key[])

{

regwrite(RegInterruptEn.0x7F);//禁止所有中断

regwrite(RegInterruptRq,0x7F);//复位request中断

regwrite(RegCommand.PCD_IDLE);//中止可能正在运行的其它

regwrite(RegControl,regread(RegContr01)l Ox01);//清空FIFO

for(status=0;status<12;status++)

regwrite(RegFIFOData.key[status]);//写入key到FIFO

regwrite(RegInterruptEn,0x84);//使能IdlelRq中断

regwrite(RegCommand.PCD_LDADKEY);//写入loadkey命令

do

{

status=(regread(RegErrorFlag)&Ox40);

}

while((!(regread(RegPfimaryStatus)&0X08)));//等待命令执行完毕

if(status)

status=Ml_WRONG_LOAD_MODE;//判断错误类型

else

status=MI_OK;

regwrite(RegCommand,PCD_IDLE);//程序终止

returns

tatus;

PiccRead()函数主要代码:

unsigned char PiccRead(unsigned char block_add,unsigned char value[])

{

regwrite(RegInterruptEn,01710;//禁止所有中断

regwrite(RegInterruptRq,0x7v3;//复位request中断

regwrite(RegCommand,PCD_IDLE);//中止可能『F在运行的其它程序

regwrite(RegControl,regread(RegControl|0x01);//清空FIFO

regwrite(RegFIFOData,PICC_READ);//写入read命令

regwrite(RegFIFOData,block_add);//写入block_add参数

regwriteCRegInterruptEn,0x84);//使能IdlelRq中断

regwrite(RegCommand,PCD_TRANSCEIVE);//写入命令代码

mrc500_cnt=0;

while((!(regread(RegPrimaryStatus)&0x08))&&(mrc500_cnt<300))

{mrc500_cnt+=l;}//超时或命令结束判断

if(mrc500 cnt>200)

{

regwrite(RegCommand,PCD_IDLE);//超时判断

status=MI ACCESSTIMEOUT;

retum

status;

}

status=regread(RegErrorFlag)&010e;//读取错误标志

if(status)

{

if(status&0x02)

status=MI PARITYERR; else if(status&0x04), //判断为校验错误

status z

MI_FRAMINGERR;//判断为帧错误

else if(status&0,08)

status=MI_CRCERR;//判断为CRC错误

}

else

{

if(rcgread(RegFIFOLength)==16)//判断所接收到的数据长度是否正确

{

for(status=0;status<16;status++)

value[status]=regread(RegFIFOData);//读取一个BLOCK中的16个字节

status=Ml-OK;

)

else

status=MI_BITCOUNTERR;//数据长度不符合则为计数错误

}

regwrite(RegCommand,PCD_IDLE);//程序终止

return status;

}

蜂鸣器驱动子程序:

参数说明:

count:发出声音的个数

sounglong:音长,声音的长短

tone:音调,声音的高低,以KHz为单位

void beep(unsigned char count,unsigned char soundlong,unsigned char tone)

{

uchar idata i,j,k,spfreg;

spfreg=(1000/tone)/2;//方波的半周期转换方式,以KHz为单位

for(i=0;i

{

for(j=0;j

{

for(k=0;k

P2_2=0;

for(k=0;k

P2_2=1;

}

delay_50us(2000);//每发出一个声音延迟100ms

}

}

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

本文发布于:2024-09-23 08:23:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/72623.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议