标题:
STC8A8K单片机实现无源RC522模块读写卡程序+资料
[打印本页]
作者:
叁梦
时间:
2019-9-21 15:48
标题:
STC8A8K单片机实现无源RC522模块读写卡程序+资料
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)
2019-9-21 16:37 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
woojoon1981
时间:
2020-5-8 16:33
下载来看看如何
作者:
鱼之跃
时间:
2021-3-15 09:09
真棒 nice
作者:
fancunwu
时间:
2024-3-7 16:23
你反应 读不了卡 不知道啥原因
作者:
甜糖
时间:
2025-7-31 18:49
下载看看能不能用
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1