RC522 读卡器和写卡器 读写测试程序----基于cc2530开发板
来源:互联网 发布:xampp中mysql定时重启 编辑:程序博客网 时间:2024/05/17 08:35
RC522 写卡器操作步骤:1)寻卡,2)防冲突;3)选卡;4)授权;5)写操作;6)读操作;具体步骤见源码,红色的部分是我增加的代码,其它的都是开发板自带的代码;
/***************************************************************************** 文 件 名: main.c* 描 述: 读写RFID****************************************************************************/#include <ioCC2530.h>#include <string.h>#include "LCD.h"#include "mfrc522.h"typedef unsigned char uchar;typedef unsigned char uint8;typedef unsigned int uint;typedef unsigned long ulong;#define ON 0#define OFF 1#define LED1 P1_0 //定义P1.0口为LED1控制端#define LED2 P1_1 //定义P1.1口为LED2控制端#define LED3 P1_4 //定义P1.4口为LED3控制端#define BUZZER_PIN P0_7 //蜂鸣器控制脚#define KEY1 0x01#define KEY2 0x02//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反 unsigned char data2[4] = {0x12,0,0,0};unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; unsigned char g_ucTempbuf[20]; unsigned char MLastSelectedSnr[4];unsigned char RevBuffer[30]; unsigned char SerBuffer[20]; unsigned char CmdValid; unsigned char waitCommData=1;int data_len=0;int data_index=0;/***************************************************************************** 名 称: InitLed()* 功 能: 设置LED灯相应的IO口* 入口参数: 无* 出口参数: 无****************************************************************************/void InitLed(void){ P1DIR |= 0x13; //P1.0、P1.1、p1.4定义为输出 LED1 = 1; //默认LED灯为熄灭状态 LED2 = 1; LED3 = 1; P0_7=1;}void InitUart0(void){ PERCFG &= ~ 0x01; //外设控制寄存器 USART 0的IO位置:0为P0口位置1 P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能) P2DIR &= ~0xC0; //P0优先作为UART0 U0CSR |= 0x80; //设置为UART方式 U0GCR |= 11; U0BAUD |= 216; //波特率设为115200 UTX0IF = 0; //UART0 TX中断标志初始置位0 U0CSR |= 0x40; //允许接收 IEN0 |= 0x84; //开总中断允许接收中断 }/***************************************************************************** 名 称: UART0_ISR(void) 串口中断处理函数 * 描 述: 当串口0产生接收中断,将收到的数据保存在RxBuf中****************************************************************************/#pragma vector = URX0_VECTOR __interrupt void UART0_ISR(void) { unsigned char bbb=U0DBUF; URX0IF=0;if(waitCommData>0){waitCommData=0;data_len=U0DBUF;data_index=0;memset(RevBuffer, 0, sizeof(RevBuffer));}else{RevBuffer[data_index]=U0DBUF;data_index++;if(data_len==data_index){U0CSR &= ~0x40; //禁止接收 CmdValid=1;waitCommData=1; U0CSR |= 0x40;}}}void Uart0SendString(char *Data, int len){uint i;for(i=0; i<len; i++){U0DBUF = *Data++;while(UTX0IF == 0);UTX0IF = 0;}}void InitClockTo32M(void){ CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ晶振 while(CLKCONSTA & 0x40); //等待晶振稳定 CLKCONCMD &= ~0x47; //设置系统主时钟频率为 32MHZ}void iccardcode(){ unsigned char cmd;unsigned char status;cmd = RevBuffer[0];switch(cmd) {case 1: // Halt the card //终止卡的操作status= PcdHalt();;RevBuffer[0]=1;RevBuffer[1]=status;break;case 2: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes) // 寻卡,防冲突,选择卡 返回卡类型(2 bytes)+ 卡系列号(4 bytes)status= PcdRequest(RevBuffer[1],&RevBuffer[2]);if(status!=0){status= PcdRequest(RevBuffer[1],&RevBuffer[2]);if(status!=0){RevBuffer[0]=1;RevBuffer[1]=status;break;}} RevBuffer[0]=3;RevBuffer[1]=status;break;case 3: // 防冲突 读卡的系列号 MLastSelectedSnrstatus = PcdAnticoll(&RevBuffer[2]);if(status!=0){RevBuffer[0]=1;RevBuffer[1]=status;break;}memcpy(MLastSelectedSnr,&RevBuffer[2],4);RevBuffer[0]=5;RevBuffer[1]=status;break;case 4: // 选择卡 Select Cardstatus=PcdSelect(MLastSelectedSnr);if(status!=MI_OK){RevBuffer[0]=1;RevBuffer[1]=status;break;}RevBuffer[0]=3;RevBuffer[1]=status;break;case 5: // Key loading into the MF RC500's EEPROM status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校验卡密码RevBuffer[0]=1;RevBuffer[1]=status;break;case 6: RevBuffer[0]=1;RevBuffer[1]=status;break;case 7: RevBuffer[0]=1;RevBuffer[1]=status;break;case 8: // Read the mifare card // 读卡status=PcdRead(RevBuffer[1],&RevBuffer[2]);if(status==0){RevBuffer[0]=17;}else{RevBuffer[0]=1;}RevBuffer[1]=status;break;case 9: // Write the mifare card // 写卡 下载密码status=PcdWrite(RevBuffer[1],&RevBuffer[2]);RevBuffer[0]=1;RevBuffer[1]=status;break;case 10: PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);RevBuffer[0]=1;RevBuffer[1]=status;break;case 12: // 参数设置 PcdBakValue(RevBuffer[1], RevBuffer[2]);RevBuffer[0]=1;//contactRevBuffer[1]=0;break;}}///////////////////////////////////////////////////////////////////////系统初始化/////////////////////////////////////////////////////////////////////void InitializeSystem(){ //P0_4、P0_5、P0_6、p1_0和p1_1用于控制RFID //P0_7用于控制蜂鸣器 P0DIR |= 0xF0; //P0_4、P0_5、P0_6、P0_7定义为输出 P1DIR |= 0x03;//p1_0、p1_1输出 P0 |= 0xF0; //P0_4、P0_5、P0_6、P0_7输出1 P1 |= 0x03; //P1_0输出高电平 CmdValid=0; PcdReset(); PcdAntennaOff(); PcdAntennaOn(); M500PcdConfigISOType( 'A' ); delay_10ms(10);LED2=OFF; delay_10ms(10);}//BCD码转成ASC码char NumberToLetter(unsigned char number){char buff[]="0123456789ABCDEF";if(number>15) return 0;return buff[number];}//蜂鸣器响两声void buzzerOn(){ BUZZER_PIN=0; DelayMS(200); BUZZER_PIN=1; DelayMS(50); BUZZER_PIN=0; DelayMS(200); BUZZER_PIN=1;}void main(void){ uint8 SendBuf[10]={0}; uint8 error=0; InitLed();InitializeSystem();InitClockTo32M();InitUart0(); LCD_Init(); LCD_CLS(); LCD_P8x16Str(20, 0, "SZ_YY RFID"); //周期地在寻卡while (1){ //寻卡命令 RevBuffer[0]=0x02; RevBuffer[1]=0x26; // 寻卡 iccardcode(); error=0; if(RevBuffer[1]==0)//寻卡成功 { //读卡命令 SendBuf[0]=RevBuffer[2]; //data SendBuf[1]=RevBuffer[3]; //data //找到卡 //读卡 RevBuffer[0]=0x03; iccardcode(); if(RevBuffer[1]==0) { //读卡成功 //记录卡ID SendBuf[2]=RevBuffer[2]; //data SendBuf[3]=RevBuffer[3]; //data SendBuf[4]=RevBuffer[4]; //data SendBuf[5]=RevBuffer[5]; //data } else { error=1; } } else { error=1; } if(error==0) { char card_buff[20]={0}; //各种卡的含义 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire if(SendBuf[0]==0x44 && SendBuf[1]==0x00) { LCD_P8x16Str(0, 2, "Mifare_UltraLight"); Uart0SendString((uint8 *)"Mifare_UltraLight", strlen("Mifare_UltraLight")); } else if(SendBuf[0]==0x04 && SendBuf[1]==0x00) { LCD_P8x16Str(0, 2, "Mifare_One(S50)"); Uart0SendString((uint8 *)"Mifare_One(S50)", strlen("Mifare_One(S50)")); } else if(SendBuf[0]==0x02 && SendBuf[1]==0x00) { LCD_P8x16Str(0, 2, "Mifare_One(S70)"); Uart0SendString((uint8 *)"Mifare_One(S70)", strlen("Mifare_One(S70)")); } else if(SendBuf[0]==0x08 && SendBuf[1]==0x00) { LCD_P8x16Str(0, 2, "Mifare_One(X)"); Uart0SendString((uint8 *)"Mifare_One(X)", strlen("Mifare_One(X)")); } else if(SendBuf[0]==0x44 && SendBuf[1]==0x03) { LCD_P8x16Str(0, 2, "Mifare_DESFire"); Uart0SendString((uint8 *)"Mifare_DESFire", strlen("Mifare_DESFire")); } else { error=1; LCD_P8x16Str(0, 2, ""); LCD_P8x16Str(0, 4, ""); Uart0SendString((uint8 *)"find error", strlen("find error")); } Uart0SendString((uint8 *)"\r\n", 2); /* card_buff[0]='I'; card_buff[1]='D'; card_buff[2]=':'; //BCD转ASC码 //ID轮换 for(int i=0; i<4; i++) { unsigned char temp= SendBuf[2+i]; card_buff[3+i*2]=NumberToLetter((temp>>4)&0x0f); card_buff[3+i*2+1]=NumberToLetter(temp&0x0f); } //LCD显示ID LCD_P8x16Str(0, 4,card_buff); //串口输出ID Uart0SendString(card_buff, strlen(card_buff)); Uart0SendString((uint8 *)"\r\n", 2); //蜂鸣器提示 buzzerOn(); */ <span style="color:#ff0000;"> //选择卡 RevBuffer[0]=0x04; iccardcode(); //授权 RevBuffer[0]=0x05; RevBuffer[1]=0x60; RevBuffer[3]=0x06; iccardcode(); if(RevBuffer[1]==0) { //授权成功,进行写操作 //mifire卡写卡 RevBuffer[0]=0x09; RevBuffer[1]=0x06; for(int j=0;j<16;j++) { RevBuffer[j+2]=j; } iccardcode(); //mifire 卡读卡; RevBuffer[0]=0x08; RevBuffer[1]=0x06; //清空缓存区 for(int j=0;j<16;j++) { RevBuffer[j+2]=0; } iccardcode(); //LCD显示读到的数据 for(int i=0; i<8; i++) { unsigned char temp= RevBuffer[2+i]; card_buff[i*2]=NumberToLetter((temp>>4)&0x0f); card_buff[i*2+1]=NumberToLetter(temp&0x0f); } LCD_P8x16Str(0, 4,card_buff); Uart0SendString((uint8 *)"\r\n", 2);</span> } } else { //寻不到卡 LCD_P8x16Str(0, 2," "); LCD_P8x16Str(0, 4," "); } DelayMS(500);} }
0 0
- RC522 读卡器和写卡器 读写测试程序----基于cc2530开发板
- 基于ARM、linux的MF RC522射频读卡器
- 基于ARM、linux的MF RC522射频读卡器
- 13.56M读卡器开发详解二(RC522驱动程序)
- IC卡读卡器测试程序
- USB接口ID卡读卡器oem软件/读写卡测试程序及源代码/c++builder源代码
- USB接口ID卡读卡器oem软件/读写卡测试程序及源代码/DELPHI源代码
- USB接口ID卡读卡器oem软件/读写卡测试程序及源代码/VB.net源代码
- USB接口ID卡读卡器oem软件/读写卡测试程序及源代码/VB源代码
- USB接口ID卡读卡器oem软件/读写卡测试程序及源代码/c++builder源代码 (2)
- RC522读卡器 M1卡 学习总结(一)
- RC522读卡器 M1卡学习总结(二)
- 485读头(带液显)测试程序-c++builder(读卡器)
- ARM Linux 2.6.36 内核 USB读卡器 测试程序
- NFC-9系列RFID读卡器基于MFC与Qt开发
- RFID-RC522速成教程(基于msp430单片机的程序讲解)
- TIMAC 开发随笔 一:CC2530的flash在线读写
- 读卡器 软件开发,usb接口,键盘口,串口程序
- MySQL视图使用详解
- Java 中字符串拼接 String 和 StringBuilder(StringBuffer)的使用
- ASP.NET+IIS+Access发布网站出现HTTP 错误 404.0 - Not Found
- 关于道格拉斯算法的一些思考
- 安装、配置、使用kermit
- RC522 读卡器和写卡器 读写测试程序----基于cc2530开发板
- 太上感应篇0005
- leetcode笔记:Subsets II
- expect
- Java 去除字符串中多余的空格,只留一个
- UIScrollView新手教程
- 计算机编程语言发展史
- 大师带你学大数据
- 太上感应篇0006