最经在尝试做基于89c52+RC500的读卡器程序,请教,第一次写不知道思路,按照网上流程,网上的RC500函数库调用,不知道写的十分正确,请各位指教下,第一次写。我估计都是错误的,有可能思路就不对。呵呵。
#include "reg52.h"
#include "rc500.h"
#define uchar unsigned char
#define uint unsigned int
//变量定义区域
uchar Snr_RC500[4]; //用来存放读取的RC500序列号
#define req_code 0x26 //0x26是未进入休眠状态的卡,0x52寻天线区内所有符合14443A标准的卡
uchar status; //用来接收寻卡得到的结果
uchar status2[4]; //用来接收反重装得到的卡号
code uchar Nkey_a[6] = {0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5}; //定义密钥A
code uchar Nkey_b[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //定义密钥B
uchar Nkey_c[12]; //定义用来转换后12字节的密钥
uchar Read_data[16];
uchar KuaiN=0;
//函数声明区域
void init(); //用来初始化系统
void main()
{
init();//初始化系统
PcdReset(); //初始化RC500
PcdReadE2(8,4,Snr_RC500);//读取RC500序列号。
while(1)
{
status=PcdRequest(req_code); //寻找未进入休眠的卡
if(status==MI_OK)
{
status=PcdAnticoll(status2); //反冲撞得到一个卡号,以后所有命令针对该卡,直到该卡被释放
if(status==MI_OK)
{
status=PcdSelect(status2);//选择卡
if(status==MI_OK) //开始验证该卡
{
status=ChangeCodeKey(Nkey_a,Nkey_c); //将密钥转换为RC500接收格式,
if(status==MI_OK)
{
status=PcdAuthKey(Nkey_c); //将已转换格式后的密钥送到RC500的FIFO中
if(status==MI_OK)
{
/* 用存放RC500的FIFO中的密钥和卡上的密钥进行验证 ,0x60:验证A密钥,0x61:验证B密钥
*/
status=PcdAuthState(0x60,KuaiN,status2); //这块有问题,等会解决 kuaiN不是很明白?先找个0代替
if(status==MI_OK)
{
status=PcdRead(KuaiN,Read_data); //读取一个块号中16个字节的数据 //读卡上一块(block)数据(16字节)
if(status==MI_OK)
{
PcdHalt(); //命令卡进入休眠状态
}
}
}
}
}
}
}
}
} |