📄 main.c
字号:
#include "reg52.h"
#include <string.h>
#include <intrins.h>
#include <absacc.h>
#include "main.h"
#include "slrc500.h"
#include "iso14443a.h"
bit g_bReceOk; //正确接收到上位机指令标志
bit g_bRc500Ok; //RC500复位正常标志
unsigned int data g_cCommand; //接收到的命令码
unsigned char data g_cSNR[4]; //M1卡序列号
unsigned char g_cCidNad; //
unsigned char idata g_cReceBuf[64]; //和上位机通讯时的缓冲区
struct TranSciveBuffer{unsigned char MfCommand;
unsigned int MfLength;
unsigned char MfData[64];
};
void main( )
{
InitializeSystem( ); //系统初始化
Rc500Ready( ); //初始化RC500
PcdConfigISOType( 'A' );
while ( 1 )
{
if (g_bReceOk) //正确接收到上位机指令标志
{
g_bReceOk = 0;//清上位机指令标志
g_cCommand=g_cReceBuf[0];//从接收缓冲区中读取数据
switch(g_cCommand)
{
case 13:
ComSetBound(); break;//设置波特率
case 2:
ComRequestA(); break;//响应上位机发送的寻A卡命令
case 3:
ComAnticoll(); break;//防冲突
case 4:
ComSelect(); break;//选卡
case 5:
ComM500PiccAuthE2(); break;
case 6:
ComM500PcdLoadKeyE2(); break;
case 1:
ComHlta(); break;
case 7:
ComAuthentication(); break;
case 8:
ComM1Read(); break;//读卡
case 9:
ComM1Write(); break;//写卡
case 10:
ComM1Decrement(); break;
case 11:
Comsond(); break;
case 12: // 参数设置
g_cReceBuf[0]=1; //contact
g_cReceBuf[1]=0;
break;
}
ES = 1;
}
}
}
///////////////////////////////////////////////////////////////////
//////
///////////////////////////////////////////////////////////////////
void Comsond()
{
g_cReceBuf[0]=1; //contact
g_cReceBuf[1]=0;
AnswerOk();
sond = 0;
DelayMs(200);
DelayMs(200);
sond = 1;
}
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
TMOD &= 0x0F; //
TMOD |= 0x21; //定时器0为方式0,定时器1为方式2.软件启动定时器
PCON |= 0x80; //SMOD=1;串行口用于方式1、2、3时波特率加倍
SCON = 0x50; //10位异步收发(方式1),波特率可变,REN = 1(可以接收)
TH1 = TL1 = BOUND9600; //波特率9.6k
TR1=1; //启动定时器1
P0 = P1 = P2 = P3 = 0xFF;//IO端口初始化
IE |= 0x90; //EA=1,ES=1;CPU中断允许,串行口中断允许
}
/////////////////////////////////////////////////////////////////////
//初始化RC500
/////////////////////////////////////////////////////////////////////
void Rc500Ready()
{
char status;
DelayMs(100);
DelayMs(100);
DelayMs(100);
DelayMs(100);
DelayMs(100);
DelayMs(100);
DelayMs(100);
status = PcdReset();
if(status != MI_OK)
{
DelayMs(10);
status = PcdReset();//假如复位不成功,连续三次复位
}
if(status != MI_OK)
{
DelayMs(10);
status = PcdReset();
}
if(status == MI_OK)
{
g_bRc500Ok = 1;
sond = 1; //蜂鸣器响一声,表示RC500复位成功
DelayMs(200);
DelayMs(200);
sond = 0;
}
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置波特率命令
/////////////////////////////////////////////////////////////////////
void ComSetBound()
{
unsigned char bound = g_cReceBuf[1];
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;
case 5:
TH1=TL1=BOUND38400;
break;
case 6:
TH1=TL1=BOUND57600;
break;
case 7:
TH1=TL1=BOUND115200;
break;
default:
break;
}
g_cReceBuf[0]=1; //contact
g_cReceBuf[1]=0;
AnswerOk();
DelayMs(20);
TR1 = 1;
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的寻A卡命令
/////////////////////////////////////////////////////////////////////
void ComRequestA()
{
char status;
status = PcdRequest(g_cReceBuf[1], &g_cReceBuf[2]);
if (status != MI_OK)
{ status = PcdRequest(g_cReceBuf[1], &g_cReceBuf[2]); }
if (status != MI_OK)
{
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
return;
}
if(g_cReceBuf[2]==2)
g_cCidNad=mifarepro; // Mifare Pro 卡
else if(g_cReceBuf[2]==4)
g_cCidNad=mifare1; // Mifare One 卡
else if(g_cReceBuf[2]==16)
g_cCidNad=mifarelight; // Mifare Light 卡
else g_cCidNad=unknowncard;
g_cReceBuf[0]=3;
g_cReceBuf[1]=status;
AnswerOk();
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComAnticoll()
{
char status;
status=PcdAnticoll(&g_cSNR);
if (status!=MI_OK )
{
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
return;
}
g_cReceBuf[2]=g_cSNR[0];
g_cReceBuf[3]=g_cSNR[1];
g_cReceBuf[4]=g_cSNR[2];
g_cReceBuf[5]=g_cSNR[3];
//memcpy(g_cReceBuf[2],&g_cSNR,4);
g_cReceBuf[0]=5;
g_cReceBuf[1]=status;
AnswerOk();
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡锁定命令
/////////////////////////////////////////////////////////////////////
void ComSelect()
{
char status;
status=PcdSelect(g_cSNR, &g_cReceBuf[2]);
if (status!=MI_OK)
{
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
return;
}
g_cReceBuf[0]=3;
g_cReceBuf[1]=status;
AnswerOk();
}
////////////////////////////////////////////////////////////////////////
///校验密码
///////////////////////////////////////////////////////////////////////
void ComM500PiccAuthE2()
{
char status;
unsigned char *pSNR;
pSNR = &g_cSNR;
status=PcdLoadKeyE2(g_cReceBuf[1],g_cReceBuf[2]);
if(status==0)
{
status = PcdAuthState(g_cReceBuf[1], g_cReceBuf[3], pSNR); //验证密钥
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
return;
}
AnswerOk();
}
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
///下载密码
///////////////////////////////////////////////////////////////////////
void ComM500PcdLoadKeyE2()
{
char status;
status=M500PcdLoadKeyE2(g_cReceBuf[1],g_cReceBuf[2],&g_cReceBuf[3]);
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡休眠命令
/////////////////////////////////////////////////////////////////////
void ComHlta()
{
unsigned char status;
status=PcdHalt();
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
}
/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡验证密钥命令
/////////////////////////////////////////////////////////////////////
void ComAuthentication()
{
char status = MI_COM_ERR;
unsigned char *pkeys,*pSNR;
pkeys = &g_cReceBuf[20];
pSNR = &g_cSNR;
if (MI_OK == ChangeCodeKey(&g_cReceBuf[3],pkeys)) //转换密钥格式
{
if (MI_OK == PcdAuthKey(pkeys)) //传送密钥到RC500FIFO
{
status = PcdAuthState(g_cReceBuf[1], g_cReceBuf[3], pSNR); //验证密钥
}
}
if (status == MI_OK)
{ g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
}
}
/////////////////////////////////////////////////////////////////////
//响应上位机读M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Read()
{
char status;
status=PcdRead(g_cReceBuf[1], &g_cReceBuf[2]);
if (status==MI_OK)
{
if(g_cCidNad==mifare1||g_cCidNad==mifarepro)
g_cReceBuf[0]=17;
else if(g_cCidNad==1)
g_cReceBuf[0]=9;
else g_cReceBuf[0]=16;
g_cReceBuf[1]=status;
AnswerOk();
return;
}
else
{ g_cReceBuf[0]=1; }
g_cReceBuf[1]=status;
AnswerOk();
}
/////////////////////////////////////////////////////////////////////
//响应上位机写M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Write()
{
char status;
status=PcdWrite(g_cReceBuf[1], &g_cReceBuf[2]);
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
}
/////////////////////////////////////////////////////////////////////
//响应上位机扣款命令 充值命令
/////////////////////////////////////////////////////////////////////
void ComM1Decrement()
{
char status;
status=PcdValue(g_cReceBuf[1], g_cReceBuf[2], &g_cReceBuf[3]);
if (status==MI_OK)
{
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
return;
}
g_cReceBuf[0]=1;
g_cReceBuf[1]=status;
AnswerOk();
return;
}
/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答
//input:answerdata = 应答数据
// answernum = 数据长度
/////////////////////////////////////////////////////////////////////
void AnswerOk()
{
unsigned char len, i;
ES = 0; //不允许串行中断
TI=0; //清发送标志位
len=g_cReceBuf[0]; //长度
for(i=0;i<len+1;i++) //发送
{
SBUF=g_cReceBuf[i];
while(!TI);
TI=0;
}
TI = 0;
ES = 1;
}
/////////////////////////////////////////////////////////////////////
//串行中断,接收上位机数据
/////////////////////////////////////////////////////////////////////
seri_int () interrupt 4 using 1
{
unsigned char len, i;
unsigned int j=0;
if (RI)
{
ES=0;
len=SBUF; //首先接收数据包长度
RI=0;
for(i=0;i<len;i++)
{
while(!RI) //假如没有接收到第二个数据(命令字),则等待
{
j++;
if(j>1000) //超时退出接收中断
{
ES = 1;
break;
}
}
if(j<1000) //不超时超时
{
g_cReceBuf[i]=SBUF; //读出命令字和数据
RI=0;
j=0;
}
else //超时退出接收中断
{
ES = 1;
break;
}
}
if(i==len) //接收的个数与数据包长度一致接收正常
{
ES = 1;
g_bReceOk = 1; //置接收完成标志位
}
}
}
/////////////////////////////////////////////////////////////////////
//用T2做延时子程序
/////////////////////////////////////////////////////////////////////
void DelayMs(unsigned int _MS)
{
RCAP2LH = RCAP2_1ms;
T2LH = RCAP2_1ms;
ET2 = 0; // Disable timer2 interrupt
T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
TR2 = 1; //启动定时器2
while (_MS--)
{
while (!TF2); //判断有没有溢出
TF2 = 0;
}
TR2 = 0;
}
void Delay_50us(unsigned char _50us)
{
RCAP2LH = RCAP2_50us;
T2LH = RCAP2_50us;
ET2 = 0; // Disable timer2 interrupt
T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
while (_50us--)
{ while (!TF2);TF2 = 0; }
TR2 = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -