📄 main.c
字号:
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#include "main.h"
#include "mfrc500.h"
#include "mifare.h"
bit g_bReceOk; //正确接收到上位机指令标志
bit g_bReceAA; //接收到上位机发送的AA字节标志
unsigned char idata g_cReceBuf[64]; //和上位机通讯时的缓冲区
//接收到上位机的通讯命令后该缓冲区内容依次为:长度字2字节+命令码2字节+数据+校验字
unsigned int g_cReceNum; //接收到上位机的字节数
unsigned int g_cCommand; //接收到的命令码
unsigned char g_cSNR[4]; //M1卡序列号
unsigned char g_cCid; //
void main( )
{
InitializeSystem( );
Rc500Ready( );
PcdConfigISOType( 'A' );
while ( 1 )
{
if (g_bReceOk)
{
g_bReceOk=0;
switch(g_cCommand)
{
case 0x0101:
ComSetBound(); break;
case 0x0108:
ComM500PcdConfigISOType(); break;
case 0x010C:
ComPcdAntenna(); break;
case 0x0201:
ComRequestA(); break;
case 0x0202:
ComAnticoll(); break;
case 0x0203:
ComSelect(); break;
case 0x0204:
ComHlta(); break;
case 0x0207:
ComAuthentication(); break;
case 0x0208:
ComM1Read(); break;
case 0x0209:
ComM1Write(); break;
case 0x020A:
ComM1Initval(); break;
case 0x020B:
ComM1Readval(); break;
case 0x020C:
ComM1Decrement(); break;
case 0x020D:
ComM1Increment(); break;
case 0x020E:
ComM1BakValue(); break;
case 0x0212:
ComUL_PcdAnticoll(); break;
case 0x0213:
ComUL_PcdWrite(); break;
default:
AnswerErr( -1 ); break;
}
ES = 1;
}
}
}
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
TMOD &= 0x0F;
TMOD |= 0x21;
PCON |= 0x80;
SCON = 0x50;
TH1 = TL1 = BOUND19200;
TR1=1;
P0 = P1 = P2 = P3 = 0xFF;
IE |= 0x90;
}
/////////////////////////////////////////////////////////////////////
//初始化RC632
/////////////////////////////////////////////////////////////////////
void Rc500Ready()
{
char status;
DelayMs(100);
status = PcdReset();
if(status != MI_OK)
{
DelayMs(10);
status = PcdReset();
}
if(status != MI_OK)
{
DelayMs(10);
status = PcdReset();
}
if(status == MI_OK)
{ LED_GREEN = 0; }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置波特率命令
/////////////////////////////////////////////////////////////////////
void ComSetBound()
{
unsigned char bound = g_cReceBuf[4];
if (bound > 4)
{ AnswerErr(-1); }
else
{
AnswerCommandOk();
TR1 = 0;
switch(bound)
{
case 0:
TH1=TL1=BOUND4800;
break;
case 1:
TH1=TL1=BOUND9600;
break;
case 2:
TH1=TL1=BOUND14400;
break;
case 3:
TH1=TL1=BOUND19200;
break;
case 4:
TH1=TL1=BOUND28800;
break;
default:
break;
}
TR1 = 1;
}
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置A/B方式命令
/////////////////////////////////////////////////////////////////////
void ComM500PcdConfigISOType()
{
if (MI_OK == PcdConfigISOType(g_cReceBuf[4]))
{ AnswerCommandOk(); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的天线命令
/////////////////////////////////////////////////////////////////////
void ComPcdAntenna()
{
if (!g_cReceBuf[4])
{ PcdAntennaOff(); }
else
{ PcdAntennaOn(); }
AnswerCommandOk();
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的寻A卡命令
/////////////////////////////////////////////////////////////////////
void ComRequestA()
{
unsigned char atq[2];
char status;
status = PcdRequest(g_cReceBuf[4], atq);
if (status == MI_OK)
{ AnswerOk(atq,2); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComAnticoll()
{
if (MI_OK == PcdAnticoll(g_cReceBuf))
{ AnswerOk(g_cReceBuf,4); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡锁定命令
/////////////////////////////////////////////////////////////////////
void ComSelect()
{
if (MI_OK == PcdSelect(&g_cReceBuf[4]))
{
memcpy(g_cSNR, &g_cReceBuf[4], 4);
AnswerOk(&g_cReceBuf[0], 1);
}
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡休眠命令
/////////////////////////////////////////////////////////////////////
void ComHlta()
{
if (MI_OK == PcdHalt())
{ AnswerCommandOk(); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡验证密钥命令
//g_cReceBuf[4]:密码验证方式
//g_cReceBuf[5]:要验证的块号
//g_cReceBuf[6]6字节密钥
/////////////////////////////////////////////////////////////////////
void ComAuthentication()
{
char status;
if (MI_OK == ChangeCodeKey(&g_cReceBuf[6],&g_cReceBuf[12])) //转换密钥格式
{
if (MI_OK == PcdAuthKey(&g_cReceBuf[12])) //传送密钥到RC500FIFO
{
status = PcdAuthState(g_cReceBuf[4], g_cReceBuf[5], g_cSNR); //验证密钥
}
}
if (status == MI_OK)
{ AnswerCommandOk(); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机读M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Read()
{
if (MI_OK == PcdRead(g_cReceBuf[4], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 16); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机写M1卡命令
//g_cReceBuf[4]:要写入数据的块号
//g_cReceBuf[5]:连续16字节要写入的数据
/////////////////////////////////////////////////////////////////////
void ComM1Write()
{
if (MI_OK == PcdWrite(g_cReceBuf[4], &g_cReceBuf[5]))
{ AnswerCommandOk(); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机初始化钱包命令
//g_cReceBuf[4]:块号
//g_cReceBuf[5]:4字节初始值,低字节在前
//钱包格式:4字节钱包值+4字节钱包值取反+4字节钱包值+1字节块号+1字节块号取反+1字节块号+1字节块号取反
/////////////////////////////////////////////////////////////////////
void ComM1Initval()
{
g_cReceBuf[9]=~g_cReceBuf[5];
g_cReceBuf[10]=~g_cReceBuf[6];
g_cReceBuf[11]=~g_cReceBuf[7];
g_cReceBuf[12]=~g_cReceBuf[8];
g_cReceBuf[13]=g_cReceBuf[5];
g_cReceBuf[14]=g_cReceBuf[6];
g_cReceBuf[15]=g_cReceBuf[7];
g_cReceBuf[16]=g_cReceBuf[8];
g_cReceBuf[17]=g_cReceBuf[4];
g_cReceBuf[18]=~g_cReceBuf[4];
g_cReceBuf[19]=g_cReceBuf[4];
g_cReceBuf[20]=~g_cReceBuf[4];
if (MI_OK == PcdWrite(g_cReceBuf[4], &g_cReceBuf[5]))
{ AnswerCommandOk(); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机读钱包命令
/////////////////////////////////////////////////////////////////////
void ComM1Readval()
{
if (MI_OK == PcdRead(g_cReceBuf[4], &g_cReceBuf[0]))
{ AnswerOk(&g_cReceBuf[0], 4); }
else
{ AnswerErr(-1); }
}
/////////////////////////////////////////////////////////////////////
//响应上位机扣款命令
//g_cReceBuf[4]:块号
//g_cReceBuf[5]:4字节扣款值,低字节在前
/////////////////////////////////////////////////////////////////////
void ComM1Decrement()
{
if (MI_OK == PcdValue(PICC_DECREMENT, g_cReceBuf[4], &g_cReceBuf[5]))
{ AnswerCommandOk(); }
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -