uart.h

  代码如下:

#ifndef __UART_H__
#define __UART_H__void UART_Init();
void send ( unsigned char d );
void send_str ( unsigned char *dat );
void send_str_len ( unsigned char *dat, unsigned int len );
#endif

uart.c

  代码如下:

#include <STC12C5A.H>
#include "uart.h"unsigned int count = 0, temp = 0;void UART_Init() {EA = 0;SCON = 0x50;TMOD = 0x20;TL1 = 0xfd;TH1 = 0xfd;TR1 = 1;ES = 1;AUXR &= 0x7F;TMOD &= 0xF0;TMOD |= 0x02;TL0 = 0xA4;TH0 = 0xA4;TF0 = 0;TR0 = 1;ET0 = 1;EA = 1;
}void send ( unsigned char d ) { /* 串口1发送一个字节的数据,形参d即为待发送数据 */SBUF = d; /* 将数据写入到串口缓冲 */while ( !TI ); /* 等待发送完毕 */
}void send_str ( unsigned char *dat ) { /* 串口1发送字符串 */while ( *dat ) {send ( *dat );dat++;}
}void send_str_len ( unsigned char *dat, unsigned int len ) { /* 串口1发送指定长度的字符串 */unsigned char i = 0;for ( ; i < len; i++ ) {send ( dat[i] );}
}void uart() interrupt 4 { /* 串口1用来与上位通讯 */if ( RI ) { /* 收到数据 */RI = 0; /* 清中断请求 */IE2 |= 0x01;} else if ( TI ) { /* 发送完一字节数据 */TI = 0;}ES = 1; /* 允许串口中断 */
}void timer0() interrupt 1 {if ( count < 20000 ) {count++;if ( count >= 20000 ) { /* 每100次花费1秒 */count = 0;}}
}

mfrc522.h

  代码如下:

#ifndef MFC522_H
#define MFC522_H#include <STC12C5A.H>
/* MFRC522的端口定义 */
sbit MF522_RST = P2 ^ 3; /* RC500片选 */
sbit MF522_SO  = P2 ^ 4;
sbit MF522_NSS = P2 ^ 5; /* SDA */
sbit MF522_SCK = P2 ^ 6;
sbit MF522_SI  = P2 ^ 7;char PcdReset ( void );
void PcdAntennaOn ( void );
void PcdAntennaOff ( void );
char PcdRequest ( unsigned char req_code, unsigned char *pTagType );
char PcdAnticoll ( unsigned char *pSnr );
char PcdSelect ( unsigned char *pSnr );
char PcdAuthState ( unsigned char auth_mode, unsigned char addr, unsigned char *pKey, unsigned char *pSnr );
char PcdRead ( unsigned char addr, unsigned char *pData );
char PcdWrite ( unsigned char addr, unsigned char *pData );
char PcdValue ( unsigned char dd_mode, unsigned char addr, unsigned char *pValue );
char PcdBakValue ( unsigned char sourceaddr, unsigned char goaladdr );
char PcdHalt ( void );
char PcdComMF522 ( unsigned char Command, unsigned char *pInData, unsigned char InLenByte, unsigned char *pOutData, unsigned int  *pOutLenBit );
void CalulateCRC ( unsigned char *pIndata, unsigned char len, unsigned char *pOutData );
void WriteRawRC ( unsigned char Address, unsigned char value );
unsigned char ReadRawRC ( unsigned char Address );
void SetBitMask ( unsigned char reg, unsigned char mask );
void ClearBitMask ( unsigned char reg, unsigned char mask );
char M500PcdConfigISOType ( unsigned char type );
void delay_10ms ( unsigned int _10ms );/* MF522命令字 */
#define PCD_IDLE       0x00 /* 取消当前命令 */
#define PCD_AUTHENT    0x0E /* 验证密钥 */
#define PCD_RECEIVE    0x08 /* 接收数据 */
#define PCD_TRANSMIT   0x04 /* 发送数据 */
#define PCD_TRANSCEIVE 0x0C /* 发送并接收数据 */
#define PCD_RESETPHASE 0x0F /* 复位 */
#define PCD_CALCCRC    0x03 /* CRC计算 *//* Mifare_One卡片命令字 */
#define PICC_REQIDL    0x26 /* 寻天线区内未进入休眠状态 */
#define PICC_REQALL    0x52 /* 寻天线区内全部卡 */
#define PICC_ANTICOLL1 0x93 /* 防冲撞 */
#define PICC_ANTICOLL2 0x95 /* 防冲撞 */
#define PICC_AUTHENT1A 0x60 /* 验证A密钥 */
#define PICC_AUTHENT1B 0x61 /* 验证B密钥 */
#define PICC_READ      0x30 /* 读块 */
#define PICC_WRITE     0xA0 /* 写块 */
#define PICC_DECREMENT 0xC0 /* 扣款 */
#define PICC_INCREMENT 0xC1 /* 充值 */
#define PICC_RESTORE   0xC2 /* 调块数据到缓冲区 */
#define PICC_TRANSFER  0xB0 /* 保存缓冲区中数据 */
#define PICC_HALT      0x50 /* 休眠 */#define DEF_FIFO_LENGTH 64 /* MF522的FIFO长度定义 *//* MF522寄存器定义 */
/* PAGE 0 */
#define RFU00         0x00
#define CommandReg    0x01
#define ComIEnReg     0x02
#define DivlEnReg     0x03
#define ComIrqReg     0x04
#define DivIrqReg     0x05
#define ErrorReg      0x06
#define Status1Reg    0x07
#define Status2Reg    0x08
#define FIFODataReg   0x09
#define FIFOLevelReg  0x0A
#define WaterLevelReg 0x0B
#define ControlReg    0x0C
#define BitFramingReg 0x0D
#define CollReg       0x0E
#define RFU0F         0x0F
/* PAGE 1 */
#define RFU10          0x10
#define ModeReg        0x11
#define TxModeReg      0x12
#define RxModeReg      0x13
#define TxControlReg   0x14
#define TxAutoReg      0x15
#define TxSelReg       0x16
#define RxSelReg       0x17
#define RxThresholdReg 0x18
#define DemodReg       0x19
#define RFU1A          0x1A
#define RFU1B          0x1B
#define MifareReg      0x1C
#define RFU1D          0x1D
#define RFU1E          0x1E
#define SerialSpeedReg 0x1F
/* PAGE 2 */
#define RFU20             0x20
#define CRCResultRegM     0x21
#define CRCResultRegL     0x22
#define RFU23             0x23
#define ModWidthReg       0x24
#define RFU25             0x25
#define RFCfgReg          0x26
#define GsNReg            0x27
#define CWGsCfgReg        0x28
#define ModGsCfgReg       0x29
#define TModeReg          0x2A
#define TPrescalerReg     0x2B
#define TReloadRegH       0x2C
#define TReloadRegL       0x2D
#define TCounterValueRegH 0x2E
#define TCounterValueRegL 0x2F
/* PAGE 3 */
#define RFU30           0x30
#define TestSel1Reg     0x31
#define TestSel2Reg     0x32
#define TestPinEnReg    0x33
#define TestPinValueReg 0x34
#define TestBusReg      0x35
#define AutoTestReg     0x36
#define VersionReg      0x37
#define AnalogTestReg   0x38
#define TestDAC1Reg     0x39
#define TestDAC2Reg     0x3A
#define TestADCReg      0x3B
#define RFU3C           0x3C
#define RFU3D           0x3D
#define RFU3E           0x3E
#define RFU3F           0x3F/* 和MF522通讯时返回的错误代码 */
#define MI_OK       0
#define MI_NOTAGERR (-1)
#define MI_ERR      (-2)
#endif

rc522.c

  代码如下:

#include <intrins.h>
#include <STC12C5A.H>
#include <string.h>
#include "mfrc522.h"#define MAXRLEN 18/*---------------------------------------------------------------------------------------* 功能:寻卡,若成功则返回MI_OK* 参数:req_code是寻卡方式,0x52是寻感应区内所有符合14443A标准的卡,0x26是寻未进入休眠状态的卡*       pTagType是卡片类型代码。0x4400是Mifare_UltraLight,0x0400是Mifare_One(S50),*       0x0200是Mifare_One(S70),0x0800是Mifare_Pro(X),0x4403是Mifare_DESFire*-------------------------------------------------------------------------------------*/
char PcdRequest ( unsigned char req_code, unsigned char *pTagType ) {char status;unsigned int  unLen;unsigned char 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;
}char PcdAnticoll ( unsigned char *pSnr ) { /* 防冲突功能。参数pSnr是卡片序列号(4字节) */char status;unsigned char i, snr_check = 0;unsigned int  unLen;unsigned char 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;
}char PcdSelect ( unsigned char *pSnr ) { /* 选定卡片。参数pSnr是卡片序列号(4字节) */char status;unsigned char i;unsigned int  unLen;unsigned char ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x70;ucComMF522Buf[6] = 0;for ( i = 0; i < 4; i++ ) {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;
}/*------------------------------------------------------------------------------------------------------------* 功能:验证卡片密码,若成功返回MI_OK* 参数:auth_mode是密码验证模式,0x60是验证A密钥,0x61是验证B密钥;addr是块地址;pKey是密码;pSnr是卡片序列号(4字节)
------------------------------------------------------------------------------------------------------------*/
char PcdAuthState ( unsigned char auth_mode, unsigned char addr, unsigned char *pKey, unsigned char *pSnr ) {char status;unsigned int  unLen;unsigned char i, ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = auth_mode;ucComMF522Buf[1] = addr;for ( i = 0; i < 6; i++ ) {ucComMF522Buf[i + 2] = * ( pKey + i );}for ( i = 0; i < 6; i++ ) {ucComMF522Buf[i + 8] = * ( pSnr + i );}status = PcdComMF522 ( PCD_AUTHENT, ucComMF522Buf, 12, ucComMF522Buf, &unLen );if ( ( status != MI_OK ) || ( ! ( ReadRawRC ( Status2Reg ) & 0x08 ) ) ) {status = MI_ERR;}return status;
}char PcdRead ( unsigned char addr, unsigned char *pData ) { /* 读取M1卡一块数据。参数addr是块地址,pData是读出的数据(16字节) */char status;unsigned int  unLen;unsigned char 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++ ) {* ( pData + i ) = ucComMF522Buf[i];}} else {status = MI_ERR;}return status;
}char PcdWrite ( unsigned char addr, unsigned char *pData ) { /* 写数据到M1卡。参数addr是块地址,pData是写入的数据(16字节) */char status;unsigned int  unLen;unsigned char 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] = * ( pData + i );}CalulateCRC ( ucComMF522Buf, 16, &ucComMF522Buf[16] );status = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 18, ucComMF522Buf, &unLen );if ( ( status != MI_OK ) || ( unLen != 4 ) || ( ( ucComMF522Buf[0] & 0x0F ) != 0x0A ) ) {status = MI_ERR;}}return status;
}char PcdHalt ( void ) { /* 命令卡片进入休眠状态。若成功返回MI_OK */char status;unsigned int  unLen;unsigned char 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;
}void CalulateCRC ( unsigned char *pIndata, unsigned char len, unsigned char *pOutData ) { /* 用MF522计算CRC16函数 */unsigned char i, n;ClearBitMask ( DivIrqReg, 0x04 );WriteRawRC ( CommandReg, PCD_IDLE );SetBitMask ( FIFOLevelReg, 0x80 );for ( i = 0; i < len; i++ ) {WriteRawRC ( FIFODataReg, * ( pIndata + i ) );}WriteRawRC ( CommandReg, PCD_CALCCRC );i = 0xFF;do {n = ReadRawRC ( DivIrqReg );i--;} while ( ( i != 0 ) && ! ( n & 0x04 ) );pOutData[0] = ReadRawRC ( CRCResultRegL );pOutData[1] = ReadRawRC ( CRCResultRegM );
}char PcdReset ( void ) { /* 复位RC522。若成功返回MI_OK */MF522_RST = 1;_nop_();MF522_RST = 0;_nop_();MF522_RST = 1;_nop_();WriteRawRC ( CommandReg, PCD_RESETPHASE );_nop_();WriteRawRC ( ModeReg, 0x3D ); /* 和Mifare卡通讯,CRC初始值为0x6363 */WriteRawRC ( TReloadRegL, 30 );WriteRawRC ( TReloadRegH, 0 );WriteRawRC ( TModeReg, 0x8D );WriteRawRC ( TPrescalerReg, 0x3E );WriteRawRC ( TxAutoReg, 0x40 );return MI_OK;
}char M500PcdConfigISOType ( unsigned char type ) { /* 设置RC632的工作方式 */if ( type == 'A' ) { /* ISO14443_A */ClearBitMask ( Status2Reg, 0x08 );WriteRawRC ( ModeReg, 0x3D ); /* 3F */WriteRawRC ( RxSelReg, 0x86 ); /* 84 */WriteRawRC ( RFCfgReg, 0x7F ); /* 4F */WriteRawRC ( TReloadRegL, 30 );WriteRawRC ( TReloadRegH, 0 );WriteRawRC ( TModeReg, 0x8D );WriteRawRC ( TPrescalerReg, 0x3E );delay_10ms ( 1 );PcdAntennaOn();} else {return -1;}return MI_OK;
}unsigned char ReadRawRC ( unsigned char Address ) { /* 读取RC632寄存器。参数Address是寄存器地址 */unsigned char i, ucAddr;unsigned char ucResult = 0;MF522_SCK = 0;MF522_NSS = 0;ucAddr = ( ( Address << 1 ) & 0x7E ) | 0x80;for ( i = 8; i > 0; i-- ) {MF522_SI = ( ( ucAddr & 0x80 ) == 0x80 );MF522_SCK = 1;ucAddr <<= 1;MF522_SCK = 0;}for ( i = 8; i > 0; i-- ) {MF522_SCK = 1;ucResult <<= 1;ucResult |= ( bit ) MF522_SO;MF522_SCK = 0;}MF522_NSS = 1;MF522_SCK = 1;return ucResult;
}void WriteRawRC ( unsigned char Address, unsigned char value ) { /* 写RC632寄存器。参数Address是寄存器地址,value是写入的值 */unsigned char i, ucAddr;MF522_SCK = 0;MF522_NSS = 0;ucAddr = ( ( Address << 1 ) & 0x7E );for ( i = 8; i > 0; i-- ) {MF522_SI = ( ( ucAddr & 0x80 ) == 0x80 );MF522_SCK = 1;ucAddr <<= 1;MF522_SCK = 0;}for ( i = 8; i > 0; i-- ) {MF522_SI = ( ( value & 0x80 ) == 0x80 );MF522_SCK = 1;value <<= 1;MF522_SCK = 0;}MF522_NSS = 1;MF522_SCK = 1;
}void SetBitMask ( unsigned char reg, unsigned char mask ) { /* 置RC522寄存器位。参数reg是寄存器地址,mask是置位值 */char tmp = 0x0;tmp = ReadRawRC ( reg );WriteRawRC ( reg, tmp | mask ); /* set bit mask */
}void ClearBitMask ( unsigned char reg, unsigned char mask ) { /* 清RC522寄存器位。参数reg是寄存器地址,mask是清位值 */char tmp = 0x0;tmp = ReadRawRC ( reg );WriteRawRC ( reg, tmp & ~mask ); /* clear bit mask */
}/*-----------------------------------------------------------------------------------------* 功能:通过RC522和ISO14443卡通讯* 参数:Command是RC522命令字,pInData是通过RC522发送到卡片的数据,InLenByte是发送数据的字节长度,*       pOutData是接收到的卡片返回数据,pOutLenBit[OUT]是返回数据的位长度* ---------------------------------------------------------------------------------------*/
char PcdComMF522 ( unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int  *pOutLenBit ) {char status = MI_ERR;unsigned char irqEn   = 0x00;unsigned char waitFor = 0x00;unsigned char lastBits;unsigned char n;unsigned int i;switch ( Command ) {case PCD_AUTHENT:irqEn   = 0x12;waitFor = 0x10;break;case PCD_TRANSCEIVE:irqEn   = 0x77;waitFor = 0x30;break;default:break;}WriteRawRC ( ComIEnReg, irqEn | 0x80 );ClearBitMask ( ComIrqReg, 0x80 );WriteRawRC ( CommandReg, PCD_IDLE );SetBitMask ( FIFOLevelReg, 0x80 ); /* fifo清零 */for ( i = 0; i < InLenByte; i++ ) {WriteRawRC ( FIFODataReg, pInData[i] );}WriteRawRC ( CommandReg, Command );if ( Command == PCD_TRANSCEIVE ) {SetBitMask ( BitFramingReg, 0x80 );}i = 2000; /* 根据时钟频率调整,操作M1卡最大等待时间为25ms */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;} else {*pOutLenBit = n * 8;}if ( n == 0 ) {n = 1;}if ( n > MAXRLEN ) {n = MAXRLEN;}for ( i = 0; i < n; i++ ) {pOutData[i] = ReadRawRC ( FIFODataReg );}}} else {status = MI_ERR;}}SetBitMask ( ControlReg, 0x80 ); /* stop timer now */WriteRawRC ( CommandReg, PCD_IDLE );return status;
}void PcdAntennaOn() { /* 开启天线 */unsigned char i;i = ReadRawRC ( TxControlReg );if ( ! ( i & 0x03 ) ) {SetBitMask ( TxControlReg, 0x03 );}
}void PcdAntennaOff() { /* 关闭天线 */ClearBitMask ( TxControlReg, 0x03 );
}/*-----------------------------------------------------------------------------------------------* 功能:扣款和充值,若成功返回MI_OK* 参数:dd_mode是命令字,0xC0为扣款,0xC1为充值;addr是钱包地址,pValue是数值,4字节增(减)值,低位在前*----------------------------------------------------------------------------------------------*/
char PcdValue ( unsigned char dd_mode, unsigned char addr, unsigned char *pValue ) {char status;unsigned int  unLen;unsigned char ucComMF522Buf[MAXRLEN];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 );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] );status = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen );if ( ( status != MI_OK ) || ( unLen != 4 ) || ( ( ucComMF522Buf[0] & 0x0F ) != 0x0A ) ) {status = MI_ERR;}}return status;
}char PcdBakValue ( unsigned char sourceaddr, unsigned char goaladdr ) { /* 备份钱包。参数sourceaddr是源地址,goaladdr是目标地址 */char status;unsigned int  unLen;unsigned char ucComMF522Buf[MAXRLEN];ucComMF522Buf[0] = PICC_RESTORE;ucComMF522Buf[1] = sourceaddr;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 ) {ucComMF522Buf[0] = 0;ucComMF522Buf[1] = 0;ucComMF522Buf[2] = 0;ucComMF522Buf[3] = 0;CalulateCRC ( ucComMF522Buf, 4, &ucComMF522Buf[4] );status = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 6, ucComMF522Buf, &unLen );if ( status != MI_ERR ) {status = MI_OK;}}if ( status != MI_OK ) {return MI_ERR;}ucComMF522Buf[0] = PICC_TRANSFER;ucComMF522Buf[1] = goaladdr;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;}return status;
}void Delay10ms() { /* @11.0592MHz */unsigned char i, j;_nop_();_nop_();i = 108;j = 144;do {while ( --j );} while ( --i );
}void delay_10ms ( unsigned int _10ms ) {while ( _10ms-- ) {Delay10ms();}
}

main.c

  代码如下:

#include <STC12C5A.H>
#include "string.h"
#include "uart.h"
#include "mfrc522.h"unsigned char idata RevBuffer[30] = {0}; /* 接收缓冲区 */
unsigned char code DefaultKey[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; /* 密码 */
unsigned char idata MLastSelectedSnr[4] = {0};
unsigned char data_in[16] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xFF, 0x07, 0x80, 0x69, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};void main() {UART_Init();PcdReset();PcdAntennaOff();PcdAntennaOn();M500PcdConfigISOType ( 'A' );while ( 1 ) {if ( PcdRequest ( PICC_REQALL, &RevBuffer[2] ) == MI_OK ) { /* 寻卡 */if ( PcdAnticoll ( MLastSelectedSnr ) == MI_OK ) { /* 防冲突 */if ( PcdSelect ( MLastSelectedSnr ) == MI_OK ) { /* 选择卡号 */send_str ( "I get a card! " );if ( PcdAuthState ( PICC_AUTHENT1A, 63, DefaultKey, MLastSelectedSnr ) == MI_OK ) { /* 校验卡密码 */send_str ( "ok\r\n" );memset ( RevBuffer, 0, 16 );}}}}delay_10ms ( 50 );}
}

STC12C5A60S2的RC522驱动相关推荐

  1. firefly-rk3288j开发板--linux NFC实验之RC522驱动

    firefly-rk3288j开发板–linux NFC实验之RC522驱动 1 准备工作 开发板:aio-rk3288j SDK版本:rk3288_linux_release_20210304 下载 ...

  2. 用51单片机(STC89C52RC、STC12C5A60S2、STC15W104)驱动MzLH03-12864液晶显示模块

    目录 前言 1.软硬件平台 2.硬件焊接 2.1元件: 2.2电路原理图 2.3焊接 3.新建keil工程 3.1新建文件夹 3.2新建工程 3.3新建main.c文件 3.4编写程序 3.5编译项目 ...

  3. 51单片机RC522无线射频IC卡驱动教程

    RC522驱动: 一.硬件连接: SDA--P2.0 SCK--P2.1 MISO--P2.3 MOSI--P2.2 RST--P2.4 IRQ--悬空 二.驱动代码编写: RC522.c文件 /* ...

  4. 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522

    目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3. ...

  5. i.MX283开发板SPI驱动——RC522

    一.Linux下SPI驱动介绍 内核版本:2.6.35 Linux下SPI驱动和I2C驱动很类似,他们都是一种总线,且都不支持热拔插,因为一般情况下spi或者i2c设备都是直接焊接在板子上的,不像US ...

  6. 4412 SPI驱动

    1.Linux主机驱动和外设驱动分离思想(I2C驱动里有) SPI驱动总线架构:SPI核心层(x),SPI控制器驱动层(x),SPI设备驱动层(√).前面两个设备驱动搞明白了可以去看 2.教程中介绍: ...

  7. 一文读懂基于RC522和S50的RFID开发

    基于RC522和S50的RFID开发 1. ISO14443-A协议 ISO14443协议是Contactless card standards(非接触式IC卡标准)协议,由4个部分组成: 物理特性: ...

  8. STM32F103+RTT从零开始(三)—— S50门禁卡复制

    近期因为各种原因,重新租了个房子住,小区外面有门禁系统,楼下也有个门禁系统.房东只给了一套门禁卡,而我家人也需要门禁卡,所以我就去小区物业那里补卡,结果小区物业那里只能补小区的门禁卡,楼下的门禁卡需要 ...

  9. rfid android开发板,iTOP-6818开发板-Android4.4系统下RFID射频模块测试例程

    原标题:iTOP-6818开发板-Android4.4系统下RFID射频模块测试例程 平台:迅为iTOP-6818开发板 系统:Android4.4版本 例程:RFID射频模块测试例程 rc522 驱 ...

最新文章

  1. Python生成随机五位数——模仿手机验证码
  2. 【django】站点管理
  3. 老虎Sitemap生成器 0.3
  4. [ARC072C]Alice in linear land(dp,贪心)
  5. kettle 先删除后插入_Kettle:使用触发器和快照表进行增量数据同步
  6. php里面没有mssql,为什么没有正确使用PHP / MSSQL的日期/时间?
  7. C++类占字节数讲解
  8. 哪里有周末java培训_北京哪里里Java周末学习班
  9. 微信在线接口调试工具的使用
  10. F5LTM(一)逻辑关系图
  11. 西蒙菲莎大学计算机研究性硕士,不只是知名大学:西蒙菲莎大学你需要知道这些!...
  12. Ngrok(内网穿透工具)使用教程详解
  13. cp 复制文件或目录
  14. 复星联合创始人梁信军:3大趋势影响全球经济,区块链将重构社会生产关系
  15. 三菱FX3U与4台台达变频器通讯说明:用三菱FX3U的PLC实现与4台台达变频器modbus通讯
  16. Pureftpd操作指南
  17. HP服务器P410i配置RAID
  18. linux中find的用法
  19. java奶茶店管理系统_GitHub - wangfin/TeaShopManagement: 奶茶店的管理系统
  20. 铁路虚拟服务器,12306内部多图大揭秘:竟然是这个样子

热门文章

  1. 有意识领导力承诺12:一切都是足够的
  2. NODE.JS手机验证码短信发送demo
  3. 《游戏大师Chris Crawford谈互动叙事》一第 1 章 故事叙述
  4. SolrSpringDataSolr
  5. 第一课 R语言下载和安装
  6. lenovo g450 wireless network on ubuntu18.04
  7. VUE3+TS 引入JQuery
  8. 复古传奇登录显示服务器断线,复古传奇闪退黑屏怎么解决-复古传奇闪退的解决方法_快吧手游...
  9. Tomcat 优化方案
  10. 微信小程序scroll-view 横向滚动 显示下拉条的问题