搜档网
当前位置:搜档网 › STM8 RC522 读写IC卡程序

STM8 RC522 读写IC卡程序

STM8 RC522 读写IC卡程序
STM8 RC522 读写IC卡程序

#include "stm8s.h"

#include "uart.h"

void Delay(u32 nCount);

extern u8 RxBuffer[RxBufferSize];

extern u8 UART_RX_NUM;

unsigned char CT[2];//卡类型

unsigned char SN[4]; //卡号

unsigned char write[16] =

{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10}; unsigned char read[16] =

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char key[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

#define countof(a) (sizeof(a) / sizeof(*(a)))

#define BufferSize (countof(Tx_Buffer)-1)

u8 Tx_Buffer[] = "STM8S RFID TEST";

u8 Rx_Buffer[BufferSize];

u32 FLASH_ID ;

void cardNo2String(u8 *cardNo, u8 *str);

void main(void)

{

unsigned char status;

/*设置内部时钟16M为主时钟*/

CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

status = memcmp(read,write,16);

GPIO_DeInit(GPIOA);

GPIO_DeInit(GPIOC);

Uart_Init();

GPIO_Init( GPIOA, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);

InitRc522();

UART2_SendString(Tx_Buffer,BufferSize);

while(1)

{

status = PcdRequest(PICC_REQALL,CT); /*扫描卡*/

status = PcdAnticoll(SN); /*防冲撞*/

if (status==MI_OK)

{

GPIO_LOW(GPIOA, GPIO_PIN_4); //寻卡成功

UART2_SendString(Tx_Buffer, 17);

Reset_RC522();

}

else

{

GPIO_HIGH(GPIOA, GPIO_PIN_4);

}

}

}

void Delay(u32 nCount)

{

while (nCount != 0)

{

nCount--;

}

}

void Hex2String(u8 hex,u8 *str)

{

str[0] = (hex / 100) + '0';

str[1] = (hex % 100 / 10) + '0';

str[2] = (hex % 10) + '0';

}

void cardNo2String(u8 *cardNo, u8 *str)

{

u8 Count = 0;

for(Count = 0; Count < 4; Count++)

{

Hex2String(cardNo[Count], str + Count * 4);

if(Count == 3)

{

str[15] = '\n';

}

else

{

str[Count * 4 + 3] = ':';

}

}

}

void delay_ns(u32 ns)

for(i=0;i

{

asm("nop");

asm("nop");

asm("nop");

}

}

u8 SPIWriteByte(u8 Byte)

{

u8 tmp;

while (SPI_GetFlagStatus( SPI_FLAG_TXE) == RESET);

SPI_SendData(Byte);

if (SPI_GetFlagStatus(SPI_FLAG_RXNE))

{

tmp = SPI_ReceiveData();

}

return tmp;

}

void SPI2_Init(void)

{

SPI_DeInit();

SPI_Init(

SPI_FIRSTBIT_MSB, //帧模式,先发送MSB还是LSB

SPI_BAUDRATEPRESCALER_8, //波特率分频值

SPI_MODE_MASTER, //模式,主从模式

SPI_CLOCKPOLARITY_LOW, //时钟极性,空闲时SCK为高/空闲时SCK为低

SPI_CLOCKPHASE_1EDGE, //数据采样的边沿选择

SPI_DATADIRECTION_2LINES_FULLDUPLEX, //双线单向数据模式,使用C6/C7两条线,数据传输方向位单向

SPI_NSS_SOFT, //软件从设备

0x07);

SPI_Cmd(ENABLE);

}

void InitRc522(void)

{

SPI2_Init();

PcdReset();

PcdAntennaOff();

PcdAntennaOn();

M500PcdConfigISOType( 'A' );

}

{

PcdReset();

PcdAntennaOff();

PcdAntennaOn();

}

/////////////////////////////////////////////////////////////////////

//功能:寻卡

//参数说明: req_code[IN]:寻卡方式

// 0x52 = 寻感应区内所有符合14443A标准的卡

// 0x26 = 寻未进入休眠状态的卡

// pTagType[OUT]:卡片类型代码

// 0x4400 = Mifare_UltraLight

// 0x0400 = Mifare_One(S50)

// 0x0200 = Mifare_One(S70)

// 0x0800 = Mifare_Pro(X)

// 0x4403 = Mifare_DESFire

//返回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdRequest(u8 req_code,u8 *pTagType)

{

char status;

u8 unLen;

u8 ucComMF522Buf[MAXRLEN];

ClearBitMask(Status2Reg,0x08);

WriteRawRC(BitFramingReg,0x07);

SetBitMask(TxControlReg,0x03);

ucComMF522Buf[0] = req_code;

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

if ((status == MI_OK) && (unLen == 0x10))

{

*pTagType = ucComMF522Buf[0];

*(pTagType+1) = ucComMF522Buf[1];

}

else

{ status = MI_ERR; }

return status;

}

/////////////////////////////////////////////////////////////////////

//功能:防冲撞

//参数说明: pSnr[OUT]:卡片序列号,4字节

char PcdAnticoll(u8 *pSnr)

{

char status;

u8 i,snr_check=0;

u8 unLen;

u8 ucComMF522Buf[MAXRLEN];

ClearBitMask(Status2Reg,0x08);

WriteRawRC(BitFramingReg,0x00);

ClearBitMask(CollReg,0x80);

ucComMF522Buf[0] = PICC_ANTICOLL1;

ucComMF522Buf[1] = 0x20;

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

if (status == MI_OK)

{

for (i=0; i<4; i++)

{

*(pSnr+i) = ucComMF522Buf[i];

snr_check ^= ucComMF522Buf[i];

}

if (snr_check != ucComMF522Buf[i])

{ status = MI_ERR; }

}

SetBitMask(CollReg,0x80);

return status;

}

/////////////////////////////////////////////////////////////////////

//功能:选定卡片

//参数说明: pSnr[IN]:卡片序列号,4字节

//返回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdSelect(u8 *pSnr)

{

char status;

u8 i;

u8 unLen;

u8 ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_ANTICOLL1;

ucComMF522Buf[1] = 0x70;

ucComMF522Buf[6] = 0;

ucComMF522Buf[i+2] = *(pSnr+i);

ucComMF522Buf[6] ^= *(pSnr+i);

}

CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);

ClearBitMask(Status2Reg,0x08);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);

if ((status == MI_OK) && (unLen == 0x18))

{ status = MI_OK; }

else

{ status = MI_ERR; }

return status;

}

/////////////////////////////////////////////////////////////////////

//功能:验证卡片密码

//参数说明: auth_mode[IN]: 密码验证模式

// 0x60 = 验证A密钥

// 0x61 = 验证B密钥

// addr[IN]:块地址

// pKey[IN]:密码

// pSnr[IN]:卡片序列号,4字节

//返回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr)

{

char status;

u8 unLen;

u8 ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = auth_mode;

ucComMF522Buf[1] = addr;

memcpy(&ucComMF522Buf[2], pKey, 6);

memcpy(&ucComMF522Buf[8], pSnr, 4);

status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))

{ status = MI_ERR; }

return status;

}

/////////////////////////////////////////////////////////////////////

//功能:读取M1卡一块数据

//参数说明: addr[IN]:块地址

// p [OUT]:读出的数据,16字节

//返回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char status;

u8 unLen;

u8 i,ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_READ;

ucComMF522Buf[1] = addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if ((status == MI_OK) && (unLen == 0x90))

{

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

{ *(p +i) = ucComMF522Buf[i]; }

}

else

{ status = MI_ERR; }

return status;

}

/////////////////////////////////////////////////////////////////////

//功能:写数据到M1卡一块

//参数说明: addr[IN]:块地址

// p [IN]:写入的数据,16字节

//返回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdWrite(u8 addr,u8 *p )

{

char status;

u8 unLen;

u8 i,ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_WRITE;

ucComMF522Buf[1] = addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))

{ status = MI_ERR; }

if (status == MI_OK)

{

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

{

ucComMF522Buf[i] = *(p +i);

}

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))

{ status = MI_ERR; }

}

return status;

}

/////////////////////////////////////////////////////////////////////

//功能:命令卡片进入休眠状态

//返回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdHalt(void)

{

u8 status;

u8 unLen;

u8 ucComMF522Buf[MAXRLEN];

ucComMF522Buf[0] = PICC_HALT;

ucComMF522Buf[1] = 0;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

return MI_OK;

}

/////////////////////////////////////////////////////////////////////

//用MF522计算CRC16函数

/////////////////////////////////////////////////////////////////////

void CalulateCRC(u8 *pIn ,u8 len,u8 *pOut )

{

u8 i,n;

ClearBitMask(DivIrqReg,0x04);

WriteRawRC(CommandReg,PCD_IDLE);

SetBitMask(FIFOLevelReg,0x80);

for (i=0; i

{ WriteRawRC(FIFODataReg, *(pIn +i)); }

WriteRawRC(CommandReg, PCD_CALCCRC);

i = 0xFF;

do

{

n = ReadRawRC(DivIrqReg);

i--;

}

while ((i!=0) && !(n&0x04));

pOut [0] = ReadRawRC(CRCResultRegL);

/////////////////////////////////////////////////////////////////////

//功能:复位RC522

//返回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdReset(void)

{

GPIO_HIGH(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);

delay_ns(10);

GPIO_LOW(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);

delay_ns(10);

GPIO_HIGH(RC522RST_GPIO_PORT,RC522RST_GPIO_PIN);

delay_ns(10);

WriteRawRC(CommandReg,PCD_RESETPHASE);

delay_ns(10);

WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30);

WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E);

WriteRawRC(TxAutoReg,0x40);//必须要

return MI_OK;

}

//////////////////////////////////////////////////////////////////////

//设置RC632的工作方式

//////////////////////////////////////////////////////////////////////

char M500PcdConfigISOType(u8 type)

{

if (type == 'A') //ISO14443_A

{

ClearBitMask(Status2Reg,0x08);

WriteRawRC(ModeReg,0x3D);

WriteRawRC(RxSelReg,0x86);

WriteRawRC(RFCfgReg,0x7F);

WriteRawRC(TReloadRegL,30);

WriteRawRC(TReloadRegH,0);

WriteRawRC(TModeReg,0x8D);

WriteRawRC(TPrescalerReg,0x3E);

delay_ns(1000);

else

{

return 1;

}

return MI_OK;

}

/////////////////////////////////////////////////////////////////////

//功能:读RC632寄存器

//参数说明:Address[IN]:寄存器地址

//返回:读出的值

/////////////////////////////////////////////////////////////////////

u8 ReadRawRC(u8 Address)

{

u8 ucAddr;

u8 ucResult=0;

GPIO_LOW(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);

ucAddr = ((Address<<1)&0x7E)|0x80;

SPIWriteByte(ucAddr);

ucResult=SPIReadByte();

GPIO_HIGH(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);

return ucResult;

}

/////////////////////////////////////////////////////////////////////

//功能:写RC632寄存器

//参数说明:Address[IN]:寄存器地址

// value[IN]:写入的值

/////////////////////////////////////////////////////////////////////

void WriteRawRC(u8 Address, u8 value)

{

u8 ucAddr;

GPIO_LOW(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);

ucAddr = ((Address<<1)&0x7E);

SPIWriteByte(ucAddr);

SPIWriteByte(value);

GPIO_HIGH(RC522NSS_GPIO_PORT,RC522NSS_GPIO_PIN);

}

/////////////////////////////////////////////////////////////////////

//功能:置RC522寄存器位

//参数说明:reg[IN]:寄存器地址

// mask[IN]:置位值

{

char tmp = 0x0;

tmp = ReadRawRC(reg);

WriteRawRC(reg,tmp | mask); // set bit mask

}

/////////////////////////////////////////////////////////////////////

//功能:清RC522寄存器位

//参数说明:reg[IN]:寄存器地址

// mask[IN]:清位值

/////////////////////////////////////////////////////////////////////

void ClearBitMask(u8 reg,u8 mask)

{

char tmp = 0x0;

tmp = ReadRawRC(reg);

WriteRawRC(reg, tmp & ~mask); // clear bit mask }

/////////////////////////////////////////////////////////////////////

//功能:通过RC522和ISO14443卡通讯

//参数说明:Command[IN]:RC522命令字

// pIn [IN]:通过RC522发送到卡片的数据// InLenByte[IN]:发送数据的字节长度

// pOut [OUT]:接收到的卡片返回数据

// *pOutLenBit[OUT]:返回数据的位长度

/////////////////////////////////////////////////////////////////////

char PcdComMF522(u8 Command,

u8 *pIn ,

u8 InLenByte,

u8 *pOut ,

u8 *pOutLenBit)

{

char status = MI_ERR;

u8 irqEn = 0x00;

u8 waitFor = 0x00;

u8 lastBits;

u8 n;

u16 i;

switch (Command)

{

case PCD_AUTHENT:

irqEn = 0x12;

waitFor = 0x10;

break;

case PCD_TRANSCEIVE:

irqEn = 0x77;

waitFor = 0x30;

break;

}

WriteRawRC(ComIEnReg,irqEn|0x80);

ClearBitMask(ComIrqReg,0x80); //清所有中断位

WriteRawRC(CommandReg,PCD_IDLE);

SetBitMask(FIFOLevelReg,0x80); //清FIFO缓存

for (i=0; i

{

WriteRawRC(FIFODataReg, pIn [i]);

}

WriteRawRC(CommandReg, Command);

// n = ReadRawRC(CommandReg);

if (Command == PCD_TRANSCEIVE)

{

SetBitMask(BitFramingReg,0x80); //开始传送

}

//i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms

i = 10000;

do

{

n = ReadRawRC(ComIrqReg);

i--;

}

while ((i!=0) && !(n&0x01) && !(n&waitFor));

ClearBitMask(BitFramingReg,0x80);

if (i!=0)

{

if(!(ReadRawRC(ErrorReg)&0x1B))

{

status = MI_OK;

if (n & irqEn & 0x01)

{

status = MI_NOTAGERR;

}

if (Command == PCD_TRANSCEIVE)

{

n = ReadRawRC(FIFOLevelReg);

lastBits = ReadRawRC(ControlReg) & 0x07;

if (lastBits)

{

*pOutLenBit = (n-1)*8 + lastBits;

}

*pOutLenBit = n*8;

}

if (n == 0)

{

n = 1;

}

if (n > MAXRLEN)

{

n = MAXRLEN;

}

for (i=0; i

{

pOut[i] = ReadRawRC(FIFODataReg);

}

}

}

else

{

status = MI_ERR;

}

}

SetBitMask(ControlReg,0x80); // stop timer now WriteRawRC(CommandReg,PCD_IDLE);

return status;

}

/////////////////////////////////////////////////////////////////////

//开启天线

//每次启动或关闭天险发射之间应至少有1ms的间隔

/////////////////////////////////////////////////////////////////////

void PcdAntennaOn(void)

{

u8 i;

i = ReadRawRC(TxControlReg);

if (!(i & 0x03))

{

SetBitMask(TxControlReg, 0x03);

}

}

/////////////////////////////////////////////////////////////////////

//关闭天线

/////////////////////////////////////////////////////////////////////

ClearBitMask(TxControlReg, 0x03);

}

/////////////////////////////////////////////////////////////////////

//功能:扣款和充值

//参数说明: dd_mode[IN]:命令字

// 0xC0 = 扣款

// 0xC1 = 充值

// addr[IN]:钱包地址

// pValue[IN]:4字节增(减)值,低位在前

//返回: 成功返回MI_OK

/////////////////////////////////////////////////////////////////////

char PcdValue(u8 dd_mode,u8 addr,u8 *pValue)

{

char status;

u8 unLen;

u8 ucComMF522Buf[MAXRLEN];

//u8 i;

ucComMF522Buf[0] = dd_mode;

ucComMF522Buf[1] = addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))

{

status = MI_ERR;

}

if (status == MI_OK)

{

memcpy(ucComMF522Buf, pValue, 4);

//for (i=0; i<16; i++)

//{ ucComMF522Buf[i] = *(pValue+i); }

CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

unLen = 0;

status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);

if (status != MI_ERR)

{ status = MI_OK; }

}

if (status == MI_OK)

{

ucComMF522Buf[0] = PICC_TRANSFER;

ucComMF522Buf[1] = addr;

CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))

{ status = MI_ERR; }

}

return status;

}

基于RC522的非接触式IC卡读卡器设计(含程序)

1 绪论 1.1 课题的研究背景 工业3.0将世界带入信息化的时代,信息技术的发展日新月异,一个以电子商务为主要特征的经济时代成为主要潮流,智能射频卡是一种将用户数据最快捷地送入到环球信息互联网并获得信息的最有用的工具,智能IC卡成为了人们身份识别和实现电子支付的手段,影响了我们生活工作的方式。智能IC卡与普通磁卡对比具有更高的安全性,所以,对智能IC卡的功能进行研究是非常有意义的。 智能IC卡,又是CPU卡。顾名思义, 这种卡片上集成了存储器、通信接口及CPU,具有存储数据、对外交流和数据处理的能力,因此,又是一片卡上的单片机系统。为了使这一系统中的硬件和软件资源充分得到利用, 卡上存放了进行数据读写和安全通信的协议,以及管理这些程序的Chip Operating system卡上操作系统。这操作系统是按照IC卡性能特征而专门设计的操作系统,它极大地不同于计算机上常见的DOS和WINDOWS 等操作系统,IC 卡存储器的容量大小和CPU的性能的限制着Chip Operating system卡上操作系统。主要功能是:控制IC卡与读卡器的数据交流;管理IC卡上各种存储器;在IC卡内执行读写器发来的各种操作命令。有了CPU与COS系统,成就了智能IC卡。所以,智能射频卡具有超强的管理性能,提供很高的数据安全性和可靠性[1]。 1.2 非接触式IC卡 1.2.1 非接触式IC卡的简介 非接触式IC卡又称射频卡,由IC芯片、感应天线组成,封装在一个标准的PVC卡片内,芯片及天线无外露部分[2]。它是全球上最近发展成熟的一项技术,射频识别技术和IC卡技术被成功地结合起来,解决了无源和非接触这一难题,无源即卡中没有电源,这是电子科学领域的一大突破[2]。卡片接近读写器天线产生电磁场的一定空间范围 (通常为50—100mm),通过电磁波的发送来完成数据的读写操作。 1.2.2 非接触式IC卡的特点 (1)操作快捷 卡与读卡器之间的通讯是非接触的。不用定向使用和插拔卡。操作时,卡也可

在C51单片机上对读写卡芯片MFRC522编程

在C51单片机上对读写卡芯片MFRC522编程 1 概述 在整个的射频识别系统中。读写卡模块负责建立单片机与电子标签之间的通信,起着非常重要的作用。而整个读写卡模块的核心,就是读写卡芯片MFRC522 MFRC522 是NXP 公司专为各种计量检测设备而设计、推出的一款低成本、低功耗的非接触式读写卡芯片。该芯片应用于13.56MHz 非接触通信,应用了较为先进的调制和解调概念,集成了众多的通信方式和协议,其内部强大的电路可直接驱动天线无需其他外接电路,通过其独特的加密算法,更使其具备可较强的安全性。 作为一款较为成功的读写卡芯片,MFRC522与主机间的通信采用的是连线较少的串行通信,而且可根据不同的用户需求,从SPI、I2C、串行UART三种总线模式中选择,这样的设计有利于减少连线数量,缩小PCB 板体积,降低成本。 目前MFRC522在很多的领域都得到了广泛应用,尤其适用于低成本、小尺寸、低功耗和单电源的非接触式通信的应用场合,是智能仪表、板上单元、便携式手持设备的极佳选择。目前,全国各大城市的公共交通终端以及非接触式公用电话应用的正是MFRC522

2 特性 1. 高度集成的模拟电路模块,应用新概念完成调制和解调。 2. 支持ISO 14443A与MIFARE通信协议 3. 驱动优化,采用少量外部器件就能输出驱动级到天线 4. 支持MIFARE的加密算法 5. 可自由选择多样的主机接口: ①10Mbit/s的SPI接口 ②I2C接口,快速传输模式的速率为400kbit/s, 高速模式的速率为3400kbit/s ③串行UART,传输速率高达1228.8kbit/s,帧取决于RS232接口,电 压电平取决于提供的管脚电压 6. 灵活的中断模式 7. 64字节的发送接收缓冲区 8. 具备软件掉电、硬件掉电和发送器掉电三种低功耗模式,能够通过关闭 相应的模块或驱动器达到节电的目的。 9. 2.5~3.3V的低电源电压,低功耗设计 10. 内部振荡器,链接27.12HZ的晶体 11.可编程定时器 12.自由编程的I/O管脚 13.内置温度传感器,当芯片温度过高时会自动停止射频信号的发射 14. 体积小,仅有5mm╳5mm╳0.85mm 3 系统结构

IC卡读写

IC卡应用 IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。因此在各个领域中得到广泛应用。下面通过两个实例介绍IC 卡的简单应用。 实例422 向IC卡中写入数据 实例说明 IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。下面介绍如何向IC 卡中写入数据。运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。如图所示。 技术要点 本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。 本例通过调用链接库,进行IC卡的读写工作。下面介绍与IC卡写操作相关的几个函数。 (1)auto_init函数 该函数用于初始化IC卡读卡器。语法如下: public static extern int auto_init(int port, int baud); 参数说明如下。 l port:标识端口号,Com1对应的端口号为0;Com2对应的端口号为1,依此类推。 l baud:标识波特率。 l 返回值:如果初始化成功,返回值是IC卡设备句柄;如果初始化失败,返回值小于零。

(2)setsc_md函数 该函数用于设置设备密码模式。语法如下: public static extern int setsc_md(int icdev, int mode); 参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。 l mode:标识设备密码模式,如果为0,设备密码有效,设备在加电时必须验证设备密码才能对设备进行操作。如果为1,设备密码无效。 l 返回值:如果函数执行成功返回值为零,否则小于零。 (3)get_status函数 该函数用于获取设备的当前状态。语法如下: public static extern Int16 get_status(int icdev, Int16* state); 参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。 l state:用于接收函数返回的结果。如果为0表示读卡器中无卡,为1表示读卡器中有卡。 l 返回值:如果函数执行成功返回值为零,否则小于零。 (4)csc_4442函数 该函数用于核对IC卡密码。语法如下: public static extern Int16 Csc_4442(int icdev, int len, [MarshalAs] byte[] p_string); 参数说明如下。 l icdev:标识设备句柄,通常是auto_init函数的返回值。

非接触IC卡读写器Demo程序使用说明

非接触IC 卡读写器Demo 程序使用指南 1. 概述 DEMO 程序是用户使用RF 系列读写器时随机配备的一个演示测试程序,通过它用户可以了解设备功能和卡片的性能。在操作DEMO 程序时关于各个指令的详尽说明请参看用户使用手册。下面仅列出DEMO 程序的功能说明。 2. 功能 2.1 设备操作 1. 当你按下“设备操作”按钮时,在产品信息栏里将显示出API 函数的版本号。如果正确连接了设备,同时还会显示出硬件版本号和产品序列号。 2. 如果连接读写器成功,按下“设备操作”按钮时,DEMO 程序将按照你上次连接成功的串口和波特率来连接设备。如果你这是第一次使用读写器,初始化串口和波特率是 COM 1 和 115200 bps ,这是我们设备出厂时的缺省设定。在端口设置信息栏里也可以自己123 4 5

设定串口和波特率,然后点击“连接”按钮。如果想断掉读写器,释放串口,就点击“断开连接”按钮。 3. 当按下“执行鸣响”按钮时,读写器将按照“鸣响时间”里设定的值来鸣叫。“鸣响时间”的值越大,读写器鸣叫的时间越长,反之亦然。. 4. 选择要操作的卡片类型。 5. RF500系列读写器配有8位数码管显示。可以根据自己的需要设置“计算机控制”和读写器控制。 如果选择了“计算机控制”,请在文本框里输入8位字符串(16进制表示),如果包含小数点,则要输出9位。输完字符串请按下“刷新显示按钮”,所输入的信息就会显示在读写器的数码管上。 如果选择了“读写器控制”选项,你还要选择显示时间还是日期,你可以通过改变文本框里的值来修改读写器的的时间和日期。按下“刷新显示”按钮,新设定的值就会被传到读写器上,读写器以后就会按新的时间或日期来显示。其初始值是和所连接的PC机的系统时间相匹配的。LED的亮度可以通过“亮度”的上下箭头来改变。 2.2 密码设置

MFRC522 IC卡模块使用手册V1.0

MFRC522 IC 卡模块使用手册 V1.0
嵌达科技,快乐生活 欢迎访问:https://www.sodocs.net/doc/562638384.html,/shop/view_shop.htm?tracelog=twddp 程序功能: 当 IC 卡放在模块上时,先把预先赋值给 Write_Data[16]这个数组中的数据写 到 IC 卡中,然后马上把写入的数据读出来,显示在 PC 机的串口调试助手上。 操作步骤: 1、 下载程序到单片机中。 我们设计的电路板使用的是 AT89S52,因此只能通过 ISP 下载,为了布线方 便,我只引出了必须的 6 根线供下载,图如下:
程 序 下 载 接 口 程 序 下 载 接
我们都知道 ISP 下载器都是 10 脚的,从 10 脚转变成 6 脚就必须有所转换, 一般有两种解决方法:1)通过杜邦线一对一连,这种方法的前提是你必须知道 自己手上的 ISP 下载器引脚定义;2)通过另一块转接板把 10 脚转换为 6 脚,并 附加上开关功能,这种方法比较方便,如下图:
由于此转换电路板制作费用较小,如果您买了 ISP 下载器或者买了读写卡模 块,我们将免费赠送。 2、 准备工作 ① 将读写卡模块插在电路板上; ② 将串口线连接电路板和电脑,保证可以实现串口通信的硬件连接; ③ 打开 PC 机上的串口调试助手,并打开对应端口,开启 16 进制显示,准 备接收数据。


3、 实现读写卡 ① 给电路板通电; ② 把卡放在读卡器模块上,当绿灯亮时表示读写卡结束,此时串口调试助 手会显示出卡对应数据块中的数据,如下图:
1、
工程文件说明:
我们的程序只用了四个文件,分别为:读写卡.c、read_card.h、read_card.c
和 rc522.h。下面我来介绍一下这四个文件的作用,各位亲,这部份仔细看哦, 尤其是那些还执着于在一个文件中实现所的函数编写的朋友们, 下面我们所展示 的文件架构可以适用于小中型工程的实现, 这会让您的程序看上去更有条理性和 逻辑性,更容易调试和修改程序,这对于您自身编程能力的提升是无往不利的。 如果您要实现大型的工程,就需要考虑更多的文件存放各种类别的程序了。 读写卡.c:这个文件是我们的 main()函数所在的文件,是我们整个工程的入 口点, 这个文件中包含了串口通信初始化函数的调用和读写卡函数的调用,进而 牵动所有函数的调用。 Read_card.h:这个文件是我们除 main()函数之外所有的函数定义的地方,只 有在这里定义函数,这些函数才能在别的文件中被使用。另外,这个文件中统一 定义了本工程所要用到的所有系统文件,比如说:regx52.h、intrins.h 等。 Read_card.c:如果说 read_card.h 这个文件实现了所有函数的定义, read_card.c 这个文件则实现了所有函数的编写。 从很简单的延时函数到复杂的寄 存器操作函数, 从单一功能的实现函数到完整读写功能的实现函数,全都会体现 在这里。 Rc522.h:MFRC522 读写模块上有一个芯片实现了对读写卡功能的控制,这

接触式IC卡读写器使用手册

目录 第一章 DP系列接触式IC卡读写器简介 (3) 1.1概述 (3) 1.2读写器型号 (3) 1.3装箱清单 (4) 1.4读写器连接方式.... (4) 1.5指示灯 (4) 1.6程序安装 (4) 1.7用户软件 (4) 1.8技术指标 (5) 第二章演示系统使用说明 (6) 第三章 IC卡读写器驱动程序函数说明 (9) 3.1 安装程序主要目录和文件 (9) 3.2 函数使用规则 (9) 3.3 各种库函数说明 (9) 3.3.1 C语言接口函数库 (9) ●通用函数库 (10) ●AT24C01A/24C02/24C04/24C08/24C16/24C64 (13) ●AT45D041 (14) ●AT88SC102/1604/1604B (15) ●AT93C46/93C46A (22) ●SLE4404 (23) ●SLE4406 (26) ●SLE4418/4428 (28) ●SLE4432/4442 (30) ●CPU卡 (30) 3.3.2 FOXPRO FOR DOS函数库 (33) 3.3.3 WINDOWS 16位和32位动态库 (34) 3.3.4 FOXBASE函数库 (35) 3.3.5UNIX函数库 (38) 3.3.6LINUX函数库 (38)

3.4 VFP、VB、Delphi和PB调用动态库的方法 (38) 3.4.1 VFP调用16位动态库的方法 (38) 3.4.2 VFP调用32位动态库的方法 (39) 3.4.3 VB调用动态库的方法 (40) 3.4.4 Delphi调用32位动态库的方法 (41) 3.4.5 PB调用32位动态库的方法 (42) 3.4.6 VC调用32位动态库的方法 (42) 3.5 IC卡类型代码 (43) 3.6 函数错误类型代码 (43) 3.7自动卡型测试函数原理说明 (44) 附录一几种常用IC卡的特性 (45) [2000/05/10] DP-R-XXX

IC卡读写系统的单片机实现

天津大学网络教育学院 专科毕业论文 题目:IC卡读写系统的单片机实现 完成期限:2016年1月8日至 2016年4月20日 学习中心:选择一项。 专业名称:电气自动化技术 学生:国良 学生学号:3 指导教师:娜娜

IC卡读写系统的单片机实现 第1章绪论 本章介绍了IC卡的发展历史和应用情况,说明了现代IC卡技术的基础知识,最后分析了目前常见的IC卡读写器终端,并提出了本课题中IC卡读写器的设计目标。 1.1 IC卡的发展和应用使用情况 卡片是作为个人身份识别的手段而引进的,而作为交易凭证的卡片则早在19世纪80年代就萌芽于英国了,1950年,美国商人设计了第一现代的塑料信用卡,1951年美国富兰克林银行作为金融机构率先发行了信用卡,到60年代中期,人们在塑料金融交易卡的背面贴上磁条,发展成为能够自动读取信息进行在线处理的磁卡,磁卡因为结构简单,价格低廉,得到迅速推广。 IC卡是近年从欧洲开始出现的,IC卡具有突出的3S特点,即Standard(国际标准化)、Smart(灵巧智能化)、和Security(安全性)。因而发展迅速,在金融、通讯、交通等众多领域中后来居上,即使那些磁卡已经普及应用的围也将被取而代之。IC卡不仅改变了现有多种卡的使用方法和功能作用,还不断开创出新的应用领域。将IC卡和其他设备组成系统就能提供非常丰富的服务功能,把这些功能与生产或流通领域有机地结合起来,将出现令人意想不到的奇迹,创造出巨大的经济和社会效益。随着信息技术的发展,IC卡作为一种先进的信息存储介质,它的应用己经渗透到各国的经济、社会生活、军事等各个方面,将来更有着广阔的发展空间。 1.2 IC卡应用技术 IC卡比磁卡存储容量大,可靠性和安全性高,在应用上除了覆盖磁卡的全部应用围以外,还提供了许多磁卡所不具备的应用特性。正是这些特性,使IC 卡在脱机业务处理和联网数据一致性等方面表现出前所未有的优势。IC 卡虽然有很强的功能,但仅当IC卡加入到应用系统中,构成发行商、应用系统和持卡人之间的数据传输媒介时,才能有效地发挥其优势。一个好的IC卡应用系统,应具备良好的应用特性和性能价格比,还要有好的安全特性。 1.3 课题中IC卡的设计目标 读写器是IC卡应用系统的终端设备,只有通过读写设备才能和IC卡建立联系,读写IC卡中的数据;读写器一般还要求和信息网络中的上位机进行通讯,把IC卡中的数据融入到上层数据库。设计选择读写器是建立IC卡应用系统的关键。本文是就设计IC卡读写器展开的,课题的设计目标是一种通用的接触式IC卡读写终端,要求读写器能够单独工作。 预期目标:

MF RC522 射频识别参考程序注释new

MF RC522 射频识别参考程序注释串口读取的数据

//------------------------------------------ ucAddr = ((Address<<1)&0x7E)|0x80;//变化成有效的地址形式,最低位为0,最高位为1时候是,从MFRC522读出数据,参考39页 // 读SPI数据 //------------------------------------------ unsigned char SPIReadByte(void) { unsigned char data SPICount; // Counter used to clock out the data unsigned char data SPIData; SPIData = 0; for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read { SPIData <<=1; // Rotate the data CLR_SPI_CK; nop();nop(); // Raise the clock to clock the data out of the MAX7456 if(STU_SPI_MISO) { SPIData|=0x01; }

Drop the clock ready for the next bit } // and loop back return (SPIData); // Finally return the read data } //------------------------------------------ // 写SPI数据 //------------------------------------------ void SPIWriteByte(unsigned char data SPIData) { unsigned char data SPICount; // Counter used to clock out the data for (SPICount = 0; SPICount < 8; SPICount++) { if (SPIData & 0x80) { SET_SPI_MOSI; } else { CLR_SPI_MOSI; } nop();nop(); CLR_SPI_CK;nop();nop(); SET_SPI_CK;nop();nop(); SPIData <<= 1; } } ///////////////////////////////////////////////////////////////////// //功能:寻卡 //参数说明: req_code[IN]:寻卡方式 // 0x52 = 寻感应区内所有符合14443A标准的卡 // 0x26 = 寻未进入休眠状态的卡 // pTagType[OUT]:卡片类型代码 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdRequest(unsigned char data req_code,unsigned char *pTagType) {

IC卡读写器使用说明

IC 读写器使用说明 一、读写器连接 1.1 把通讯线“DB9”端插到PC 机的串口1/2 上 1.2 把通讯线2510端插到读写器的插座,使读写器和PC 机的串口良好连接 1.2 把电源线的“圆柱”端插到读写器的电源座子上 1.3 读写器上电以后可以听到一声风鸣器的响声,如果没有听到风鸣器声,表明读写器没有正常上电. 二、启动Demo 软件 2.1 双击启动测试软件 2.2 如果串口良好连接的话可以听到一声风鸣器的响声,如果启动测试软件以后并没有听到风鸣器声表明串口通讯没有连接好,请检查串口连接线是否连接正确 三、M1卡片读写测试 3.1 把一张Mifare One 卡片放在天线区域范围内

3.2 进入功能选项“低级操作”里面点击“寻卡”,如果出现“寻卡成功!”表明寻卡正常,如果出现“执行失败!”表明出现异常,请检查卡片是否在寻卡范围内,如果确认卡片没有问题,那读写器有异常 3.3 点击“防冲突”,如果出现“执行成功”表明防冲突正常,如果出现“执行失败”表明读写器出现异常或者卡片没有在天线区域 范围内

3.4 点击“选择”,如果出现“执行成功”表明选择正常,如果出现“执行失败” 表明读写器出现异常或者卡片没有在天线区域范 围内 3.5 进入功能选项“密码下载”里面下载卡片密码,比如需要测试卡片扇区1 数据的读写,那么就在扇区1 后面填上密码A/B(注:卡片的初始密码A/B 均为全‘F’),然后选择“A 组密码”或者“B 组密码”,最后点击“下载”,如果出现“密码下载成 功”表明密码下载成功,如果出现异常请按照错误提示更改后再下载一次,直至“下载成功”为止

STM8 RC522 读写IC卡程序

#include "stm8s.h" #include "uart.h" void Delay(u32 nCount); extern u8 RxBuffer[RxBufferSize]; extern u8 UART_RX_NUM; unsigned char CT[2];//卡类型 unsigned char SN[4]; //卡号 unsigned char write[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10}; unsigned char read[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char key[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; #define countof(a) (sizeof(a) / sizeof(*(a))) #define BufferSize (countof(Tx_Buffer)-1) u8 Tx_Buffer[] = "STM8S RFID TEST"; u8 Rx_Buffer[BufferSize]; u32 FLASH_ID ; void cardNo2String(u8 *cardNo, u8 *str); void main(void) { unsigned char status; /*设置内部时钟16M为主时钟*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); status = memcmp(read,write,16); GPIO_DeInit(GPIOA); GPIO_DeInit(GPIOC); Uart_Init(); GPIO_Init( GPIOA, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST); InitRc522(); UART2_SendString(Tx_Buffer,BufferSize); while(1) { status = PcdRequest(PICC_REQALL,CT); /*扫描卡*/ status = PcdAnticoll(SN); /*防冲撞*/ if (status==MI_OK) { GPIO_LOW(GPIOA, GPIO_PIN_4); //寻卡成功

IC卡和IC卡读写器常识

IC卡和IC卡读写器常识 人们常说的IC卡,其实际的概念是怎样的呢? IC是英文集成电路的缩写,其含义是指集成电路芯片。由于法国人的发明,使集成电路芯片嵌入一张PVC之类的材料制成的卡内变成了现实,这就是今天人们所说的IC卡。 IC卡由于其功能可以认为有3个分支: 1、IC 存贮卡,包括加密存贮卡。读写器对卡的读写为接触式,因而称这种卡为接触式IC卡。 2、CPU卡,即IC卡内含有至少一个运算芯片CPU的IC卡。读写器对卡的读写为接触式,因而称这种卡为接触式IC卡。 3、RF射频卡,射频卡内包括有加密逻辑电路,有的带有CPU芯片,读写器对卡的读写为非接触式,因而称这种IC卡为非接触式IC卡。 IC卡在使用中,有一些参数在卡型选择时是需要认真考虑的。 1)、如果IC卡的使用环境低于0℃时,最好不要选用CPU卡,因CPU卡的工作温度在0℃时以上。而MemoryCard 可以工作在-20℃的低温下工作。 2)、IC卡是有工作电压指标的,西门子公司的IC卡一般工作电压在4.75V~5.25V之间。ATMEL公司的IC卡工作电压约在2.7V~5.5V之间,用户在自己设计读写电路时应加以注意。特别指出的是现在AT MEL新出的45DB041芯片由于工艺变化,已不能在5V电压环境正常工作,我司(深圳庆通科技)针对这种情况研发生产了低电压IC卡读写器和双电压切换的IC卡读写器。 3)、IC卡是有寿命的。它的寿命是由对IC卡的擦写次数决定的,对于西门子的IC卡,指标为1万次擦写寿命;ATMEL的IC卡,指标称擦写寿命为10万次。 4)、IC卡读写器的使用寿命主要由两个因素决定。 a、读写器本身器件的选择; b、卡座的寿命;卡座的寿命分别有10万次,20万次和50万次。国内一些个体经济也生产了相当数量的少于7000次寿命的卡座,主要用于IC卡收费的终端表内,如IC卡电表,IC卡民用水表,IC煤气表等。我司(深圳庆通科技)所标配的卡座为10万次的卡座。 5)、专业厂家的IC卡读写机具配有各种上层接口函数,对于其用户是免费发放的,可以免去用户自己开发的时间。另外,专业厂家提供的产品由于其用户较为广泛,或许已经过一些系统的考验,这些情况,用户可以通过向经销商或厂家提问,得出一些正确的结论。 6)、读写器对IC卡的上电操作,仅在接到软件发出的指令以后才能进行,并且,在IC卡没有插入的情况下,应给出上电出错的返回代码。

RFID_MFRC522

RFID 一、概述 (2) 二、系统组成 (2) 三、非接触式IC卡—M1卡 (2) 1、外观 (2) 2、结构 (3) 3、功能 (3) 4、Mifare 1 S50卡存储EEPROM (5) 四、读卡器—MFRC522 (7) 1、内部框图 (7) 2、电路图 (8) 3、MFRC522支持的三种接口 (9) 4、工作过程 (9) 五、结果 (13)

一、概述 通过点名、磁卡和接触式IC卡等方式对学生的到课情况进行考勤、记录管理,既耗时又相互干扰;而非接触式RFID学生考勤系统实现了利用无线射频识别技术对学生考勤管理,既方便、快捷,又省时。而且通过物联网和PC机终端对数据进行处理。 二、系统组成 学生智能考勤系统由四大部分组成,非接触式IC卡、读卡器、单片机及PC 终端。如下图 学生考勤系统组成 1.当保存有学生基本信息的IC卡进入读卡器天线作用范围内时,卡片获得 能量以维持卡内部电路工作; 2.单片机负责控制读卡器进行一系列“寻卡→防冲突→选卡→读/写卡”操 作,如果成功,将读取到卡片上的学生信息; 3.单片机将学生信息发送到PC终端,由PC机对一步对数据进行处理。 三、非接触式IC卡—Mifare One卡 1、外观 非接触式IC卡

2、结构 非接触式IC卡的薄膜结构 卡内部结构 3、功能 功能框图 读卡器通过天线发射激励信号(一组固定频率的电磁波),IC卡进入读写器工作区内,被读写器信号激励。在电磁波的激励下,卡内的LC串联谐振电路产生共振,从而使电容内

有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2 V时,此电容可以作为电源为其他电路提供工作电压,供卡内集成电路工作所需。 (1)ATR模块:Answer To Request(“请求之应答”) 当一张MIFARE 1卡处在读写器的天线工作范围之内时,程序员控制读写器向卡发出Request all(或Request std)命令后,卡的ATR将启动,将卡片块 0 中2个字节的卡类型号(TagType)传送给读写器,建立卡与读写器的第一步通信联络。 如果不进行第一步的ATR工作,读写器对卡的其他操作(读/写操作等)将不会进行。 (2)AntiCollision模块:防(卡片)冲突功能 如果有多张MIFARE 1卡处在读写器的天线工作范围之内,则AntiCollision模块的防冲突功能将被启动工作。读写器将会首先与每一张卡进行通信,读取每一张卡的序列号(Serial Number)。由于每一张MIFARE 1卡都具有惟一的序列号,决不会相同,因此程序员将启动读写器中的AntiCollision防重叠功能配合卡上的防重叠功能模块,根据卡序列号来选定其中一张卡。被选中的卡将被激活,可以与读写器进行数据交换;而未被选中的卡处于等待状态,随时准备与读写器进行通信。 AntiCollision模块(防重叠功能)启动工作时,读写器将得到卡片的序列号(Serial Number)。序列号存储在卡的Block 0中,共有5个字节,实际有用的为4个字节,另一个字节为序列号的校验字节。 (3)Select Application 模块:卡片的选择 当卡与读写器完成了上述两个步骤,读写器要想对卡进行读/写操作时,必须对卡进行“Select”操作,以使卡真正地被选中。 被选中的卡将卡片上存储在Block 0中的卡容量“Size” 字节传送给读写器。当读写器收到这一字节后,方可对卡进行进一步的操作,如密码验证等。 (4)Authentication & Access Control 模块:认证及存取控制模块 完成上述的三个步骤后,读写器对卡进行读/写操作之前,必须对卡上已经设置的密码进行认证,如果匹配,则允许进一步的读/写操作。 MIFARE 1 卡上有16个扇区,每个扇区都可分别设置各自的密码,互不干涉,必须分别加以认证,才能对该扇区进行下一步的操作。因此每个扇区可独立地应用于一个应用场合,整个卡可以设计成一卡多用(一卡通)的形式来应用。 密码的认证采用了三次相互认证的方法,具有很高的安全性。如果事先不知卡上的密码,则因密码的变化可以极其复杂,试图靠猜测密码而打开卡上一个扇区的可能性几乎为零。 (5)Control & Arithmetic Unit:控制及算术运算单元 这一单元是整个卡的控制中心,是卡的“头脑”。它主要对卡的各个单元进行操作控制,协调卡的各个步骤;同时它还对各种收/发的数据进行算术运算处理、递增/递减处理和CRC运算处理等,是卡中内建的中央微处理器(MCU)单元。 (6)RAM/ROM 单元 RAM主要配合控制及算术运算单元,将运算的结果进行暂时存储,例如将需存储的数据由控制及算术运算单元取出送到EEPROM存储器中;将需要传送给读写器的数据由控制及算术运算单元取出,经过RF射频接口电路的处理,通过卡片上的天线传送给读写器。RAM 中的数据在卡失掉电源后(卡片离开读写器天线的有效工作范围)将会丢失。 同时,ROM中则固化了卡运行所需要的必要的程序指令,由控制及算术运算单元取出,对每个单元进行指令控制,使卡能有条不紊地与读写器进行数据通信。 (7)Crypto Unit:数据加密单元 该单元完成对数据的加密处理及密码保护。加密的算法可以为DES标准算法或其他。

射频IC卡读写器简析

一、简介 射频IC卡读写器,属于读写IC卡的RFID射频技术机具设备,根据卡片类型的不同,分为接触式、非接触式、双界面读卡器。接触式IC卡读写器基本遵循ISO7816协议的国际标准,非接触式的则遵循ISO14443或者15693协议接口标准。读写器一般通过通讯线连接接到电脑,通讯方式以USB接口为主(分有驱和无驱),RS232和RS485接口的读卡器,仍然具有一定的用户数量。 二、技术参数举例 型号:LTXHFUSB-02 工作频率:13.56MHz; IC卡读写器支持协议:ISO14443A; 通讯接口:USB接口,操作简单,可以当作串口操作; 读卡距离:小于10cm; 支持卡类型:mafare 1 S20,mafare 1 S50, mafare 1 S70,ISO14443 TypeA等; 工作电压:直流5V(USB直接取电); 工作电流:<100mA; 工作模式:用户可自己设置成主动读卡模式和被动读卡模式; 功能:支持读卡号ID,读写卡,扇区加密,增值减值(钱包)等; 工作温度:-30℃-80 ℃; 外观尺寸:143×110×28mm; 串口波特率:可选,默认9600Bit/S; 操作系统:Windows 98、2000、2003、XP、Windows 7/8、Linux、Andriod等; 显示:双色LED; 蜂鸣器:内置。 三、使用说明 1、通讯接口要满足项目的需求; 2、读卡器设备的频率,要满足项目使用的频率规范; 3、了解读距和防碰撞指标,读距指标要明确什么天线和标签下测试的;防碰撞要明确什么标签在什么排列方式下多长时间内全部读完;

4、模拟情况下连续测试设备的稳定性,确保能长时间的稳定工作; 5、了解读卡器的最大发射功率和配套选型的天线,是否辐射超标; 6、看读卡器具备的天线端口数量,根据应用是否需要多接口的读写器; 7、一个RFID应用系统除了和读写器有关外,还和标签、天线、被贴标物品材质、被贴标物品运动速度、周围环境等相关,在确定设备前最好能模拟现场情况进行测试和验证,确保产品真是能满足应用需求。 四、读卡距离 影响射频IC卡读写器读卡距离的因素较多,因采用不同的协议,不同的天线设计、周围的环境(主要是金属物)和不同的卡片等,都会影响到实际的读卡距离。如果读卡器读卡距离过长,会造成读卡不稳定或失败。同时过近的两个读卡器也会互相干扰,读卡器之间的距离保持在25cm以上。读卡的方式,建议用卡片正对着读卡器自然靠近,用卡片从侧面快速划过的读卡方法不可取,不保证刷卡成功。 五、实物图举例

STM8 RC522 IC卡修改密码程序

/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/ #include "stm8s.h" #include "stm8s_clk.h" #include "intrinsics.h" #include "stm8s_uart1.h" #include "uart.h" #include "rc522.h" #include "string.h" void Delay(u32 nCount); extern u8 RxBuffer[RxBufferSize]; extern u8 UART_RX_NUM; unsigned char CT[2];//卡类型 unsigned char SN[4]; //卡号 unsigned char write[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10}; unsigned char read[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char key[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; /* Private macro -------------------------------------------------------------*/ #define countof(a) (sizeof(a) / sizeof(*(a))) #define BufferSize (countof(Tx_Buffer)-1) /* Private variables ---------------------------------------------------------*/ u8 Tx_Buffer[] = "STM8S RFID TEST"; u8 Rx_Buffer[BufferSize]; u32 FLASH_ID ; /* Private defines -----------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ #define ReadWriteAddr 11 //读写扇区 void main(void) { unsigned char status; /* Infinite loop */ /*设置内部时钟16M为主时钟*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

基于单片机的IC卡读写器设计

石家庄铁道大学毕业设计 基于单片机的IC卡读写器设计The Design of the IC Card Read-Write Device Based on single chip microcomputer 2012 届电气工程系 专业 学号 学生姓名 指导教师陈东阳 完成日期 2012年 5月 15日

毕业设计成绩单 学生姓名学号班级专业毕业设计题目基于单片机的IC卡读写器设计 指导教师姓名 指导教师职称 评定成绩 指导教师得分 评阅人得分 答辩小 得分 组组长 成绩: 院长(主任)签字: 年月日

毕业设计任务书 题目基于单片机的IC卡读写器设计 学生姓名学号班级专业自动化 承担指导任务单位石家庄铁道大学导师 姓名 陈东阳 导师 职称 副教授 一、主要内容 设计一款读写器,能通过与计算机通信,由计算机发送新数据到单片机,完成对卡的读/写。 IC卡应用于消费电子产品对IC卡的管理,如电卡,饭卡,购物卡,娱乐消费卡等其他消费费系统充值与管理。这里设计的读写器能实现简单的读写与显示功能。 二、技术参数和要求 1、使用SLE4442卡,密码用123456。 2、33-36区域放置AA 55 80 FE四个字节作为卡片识别代码。 3、37区域放置能消费值MN(钱包值MN<=99) 4、38区域放置MN的备份NN, 5、39区域放置工作时间TT(TT<=99) 6、读取卡信息上传到计算机 7、注册有效卡并对其进行充值管理。 8、其他要求: 写卡成功失败都要有声光提示;有写卡状态指示; 电路原理图设计,protel印刷电路图设计。 提出系统设计框图,提出相应的解决方案。 论文正文不少于1.5万字,查阅文献资料不少于15篇,其中外文文献2篇以上,翻译与课题有关的外文资料不少于3000汉字。 一、结构框图 ◆整体分三部分单片机部分,读写卡模块,232模块部分。 ◆接口电路部分属于IC卡槽和上位机相连的部分,也是IC卡能与单片进行通话的部分。 ◆数码显示部分是显示IC卡存储器内数值的部分。 ◆单片机与IC卡完成通信,对卡进行写操作。并将数据通过232部分与计算机通信。 ◆232模块部分,电平转换,通过这部分完成计算机与单片机的通信。 ◆编程提示:计算机将要写的数据先发送到单片机,单片机再完成对卡的读写操作 三、应收集的资料及参考文献 1、参考及查阅资料 ◆RS232,数码显示 ◆I2C总线

基于51单片机RC522无线射频公交车刷卡系统设计毕业设计论文

基于51单片机RC522无线射频公交车刷卡系统设计

毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作者签名:日期: 指导教师签名:日期: 使用授权说明 本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:日期:

学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名:日期:年月日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名:日期:年月日 导师签名:日期:年月日

相关主题