📄 wrrc500.c
字号:
#include <absacc.h>
#include <reg51.h>
#include <intrins.h>
#include "MfErrNo.h"
#include "Rc500.h"
#include "Rc500reg.h"
#include "time.h"
sfr AUXR = 0x8E;
sfr WDTC = 0xC0;
sfr WDTD = 0x85;
#define uchar unsigned char
#define inf_NACK 0x08 //Tag card error
sbit S_INT = P3^3;
sbit S_RST = P1^0;
sbit RS485_DE = P1^4;
unsigned int MRC500_CNT; //Delay Counter
unsigned char code keya[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsigned char code writeblock6[16]={0x06,0x72,0x10,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,} ;
unsigned char code writeblock8[16]={0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,} ;
unsigned char data snr[4];
unsigned char data databuf[16];
unsigned char receive_len,send_num,send_len;//串口接收字节长度
unsigned char receive_buf[20];
unsigned char send_buf[20];
unsigned char data cardnum[4];
int data j,k,m,n,l;
bit first_receive;
bit send_status;
bit receive_status;
bit read_status;
main()
{
unsigned char tt[2];
int data i;
AUXR = 0x0; /*EXTRAM=1*/
TMOD = 0x21;
TCON = 0x40;
TH1 = 0xF4;//2400
//TH1 = 0xFD;//9600
TH0 = 0xD0;
PCON = 0x00;//SMOD=0;
SCON = 0x50;
RS485_DE=0;
IE = 0x92;//turn on EA,ES,ET0
//EA=0;
TR1 = 1;
TR0 = 0;
WDTC = 0x09;//
WDTD = 0xDD;//
WDTC = WDTC|0x02;//
send_len=0;
receive_status = 0;//一串数据接收成功标志 1-成功
read_status = 0;
for(i=0;i<16;i++)
{
databuf[i]=i;
}
WDTD = 0xDD;
WDTC = WDTC|0x02;
S_RST=0;
for(i=0;i<3000;i++);
S_RST=1;
WDTD = 0xDD;
WDTC = WDTC|0x02;
for(i=0;i<3000;i++);
S_RST=0;
WDTD = 0xDD;
WDTC = WDTC|0x02;
for(i=0;i<3000;i++);
MCRReset_1();
WDTD = 0xDD;
WDTC = WDTC|0x02;
Mf500PcdConfig();
WDTD = 0xDD;
WDTC = WDTC|0x02;
MRC500LoadKey1(keya) ;
WDTD = 0xDD;
WDTC = WDTC|0x02;
while(1)
{
if(Mf500PiccCommonRequest(0x52, tt)!=MI_OK) continue;
WDTD = 0xDD;
WDTC = WDTC|0x02;
j=15;
if(Mf500PiccCascAnticoll(snr)!=MI_OK) continue;
WDTD = 0xDD;
WDTC = WDTC|0x02;
k=25;
if(Mf500PiccCascSelect(snr)!=MI_OK) continue;
WDTD = 0xDD;
WDTC = WDTC|0x02;
m=35;
cardnum[0]=snr[0];
cardnum[1]=snr[1];
cardnum[2]=snr[2];
cardnum[3]=snr[3];
if(MRC500PiccAuthentication( PICC_AUTHENT1A, snr,8)!=MI_OK) continue;
n=45;
WDTD = 0xDD;
WDTC = WDTC|0x02;
//if(Mf500PiccWrite(8,writeblock6)!=MI_OK) continue;
//WDTD = 0xDD;
//WDTC = WDTC|0x02;
if(Mf500PiccRead(8,databuf)!=MI_OK) continue;
l=55;
read_status=1;
WDTD = 0xDD;
WDTC = WDTC|0x02;
delay_1ms(1);
send_buf[0] = 0x70;
send_buf[1] = 0x0A;
send_buf[2] = 0x0A;
if(read_status==1) //有卡
{
send_buf[3] = databuf[0];//取电卡性质
send_buf[4] = databuf[1];//楼栋号
send_buf[5] = databuf[2];//楼层号
send_buf[6] = databuf[3];//房间号
send_buf[7] = databuf[4];//卡号1
send_buf[8] = databuf[5];//卡号2
send_buf[9] = databuf[6];//卡号3
send_buf[10] = databuf[7];//卡号4
//set_checksum(11,send_buf);//加校验码
send_len = 11;
}
else //无卡
{
send_buf[3] = 0x00;
send_buf[4] = 0x00;
send_buf[5] = 0x00;
send_buf[6] = 0x00;
//set_checksum(7,send_buf);//加校验码
send_len =9;
}
send_num = 1;
send_status = 1;
receive_status = 0;
// }
// rc500_status = MCRReset_1();
read_status =0;
// Mf500PiccHalt() ;
}
}
///////////////////////////////////////////////////////////////////////
// M I F A R E M O D U L E C O N F I G U R A T I O N
///////////////////////////////////////////////////////////////////////
void Mf500PcdConfig(void)
{
RegClockQControl=0x0;
RegClockQControl=0x40;
MRC500_CNT=0;
while(MRC500_CNT <= 10000){MRC500_CNT+=1;} //About 20 ms
RegClockQControl = RegClockQControl & (~0x40);
// The following values for RegBitPhase and
// RegRxThreshold represents an optimal
// value for our demo package. For user
// implementation some changes could be
// necessary
// initialize bit phase
RegBitPhase=0xAD;
// initialize minlevel
RegRxThreshold=0xFF;
// disable auto power down
RegRxControl2=1;
// Depending on the processing speed of the
// operation environment, the waterlevel
// can be adapted. (not very critical for
// mifare applications)
// initialize waterlevel to value 4
RegFIFOLevel=0x1A; // initialize to 26d
//Timer Konfiguration
RegTimerControl=0x02; // TStopRxEnd=0,TStopRxBeg=0,
// TStartTxEnd=1,TStartTxBeg=0
// timer must be stopped manually
RegIRqPinConfig=0x3; // interrupt active low enable
PcdRfReset(1); // Rf - reset and enable output driver
}
//////////////////////////////////////////////////////////////////////
// RF R E S E T
///////////////////////////////////////////////////////////////////////
void PcdRfReset(unsigned char ms)
{
RegTxControl = RegTxControl & (~0x03);
if (ms > 0)
{
MRC500_CNT=0;
while(MRC500_CNT <=10000){MRC500_CNT+=1;}
RegTxControl = RegTxControl | 0x03;
}
}
///////////////////////////////////////////////////////////////////////
// S e t T i m e o u t L E N G T H
///////////////////////////////////////////////////////////////////////
void PcdSetTmo(unsigned char tmoLength)
{
switch(tmoLength)
{ // timer clock frequency 13,56 MHz
case 1: // short timeout (1,0 ms)
RegTimerClock=0x07; // TAutoRestart=0,TPrescale=128
RegTimerReload=0x6a;// TReloadVal = 'h6a =106(dec)
break;
case 2: // medium timeout (1,5 ms)
RegTimerClock=0x07; // TAutoRestart=0,TPrescale=128
RegTimerReload=0xa0;// TReloadVal = 'ha0 =160(dec)
break;
case 3: // long timeout (6 ms)
RegTimerClock=0x09; // TAutoRestart=0,TPrescale=4*128
RegTimerReload=0xa0;// TReloadVal = 'ha0 =160(dec)
break;
case 4: // long timeout (9.6 ms)
RegTimerClock=0x09; // TAutoRestart=0,TPrescale=4*128
RegTimerReload=0xff;// TReloadVal = 'ff =255(dec)
break;
default: // short timeout (1,0 ms)
RegTimerClock=0x07; // TAutoRestart=0,TPrescale=128
RegTimerReload=tmoLength;// TReloadVal = tmoLength
break;
}
}
//-------------------------------------------------------------
char MCRReset_1(void)
{
char i;
while((RegCommand & 0x3F));
RegPage=0;//0x80;//WriteRawRC(RegPage,0x80); // Dummy access in order to determine the bus
// configuration
// necessary read access
// after first write access, the returned value
// should be zero ==> interface recognized
if (RegCommand != 0x00)//if (ReadRawRC(RegCommand) != 0x00)
{
i = MI_INTERFACEERR;
}
else
{
i = MI_OK; // sequence is ok
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -