打印

想做一个52+RC500的读卡器,但老是寻不到卡,求指点

[复制链接]
1750|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kelianco|  楼主 | 2013-5-10 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <RC500.h>
#include <math.h>

sbit     data1=P3^3;
sbit     data0=P3^2;
sbit     beep=P1^4;
sbit     grn=P1^5;
sbit     red=P1^7;
sbit     rst500=P3^5;

unsigned char buff[20],Card_UID[5];

void Nop(void)
{
unsigned char i;
for(i=0;i<5;i++)
   {
   }
}

//============================================


//=====================================================



char PcdRequest(uchar req_code)
{
   char status;
   idata struct TranSciveBuffer {uchar MfCommand;
                                 uchar MfLength;
                                 uchar MfData[1];
                                }MfComData;
   struct TranSciveBuffer *pi;

   pi=&MfComData;
   PcdSetTmo(106);
   WriteRC(RegChannelRedundancy,0x03);
   ClearBitMask(RegControl,0x08);
   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;
}                 

//----------------------------------------------------------

char PcdAnticoll(uchar *snr)
{
    uchar i;
    uchar snr_check=0;
    char status=MI_OK;
    idata struct TranSciveBuffer{uchar MfCommand;
                                 uchar MfLength;
                                 uchar MfData[5];
                                }MfComData;
    struct TranSciveBuffer *pi;

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

    MfComData.MfCommand=PCD_TRANSCEIVE;
    MfComData.MfLength=2;
    MfComData.MfData[0]=PICC_ANTICOLL1;
    MfComData.MfData[1]=0x20;
    status=PcdComTransceive(pi);
    if(!status)
    {
             for(i=0;i<4;i++)
         {
             snr_check^=MfComData.MfData[i];
         }
         if(snr_check!=MfComData.MfData[i])
         {
             status=MI_SERNRERR;
         }
         else
         {
             for(i=0;i<4;i++)
             {
                     *(snr+i)=MfComData.MfData[i];
             }
         }

    }
    ClearBitMask(RegDecoderControl,0x20);
    return status;
}
//*********************************************
unsigned char Get_UID()
{
  unsigned char i;
     for(i=0;i<5;i++)
         buff[i]=P0;
     Card_UID[i]=buff[i];
        return(0);
}
//========================
void delay(unsigned char i)
{
  unsigned char k,j;
  for(j=0;j<50;j++)
      {  //wdog=~wdog;
         for(k=0;k<i;k++)

             {
               ;
              }
      }
}
//============================
void delay_50us(void)
{
  unsigned char i;
  for(i=0;i<14;i++)
     {
     }
}
//=============================
void send_wiegend_data(void)
{
unsigned char k,j,temp;
  data1=0;
  data0=1;
  delay_50us();
  data0=1;
  data1=1;
  delay(1);
  for(k=0;k<4;k++)
     {
       temp=Card_UID[k];
       for(j=0;j<8;j++)
          {
             if(temp&0x80)data1=0;
             else data0=0;
             delay_50us();
             data1=1;
             data0=1;
             delay(1);
             temp=temp<<1;
          }

     }
   data1=0;
   data0=1;
   delay_50us();
   data1=1;
   data0=1;
}



//=============================

void main(void)
{
  unsigned char i,k,temp,temp_buff[4];

  unsigned char request,anticoll;
       

  data0=1;
  data1=1;
  delay(200);
  beep=0;
  red=0;
  
  
  rst500=1;
  delay(200);
  delay(200);
  beep=1;
  

  rst500=0;
  delay(200);
  
  data0=1;
  data1=1;
while(1)
   
        {
          //if(Card_UID[0]!=temp_buff[0]||Card_UID[1]!=temp_buff[1]||Card_UID[2]!=temp_buff[2]||Card_UID[3]!=temp_buff[3])
                  request=PcdRequest();
                  anticoll=PcdAnticoll();

                  if ((request==0)&&(anticoll==0))
                  {
                            grn=0;          
                          }
                          else
                          continue;
                          
                          
                          
                     
             { data0=1;
               data1=1;
               send_wiegend_data();
               beep=0;
                           grn=0;
               delay(150);
               delay(100);
               beep=1;
                           grn=1;
               data0=1;
               data1=1;
               for(k=0;k<4;k++)temp_buff[k]=P0;
               }
         }
         
       
}

相关帖子

沙发
123654789| | 2013-5-10 12:08 | 只看该作者
你的程序还不完整

使用特权

评论回复
板凳
kelianco|  楼主 | 2013-5-10 14:19 | 只看该作者
123654789 发表于 2013-5-10 12:08
你的程序还不完整

其它函数在其它头文件中,我是菜鸟,我这样写main函数,不知道有没有问题

使用特权

评论回复
地板
123654789| | 2013-5-10 14:20 | 只看该作者
大多数都是底层函数有问题

使用特权

评论回复
5
zhaoyu2005| | 2013-5-11 08:32 | 只看该作者
如果硬件经验不足或者没有合适的测试设备,第一次弄最好弄个能正常工作的电路(最好是别人弄得,能正常读卡),然后自己写程序,一开始啥都弄,你咋排除硬件问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝