STC最新的STC系列单片机可以实现RFID的读卡,写卡,擦除卡的操作,有源码和上位机
单片机源程序如下:
- /****************************************Copyright (c)****************************************************
- **
- **
- **
- **--------------File Info---------------------------------------------------------------------------------
- ** File name: main.c
- ** Last modified Date:
- ** Last Version:
- ** Descriptions:
- **--------------------------------------------------------------------------------------------------------
- ** Created by: FiYu
- ** Created date: 2018-2-1
- ** Version: 1.0
- ** Descriptions: 无源RFID MFRC522实验
- **--------------------------------------------------------------------------------------------------------
- ** Modified by:
- ** Modified date:
- ** Version:
- ** Descriptions:
- ** Rechecked by:
- **********************************************************************************************************/
- #include <string.h>
- #include "uart.h"
- #include "rc522.h"
- #include "UartComm.h"
- #define READ_CARD 0x10
- #define WRITE_CARD 0x11
- #define MODIFY_PASSWORD 0x12
- #define RECE_CMD FrameReceInfo.buf[1] //命令
- #define BLOCK_NUM FrameReceInfo.buf[2] //块号
- /**********************
- 引脚别名定义
- ***********************/
- sbit LED_B=P0^7; //RGB蓝色LED用IO口P07
- xdata uint8 uartReceBuf[20];
- xdata uint8 WriteDat[16];
- //M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
- //4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
- //uint8_t code data2[4] = {0,0,0,0x01};
- uint8 CardKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
- uint8 NewKey[16];
- uint8 xdata g_ucTempbuf[20];
- void RC522_Init(void)
- {
- RC522_Reset();
- PcdAntennaOff();
- //PcdAntennaOn();
- M500PcdConfigISOType( 'A' );
- }
- uint8 CardHanding(void)
- {
- uint8 status,i;
-
- status = RC522_Request(PICC_REQIDL, g_ucTempbuf);//寻卡,返回卡的类型:2个字节
- if(status != MI_OK) return 0;
- if(RECE_CMD == READ_CARD)for(i=0;i<2;i++)U1SendData(g_ucTempbuf[i]); //发送卡类型,2个字节 只有接收到读卡命令才发送
- status = RC522_Anticoll(g_ucTempbuf);//防冲撞,返回卡的序列号:4字节
- if(status != MI_OK) return 0;
- if(RECE_CMD == READ_CARD)for(i=0;i<4;i++)U1SendData(g_ucTempbuf[i]); //发送卡号,4个字节 只有接收到读卡命令才发送
- status = PcdSelect(g_ucTempbuf);//选定卡片
- if(status != MI_OK) return 0;
-
- switch(RECE_CMD) //解析命令
- {
- case READ_CARD: // 读卡
- memcpy(CardKey,&FrameReceInfo.buf[3],6); //拷贝密码
- status = PcdAuthState(PICC_AUTHENT1A, BLOCK_NUM, CardKey, g_ucTempbuf);//验证卡片密码
- if(status != MI_OK) return 0;
- status = PcdRead(BLOCK_NUM, g_ucTempbuf);//读块
- if(status != MI_OK) return 0;
- for(i=0;i<16;i++)U1SendData(g_ucTempbuf[i]); //发送读出的内容,16个字节
- PcdHalt();
- break;
-
- case WRITE_CARD: //写卡
- memcpy(CardKey,&FrameReceInfo.buf[3],6); //拷贝密码
- memcpy(WriteDat,&FrameReceInfo.buf[9],16); //拷贝待写入的数据
- status = PcdAuthState(PICC_AUTHENT1A, BLOCK_NUM, CardKey, g_ucTempbuf);//验证卡片密码
- if(status != MI_OK) return 0;
- status = PcdWrite(BLOCK_NUM, WriteDat); //写块
- if(status != MI_OK) return 0;
- PcdHalt();
- break;
-
- case MODIFY_PASSWORD: //修改密码
- memcpy(CardKey,&FrameReceInfo.buf[3],6); //拷贝待写入的数据
- for(i=0;i<6;i++)NewKey[i] = FrameReceInfo.buf[9+i];//拷贝新密码
- for(i=0;i<6;i++)NewKey[i+10] = FrameReceInfo.buf[9+i];
- NewKey[6] = 0xFF;
- NewKey[7] = 0x07;
- NewKey[8] = 0x80;
- NewKey[9] = 0x69;
- status=PcdAuthState(PICC_AUTHENT1A,BLOCK_NUM,CardKey,g_ucTempbuf);
- if(status!=MI_OK) return 0;
- status=PcdWrite(BLOCK_NUM,&NewKey[0]);
- if(status!=MI_OK)
- return 0;
- PcdHalt();
- break;
- }
- return 0;
- }
- /***************************************************************************
- * 描 述 : 主函数
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************/
- int main()
- {
- P3M1 &= 0xFE; P3M0 &= 0xFE; //设置P3.0为准双向口
- P3M1 &= 0xFD; P3M0 |= 0x02; //设置P3.1为推挽输出
-
- Uart1_Init();
- RC522_Init();
- EA = 1;
- while(1)
- {
- if(UartReceFrame() == UART_FRAME_AVAIL)//串口接收到数据?
- {
- CardHanding();
- LED_B = ~LED_B;
- }
- }
- }
复制代码
所有资料51hei提供下载:
无源RFID RC522实验.7z
(7.61 MB, 下载次数: 197)
|