📄 duxiexitongrc500.c
字号:
temp = Secnr * 12;//
//sen(temp);
if (Mode == 0)
{
if (temp >= 0x80) //计算密码存放地址
{
lsb = temp - 0x80;
msb = 0x01;
}
else
{
msb = 0x00;
lsb = temp + 0x80;
}
}
else
{
msb = 0x01;
lsb = temp + 0x40;
}
for(i=0;i<4;i++) //要装入的密钥可根据你所改的密码填写
//{buffer[i]=0x0f;}
//buffer[4]=0xe1;
//buffer[5]=0xd2;
//for(i=6;i<12;i++)
//{buffer[i]=0x0f;}
for(i=0;i<12;i++)
{buffer[i]=0x0f;}
temp =Command_Send(12, buffer, LoadKey);//此处已修改用LoadKey命令
temp = ErrorFlag & 0x40;
if (temp == 0x40)
{
return FALSE;
}
temp= RC500_OK;
CardStatus=0x01;
//for (j=0;j<6;j++)
//sen(gonggongxinxi[j]);
//return TRUE;
}
/****************************************************************/
/*名称: MIF_Read */
/*功能: 该函数实现读MIFARE卡块的数值 */
/*输入: buff: 缓冲区首地址 */
/* Block_Adr: 块地址 */
/*输出: RC500_NOTAGERR: 无卡 */
/* RC500_PARITYERR: 奇偶校验错 */
/*RC500_CRCERR: CRC校验错 */
/* RC500_BYTECOUNTERR: 接收字节错误 */
/* RC500-OK: 应答正确 */
/****************************************************************/
uchar MIF_READ(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
//ModConductance = 0X3f;
ChannelRedundancy = 0x0f;
//Int_Req=0x7f;
buff[0] = RF_CMD_READ;
buff[1] = Block_Adr;
CardStatus=0;
temp = Command_Send(2, buff, Transceive);
//sen(temp);//01
if (temp == 0)
{
CardStatus=0;
return RC500_NOTAGERR;
}
temp = ErrorFlag;
//sen(ErrorFlag);//00
if ((temp & 0x02) == 0x02)
return RC500_PARITYERR;
if((temp & 0x04) == 0x04)
return RC500_FRAMINGERR;
if ((temp & 0x08) == 0x08)
return RC500_CRCERR;
temp = FIFO_Length;//0x10
//sen(temp);
if (temp == 0x10) //8K卡读数据长度为16
{
Read_FIFO(buff);//10
READ_data(temp);
//sen(0x58);
CardStatus=0x01;
return RC500_OK;
}
else if (temp == 0x04) //Token卡读数据长度为16
{
Read_FIFO(buff);
CardStatus=0x01;
return RC500_OK;
}
else
{
CardStatus=0;
return RC500_BYTECOUNTERR;
}
}
/****************************************************************/
/*名称: MIF_Write */
/*功能: 该函数实现写MIFARE卡块的数值 */
/*输入: buff: 缓冲区首地址 */
/* Block_Adr: 块地址 */
/*输出: RC500_NOTAGERR: 无卡 */
/* RC500_BYTECOUNTERR: 接收字节错误 */
/* RC500_NOTAUTHERR: 未经权威认证 */
/* RC500_EMPTY: 数据溢出错误 */
/* RC500_CRCERR: CRC校验错 */
/* RC500_PARITYERR: 奇偶校验错 */
/* RC500_WRITEERR: 写卡块数据出错 */
/* RC500_OK: 应答正确 */
/****************************************************************/
uchar MIF_Write(uchar idata *buff,uchar Block_Adr)
{
uchar idata temp;
//uint i;
uchar idata *F_buff;
CRCPresetLSB = 0x63;
CWConductance = 0x3f;
F_buff = buff + 0x10;
ChannelRedundancy = 0x07;//选择RF 信道上数据完整性检测的类型和模式
*F_buff =RF_CMD_WRITE;
*(F_buff + 1)=Block_Adr;
CardStatus=0;
temp = Command_Send(2, F_buff, Transceive);
//sen(0x07);
if (temp == FALSE)
{CardStatus=0;
return(RC500_NOTAGERR);
}
temp = FIFO_Length;
if (temp == 0)
{CardStatus=0;
return(RC500_BYTECOUNTERR);
}
Read_FIFO(F_buff);//01
temp = *F_buff;
READ_data(temp);
//sen(temp);
switch (temp)
{
case 0x00 :
return(RC500_NOTAUTHERR); //暂时屏蔽掉写错误
case 0x04:
return(RC500_EMPTY);
case 0x0a:
break;
case 0x01:
return(RC500_CRCERR);
case 0x05:
return(RC500_PARITYERR);
default:
return(RC500_WRITEERR);
}
//for(i=0;i<6;i++) ///
//{ buffer[i]=0xff;}
//buffer[6]=0x7F;
//buffer[7]=0x07;
//buffer[8]=0x88;
// buffer[9]=0x69;
//for(i=10;i<16;i++)
//{ buffer[i]=0xff;}
temp = Command_Send(16, buff, Transceive);
if (temp == TRUE)
{
CardStatus=0x01;
return(RC500_OK);
}
else
{CardStatus=0;
temp = ErrorFlag;
//sen(temp);
if ((temp & 0x02)==0x02)
return(RC500_PARITYERR);
else
if((temp & 0x04)==0x04)
return(RC500_FRAMINGERR);
else
if ((temp & 0x08)==0x08)
return(RC500_CRCERR);
else
return(RC500_WRITEERR);
}
}
/****************************************************************/
/*名称: HL_Active */
/*功能: 该函数实现高级MIFARE卡激活命令 */
/*输入: Secnr: 扇区号 */
/* Block_Adr: 块地址 */
/*输出: 操作状态码 */
/* 读出数据存于buffer中 */
/****************************************************************/
uchar HL_Active(uchar Block_Adr,uchar Mode)
{
uchar temp;
CardStatus=0;
Secnr = Block_Adr/4;
MIF_Halt(); //暂停MIFARE卡71 01
temp = Request(RF_CMD_REQUEST_STD); //监测ALL的卡片请求
if(temp != RC500_OK)
{CardStatus=0;
return(RC500_REQERR);
}
temp = AntiColl(); //卡片的防冲突检测读出卡号 71 length 05 6A 8B 2E 0E C1 03
if(temp != RC500_OK)
{CardStatus=0;
return(RC500_ANTICOLLERR);
}
temp = Select_Card(); //71 40 01
if(temp != RC500_OK)
{CardStatus=0;
return(RC500_SELERR);
}
Load_keyE2_CPY((Secnr%16), Mode); //LoadKey
temp = mimarenzhen(UID, Secnr, Mode);
if(temp != RC500_OK)
{CardStatus=0;
return(RC500_AUTHERR);
}
CardStatus=0x01;
return RC500_OK;
}
/****************************************************************/
/*名称: HL_Read */
/*功能: 该函数实现高级读命令 */
/*输入: Secnr: 扇区号 */
/* Block_Adr: 块地址 */
/*输出: 操作状态码 */
/* 读出数据存于buffer中 */
/****************************************************************/
uchar HL_Read(uchar idata *buff,uchar Block_Adr,uchar Mode)
{
uchar temp;
CardStatus=0;
temp = HL_Active(Block_Adr, Mode);
if(temp != RC500_OK)
{
CardStatus=0;
return temp;
}
temp = MIF_READ(buff,Block_Adr);
if(temp != RC500_OK)
{
CardStatus=0;
return temp;
}
//DelayMS(1000);
//P14=0;
//DelayMS(1000); //控制小喇叭
//P14=1;
CardStatus=0x01;
return RC500_OK;
}
/////////////////////////////////////////
/****************************************************************/
/*名称: HL_Write */
/*功能: 该函数实现高级写命令 */
/*输入: buff: 待写入数据的首地址 */
/* Secnr: 扇区号 */
/* Block_Adr: 块地址 */
/*输出:操作状态码 */
/****************************************************************/
/*uchar HL_Write(uchar idata *buff,uchar Block_Adr,uchar Mode)// 写卡
{
uchar temp; ///
CardStatus=0;
temp = HL_Active(Block_Adr, Mode);
if(temp != RC500_OK)
{CardStatus=0;
return temp;
}
temp = MIF_Write(buff,Block_Adr);
if(temp != RC500_OK)
{CardStatus=0;
return temp;
}
CardStatus=0x01;
return RC500_OK;
}
*/
/*--------------------------------------------------------------------
FUNCTION: TurnOff_Card,关卡
INPUT:
OUTPUT: CardStatus
--------------------------------------------------------------------*/
void TurnOff_Card(void)
{
uchar temp;
CardStatus=0;
temp = MIF_Halt();
if(temp != RC500_OK)
{
CardStatus=0;
}
else{
CardStatus=0x01;
}
}
/************************************************
一、 通讯测试,测试单片机与模块通讯是否正常
************************************************/
void Commu_test(void)
{ uchar temp ;
uint i;
//uchar Block_Adr=4;
CardStatus=0;
NCS = FALSE;
MFRST=1;
for (i=0;i<0x1fff; i++)
{
_nop_();
}
MFRST=0;
for(i=0;i<0x1fff;i++)
{
_nop_();
}
while(Command!=0);
RC500_Bus_Sel();
TimerClock=0x0b;
TimerControl=0x02;
TimerReload=0x42;
InterruptEn=0x7f;
temp=InterruptEn;
Int_Req=0x7f;
MFOUTSelect=0x02;//调整输出功率以及电流消耗和操作距离.
TxControl=0x5b;//TX2/1上的输出信号将传递由发送数据调制的13.56MHz能量载波
CardStatus=0x01;
}
/************************************************
一、
寻卡请求
************************************************/
uchar xunka(void)
{ uchar temp;
CardStatus=0;
MIF_Halt(); //暂停MIFARE卡71 01
temp = Request(RF_CMD_REQUEST_ALL);//监测ALL的卡片请求
if(temp != RC500_OK)
{
CardStatus=0;
return(RC500_REQERR);
//for(i=0;i<6;i++)
//sen(cuowufanhui[i]);
}
temp = AntiColl();
//卡片的防冲突检测读出卡号
if(temp != RC500_OK)
{CardStatus=0;
return(RC500_ANTICOLLERR);
}
else{ CardStatus=0x01;
}
}
/////////////////////////////////////////
uchar xiamima(uchar Secnr,uchar Mode)
{
uchar temp;
CardStatus=0;
xunka();//2
temp = Select_Card(); //71 40 01
if(temp != RC500_OK)
{
CardStatus=0;
return(RC500_SELERR);
}
Load_keyE2_CPY((Secnr%16), Mode); //LoadKey
if(CardStatus)
{
CardStatus=0x01;
}
else{
CardStatus=0;
return(RC500_SELERR);
}
}
////////////////////////////////////////////////////////
uchar mimarenzheng(uchar idata *UID,uchar Secnr,uchar mode)
{ uchar temp;
CardStatus=0;
temp=mimarenzhen(UID, Secnr, mode);
if(temp != RC500_OK)
{
CardStatus=0;
return(RC500_SELERR);
}
else{ CardStatus=0x01;
}
}
///////////////////////////////////////////
uchar xiangsheng(void)
{
uchar j;
DelayMS(100);
P14=0;
DelayMS(1000); //控制小喇叭
P14=1;
for (j=0;j<6;j++)
sen(gonggongxinxi[j]);
return(CardStatus);
}
//////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
uchar i,j;
uchar shuju[30];
//uchar CardDataBuf[16];
PCON = 0x00; //波特率控制,SMOD=0
TMOD = 0x20; // //定时器1定时方式2
TH1 = 0xfa; //9600Baud,
TL1 = 0xfa;
SCON = 0x50; //串口方式 1,8bit UART ,SM2=0,REN=1
TI = 0; //发送中断标志位置零
RI = 0; //接收中断标志位置零
TR1 = 1;//启动定时器
//TL1=0xFA;
//TH1 = 0xFA;
//TL0=0xff;
//TH0=0x00;
//TMOD=0x21;
//SCON = 0x50; // 串口工作方式1,允许接收
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -