新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机与RC500射频

51单片机与RC500射频

作者: 时间:2016-11-26 来源:网络 收藏


char PcdRequest(uchar req_code)
{
char status;
idata struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi=&MfComData;
PcdSetTmo(106);
PcdAntennaOn();
WriteRC(RegChannelRedundancy,0x03);
ClearBitMask(RegControl,0x08);//Crypto1on=0
WriteRC(RegBitFraming,0x07);
MfComData.MfCommand=PCD_TRANSCEIVE;
MfComData.MfLength=1;
MfComData.MfData[0]=req_code;
status=PcdComTransceive(pi);
if(!status)
{
if(MfComData.MfLength!=0x10)
{
status=MI_BITCOUNTERR;
}
}
return status;
}

uchar PiccCascAnticoll(uchar *snr)//这个指针变量没有用,但少了就会报错
{
uchar i;
uchar snr_check=0;
char status=MI_OK;
idata struct TranSciveBuffer MfComData;
struct TranSciveBuffer *pi;
pi=&MfComData;
PcdAntennaOn();
PcdSetTmo(106);//设置定时器
WriteRC(RegDecoderControl,0x28);//设置碰撞后接收的所有位都用0表示
ClearBitMask(RegControl,0x08);//Crypto1=0
WriteRC(RegChannelRedundancy,0x03);//使能奇校验
MfComData.MfCommand=PCD_TRANSCEIVE;//发送接收命令
MfComData.MfLength=2;//发送两个字节
MfComData.MfData[0]=PICC_ANTICOLL1;//PICC_ANTICOLL1=93H,PiCC反碰撞指令
MfComData.MfData[1]=0x20;//反碰撞还需要在发送一个20H,即想picc发送两个字节
status=PcdComTransceive(pi);//PcdComTransceive函数将Mfdate中的数据发送给Picc
if(!status)//表示执行命令没出错
{

for(i=0;i<4;i++)//执行命令后返回的前4个字节
{
snr_check^=MfComData.MfData[i];//接收到的前四个字节按位异或存入snr_check中
}
if(snr_check!=MfComData.MfData[i])//判断所接收序列号是否正确
{
status=MI_SERNRERR;//接收到的5个字节出错
}
else
{
for(i=0;i<5;i++)
{
*(snr+i)=MfComData.MfData[i];
}
}

}
ClearBitMask(RegDecoderControl,0x20);
return status;
}

char PcdSelect(uchar *snr,uchar *sar)
{
uchar i;
char status;
uchar snr_check=0;
idata struct TranSciveBuffer{uchar MfCommand;
uchar MfLength;
uchar MfData[7];
}MfComData;
struct TranSciveBuffer *pi;

本文引用地址://m.amcfsurvey.com/article/201611/321654.htm

pi=&MfComData;
PcdSetTmo(106);
WriteRC(RegChannelRedundancy,0x0F);
ClearBitMask(RegControl,0x08);

MfComData.MfCommand=PCD_TRANSCEIVE;
MfComData.MfLength=7;
MfComData.MfData[0]=PICC_ANTICOLL1;
MfComData.MfData[1]=0x70;
for(i=0;i<4;i++)
{
snr_check^=*(snr+i);
MfComData.MfData[i+2]=*(snr+i);
}
MfComData.MfData[6]=snr_check;//select要传7个字节
status=PcdComTransceive(pi);
if(status==MI_OK)
{if(MfComData.MfLength!=0x8)
{
status = MI_BITCOUNTERR;
}
*sar=MfComData.MfData[0];
}
return status;
}


void init()
{
delay(500);
RC500CS=1;//这个位定义在rc500文件里
RC500RST=1;
delay(100);
RC500RST=0;
TMOD=0x20;//串口通讯的设置,采用9600波特率
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x52;
PCON&=0x7f;
TI=0;
delay(10);//这个延时很重要,否则会写不进数据到RC500
}
void main()
{
uchar i,a[5],b[5],status,*snr,c;//传递数组的首地址可以,传递指针必须初始化,且每个指针都要知道指向的地址,所以传递数组比较好
snr=&c;
init();
PcdRequest(PICC_REQALL);
PiccCascAnticoll(a);
for(i=0;i<5;i++)
{
b[i]=a[i];
SBUF=b[i];
while(!TI);
TI=0;
}
status=PcdSelect(b,snr);
SBUF=status;
while(!TI);
TI=0;
SBUF=*snr;
while(!TI);
TI=0;
while(1);
}


上一页 1 2 下一页

关键词:51单片机RC500射

评论


技术专区

关闭