⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc500pro.c

📁 ZLG500BT的mifare卡号读程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//#include "stor_commu.c"
//#include "WrReadE2.c"

/****************************************************************************
* 名称:RC500_config()
* 功能:RC500模块复位,发送复位命令后,RC500返回00 00 00 FF 03,不用管
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char RC500_config(void)
{
    unsigned int i;
    unsigned char config[5]={0x00,0x52,0x00,0xAD,0x03};//发送的命令字符
    unsigned char nouse[5],err=0;
    
    Flag3&=~Flaguart0rx;                   //清除接收中断标志
    for(i=0; i<3; i++)
    {
      while (!(IFG1 & UTXIFG0));
      TXBUF0=STX;
      DelayMS(10);
      if((Flag3&Flaguart0rx)==0)//等待接收中断
      {
        ;
      }
      else if((Flag3&Flaguart0rx)>0) break;
      if(err++==2)
      {
        err=0;
        return 0;
      }
    }
    //如果RC500模块回复ACK,则发送复位命令
    if(RXBUF0 ==ACK)
    {
      for(i=0 ;i<5; i++)
      {
        while(!(IFG1 & UTXIFG0));     // USART0 TX buffer ready?);
        TXBUF0=config[i];
      }
    }
    else return 0;
    Flag3&=~Flaguart0rx;                   //清除接收中断标志
    //发送命令后等待300ms之内的回应
    Flag3|=WaitReply;                 //开始等待回应
    while ((Flag3&Flaguart0rx)==0)
    {
      if((Flag3&rdCARDTimeOut)>0) 
      {
        Flag3&=~rdCARDTimeOut;
        return 0;  //超时返回
      }
    }        
    if(RXBUF0 ==STX)
    {
      while(!(IFG1 & UTXIFG0));
      TXBUF0=ACK;
    }
    else return 0;
    
    Flag3&=~Flaguart0rx;
    Flag3|=WaitReply;                 //开始等待回应
//返回00 00 00 FF 03赋值给nouse数组,只是为了不影响后面的接收
    i=0;
    while( i < 5)
    {
      while ((Flag3&Flaguart0rx)==0)
      {
        if((Flag3&rdCARDTimeOut)>0) 
        {
          Flag3&=~rdCARDTimeOut;
          return 0;  //超时返回
        }
      }
      nouse[i++]=RXBUF0;              //卡的类型赋值
      Flag3&=~Flaguart0rx;                   //把UART0接收标志位清零
    }
    return 1;
}
/****************************************************************************
* 名称:RC500_request()
* 功能:RC500模块查询命令,发送0x41命令检查在有效范围内是否有卡存在,如果有返回卡的类型
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char RC500_request(void)
{
    unsigned char i,CardTyp[7];
    unsigned char request[6]={0x00,0x41,0x01,0x01,0xBE,0x03},err=0;//发送的命令字符
    for(i=0; i<7; i++)
    {
      CardTyp[i]=0x00;
    }
    
    Flag3&=~Flaguart0rx;                          //首先把UART0接收标志位清零
    for(i=0; i<3; i++)
    {
      while (!(IFG1 & UTXIFG0));
      TXBUF0=STX;
      DelayMS(10);
      if((Flag3&Flaguart0rx)==0)                   //等待接收中断
      {
        ;//DelayMS(5);
      }
      else if((Flag3&Flaguart0rx)>0) break;
      if(err++==2)
      {
        err=0;
        return 0;
      }
    }
    if(RXBUF0 ==ACK)
    {
      for(i=0 ;i<6; i++)
      {
        while(!(IFG1 & UTXIFG0));     
        TXBUF0=request[i];              // 发送查询命令
      }
    }
    else return 0;
    Flag3&=~Flaguart0rx;                   //把UART0接收标志位清零
    
    Flag3|=WaitReply;                 //开始等待回应
    while ((Flag3&Flaguart0rx)==0)
    {
      if((Flag3&rdCARDTimeOut)>0) 
      {
        Flag3&=~rdCARDTimeOut;
        return 0;                     //超时返回
      }
    }
    if ( RXBUF0 ==STX)
    {
      while(!(IFG1 & UTXIFG0));
      TXBUF0=ACK;               	//接到应答返回ACK确认
    }
    else return 0;
    Flag3&=~Flaguart0rx;                   //把UART0接收标志位清零
    Flag3|=WaitReply;                 //开始等待回应
    
    i=0;
    while( i < 7)
    {
      while ((Flag3&Flaguart0rx)==0)
      {
        if((Flag3&rdCARDTimeOut)>0) 
        {
          Flag3&=~rdCARDTimeOut;
          return 0;  //超时返回
        }
      }
      CardTyp[i++]=RXBUF0;                    //卡的类型赋值
      Flag3&=~Flaguart0rx;                   //把UART0接收标志位清零
    }
    return 1;
}
/****************************************************************************
* 名称:RC500_request()
* 功能:RC500模块防冲突命令,发送0x71命令,进行防冲突操作,返回卡的序列号
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char RC500_anticoll2(void)
{
    unsigned char i,tmCardSNR[9];

    unsigned char anticoll2[7]={0x00,0x71,0x02,0x00,0x00,0x8C,0x03},err=0;//发送的命令字符
    for(i=0; i<9; i++)
    {
      tmCardSNR[i]=0x00;
    }
    
    Flag3&=~Flaguart0rx;                      //首先把UART0接收标志位清零
    for(i=0; i<3; i++)
    {
      while (!(IFG1 & UTXIFG0));

      TXBUF0=STX;
      DelayMS(10);
      if((Flag3&Flaguart0rx)==0)                   //等待接收中断
      {
        ;
      }
      else if((Flag3&Flaguart0rx)>0) break;
      if(err++==2)
      {
        err=0;
        return 0;
      }
    }
    if( RXBUF0 ==ACK)                 //如果收到ack
    {
      for(i=0 ;i<7; i++)
      {
        while(!(IFG1 & UTXIFG0));       // USART0 TX buffer ready?);
        TXBUF0=anticoll2[i];            //卡号赋值
      }					//返回ACK
    }
    else return 0;
    Flag3&=~Flaguart0rx;                      //首先把UART0接收标志位清零
    
    Flag3|=WaitReply;                 //开始等待回应
    while ((Flag3&Flaguart0rx)==0)
    {
      if((Flag3&rdCARDTimeOut)>0) 
      {
        Flag3&=~rdCARDTimeOut;
        return 0;  //超时返回
      }
    }   
    if ( RXBUF0 ==STX)
    {
      while(!(IFG1 & UTXIFG0));
      TXBUF0=ACK;			//返回ACK
    }
    else return 0;
    Flag3&=~Flaguart0rx;                      //把UART0接收标志位清零
    Flag3|=WaitReply;                 //开始等待回应
    
    i=0;
    while( i < 9)
    {
      while ((Flag3&Flaguart0rx)==0)
      {
        if((Flag3&rdCARDTimeOut)>0) 
        {
          Flag3&=~rdCARDTimeOut;
          return 0;  //超时返回
        }
      }   
      tmCardSNR[i++]=RXBUF0;
      Flag3&=~Flaguart0rx;                      //把UART0接收标志位清零
    }
   //4字节卡号赋值给CardSNR
    for(i=0; i<4; i++)
   {
     CardSNR[i]=tmCardSNR[i+3];
   }
    return 1;
}
/****************************************************************************
* 名称:storR()
* 功能:把CardStore的一个元素(一个字节)存入E2PROM,并且地址和元素标号+1
* 入口参数:CardStore数组的元素标号
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char storR(unsigned char *Numcou)
{
  //unsigned int err=0,j;
  if( WRE2check(Addr,CardStore[*Numcou])==0) return 0;
  Addr++;
  (*Numcou)++;
  return 1;
}
/****************************************************************************
* 名称:Store_RC500()
* 功能:把7个字节的CardStore数组存入E2PROM 
* 入口参数:无
* 出口参数:成功返回1,失败返回0
****************************************************************************/
unsigned char Store_RC500(void)
{
    unsigned char i=0;
    //AT24C1024_POWER1_HIGH;                       //POW1high,
    //AT24C1024_POWER2_HIGH;                       //POW2high,
    AT24C1024_WP_EN;                             //WP置低,写使能
    for(i=0xff; i>0; i--);
    //getAddr();
    while(i<7)
    {
      if ( (Addr <0xFFFF)&(P0 ==0)&(A1 ==0))
      {
       // unsigned int *p=i;
        WRITE_ADDR_POWER=0xA0;
        READ_ADDR_POWER=0XA1;
        if(storR(&i)==0) return 0;
      }
      if( (Addr ==0xFFFF)&(P0 ==0)&(A1 ==0))
      {
        WRITE_ADDR_POWER=0xA0;
        READ_ADDR_POWER=0XA1;
        if(storR(&i)==0) return 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -