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

📄 main.c

📁 采用单片机89C52对飞利浦13.56Mhz的射频芯片MFRC500进行密码的配置与扇区的读写。可以由电脑通过串口发送命令来对MFRC500进行寄存器的配置读写。
💻 C
📖 第 1 页 / 共 2 页
字号:
    {    AnswerErr(-1);   }
}
    
/////////////////////////////////////////////////////////////////////
//响应上位机充值命令
//g_cReceBuf[4]:块号
//g_cReceBuf[5]:4字节充值金额,低字节在前
/////////////////////////////////////////////////////////////////////
void ComM1Increment()
{
    if (MI_OK == PcdValue(PICC_INCREMENT, g_cReceBuf[4], &g_cReceBuf[5]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(-1);   }
}

/////////////////////////////////////////////////////////////////////
//响应上位机M1卡备份钱包命令
//g_cReceBuf[4]:源地址块号
//g_cReceBuf[5]:目标地址块号,必须和源地址在同一扇区内
/////////////////////////////////////////////////////////////////////
void ComM1BakValue()
{
    if (MI_OK == PcdBakValue(g_cReceBuf[4], g_cReceBuf[5]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(-1);   }
}

/////////////////////////////////////////////////////////////////////
//响应上位机UltraLght卡防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComUL_PcdAnticoll()
{
    if (MI_OK == UL_PcdAnticoll(&g_cReceBuf[0]))
    {   AnswerOk(&g_cReceBuf[0], 7);  }
    else
    {   AnswerErr(-1);    }    
}

/////////////////////////////////////////////////////////////////////
//响应上位机写UltraLight卡命令
//g_cReceBuf[4]:要写入数据的页号
//g_cReceBuf[5]:连续4字节要写入的数据
/////////////////////////////////////////////////////////////////////
void ComUL_PcdWrite()
{
    if (MI_OK == UL_PcdWrite(g_cReceBuf[4], &g_cReceBuf[5]))
    {   AnswerCommandOk();   }
    else
    {   AnswerErr(-1);  }    
}

/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答(无返回数据)
/////////////////////////////////////////////////////////////////////
void AnswerCommandOk()
{    
     unsigned char i,chkdata;
     chkdata = 0;
     
     TI   = 0;                         //发送命令头          
     SBUF = 0xAA;
     while (!TI);           
     TI   = 0;
     SBUF = 0xBB;
     while (!TI);
     
     TI   = 0;                         //发送长度字
     SBUF = 0x0;
     while (!TI);           
     TI   = 0;
     SBUF = 0x04; 
     while (!TI);           
          
   
     TI   = 0;                         //发送命令码  
     i = (unsigned char)((g_cCommand >>8) & 0xFF);              
     SBUF = i;
     chkdata ^= i;
     while (!TI);

     TI   = 0;                         //发送命令码 
     i = (unsigned char)(g_cCommand & 0xFF);
     SBUF = i;
     chkdata ^= i;
     while (!TI);

     TI   = 0;                         //发送状态字
     SBUF = 0;
     while (!TI);           
     
     TI   = 0;                         //发送效验字
     SBUF = chkdata;
     while (!TI);           
     if (chkdata == 0xAA)
     {
     	TI   = 0;
     	SBUF = 0;
     	while (!TI);
     }
     TI = 0;
     ES = 1;
}

/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答(有返回数据)
//input:answerdata = 应答数据
//       answernum  = 数据长度
/////////////////////////////////////////////////////////////////////
void AnswerOk(unsigned char *answerdata, unsigned int answernum)
{    
     unsigned char chkdata;
     unsigned int i;
     
     TI   = 0;                         //发送命令头          
     SBUF = 0xAA;
     while (!TI);           
     TI   = 0;
     SBUF = 0xBB;
     while (!TI);
     
     TI   = 0;                         //长度字,包括状态字和效验字
     chkdata = (((unsigned char)(((answernum + 4)>>8) & 0xFF)));
    
     SBUF = chkdata;
     while (!TI);           
     TI   = 0;
     chkdata = (((unsigned char)((answernum + 4) & 0xFF)));
     SBUF = chkdata;
     while (!TI);           
     
     
     TI   = 0;                         //发送命令码  
     i = (unsigned char)((g_cCommand >>8) & 0xFF);              
     SBUF = i;
     chkdata ^= i;
     while (!TI);

     TI   = 0;                         //发送命令码 
     i = (unsigned char)(g_cCommand & 0xFF);
     SBUF = i;
     chkdata ^= i;
     while (!TI);
     
     TI   = 0;                         //状态字
     SBUF = 0;
     while (!TI);           
     
     for (i=0; i<answernum; i++)
     {    
     	  TI   = 0;
     	  chkdata ^= *(answerdata+i);
     	  SBUF = *(answerdata+i);                
          while (!TI);
          if (*(answerdata + i) == 0xAA)
          {
              TI   = 0;
              SBUF = 0;
              while (!TI);
          }
     }
     
     TI   = 0;                         //效验字
     SBUF = chkdata;
     while(!TI);           
     
     if (chkdata == 0xAA)
     {
         TI=0;
         SBUF=0;
         while (!TI);
     }
     
     TI = 0;
     ES = 1;
}

/////////////////////////////////////////////////////////////////////
//未能正确执行上位机指令,应答
//input:faultcode = 错误代码
/////////////////////////////////////////////////////////////////////
void AnswerErr(char faultcode)
{    
     unsigned char i,chkdata;
     chkdata = 0;

     TI   = 0;                         //发送命令头          
     SBUF = 0xAA;
     while (!TI);           
     TI   = 0;
     SBUF = 0xBB;
     while (!TI);
     
     TI   = 0;                         //发送长度字
     SBUF = 0x0;
     while (!TI);           
     TI   = 0;
     SBUF = 0x04; 
     while (!TI);           
          
         
     TI   = 0;                         //发送命令码  
     i = (unsigned char)((g_cCommand >>8) & 0xFF);              
     SBUF = i;
     chkdata ^= i;
     while (!TI);

     TI   = 0;                         //发送命令码 
     i = (unsigned char)(g_cCommand & 0xFF);
     SBUF = i;
     chkdata ^= i;
     while (!TI);

     TI   = 0;                         //发送错误代码
     SBUF = faultcode;
     while (!TI);              
     
     chkdata = i ^ faultcode;
     TI   = 0;                         //效验字
     SBUF = chkdata;
     while (!TI);
     
     TI   = 0;
     ES   = 1;
}

/////////////////////////////////////////////////////////////////////
//串行中断,接收上位机数据
/////////////////////////////////////////////////////////////////////
seri_int () interrupt 4 using 1
{
   unsigned int i,j;
   unsigned char rece_data = SBUF;
   unsigned char verify = 0;
   if (RI)
   {    
       RI = 0;
	   if (g_bReceAA)
	   {  
	       g_bReceAA = 0;
	       switch (rece_data)
	       {    
	     	   case 0x00:
	              break;
	           case 0xBB:
	              g_cReceNum = 0;
	              break;
	           default:
	              i = g_cReceNum;
	              g_cReceBuf[i] = rece_data;
	              break;
	       }
	   }
	   else
	   {    
	       switch (rece_data)
	       {    
	     	   case 0xAA:
	              g_bReceAA = 1;
	           default:
	              i = g_cReceNum++;
	              g_cReceBuf[i] = rece_data;
	              break;
	       }
	   }
	   i = (((unsigned int)(g_cReceBuf[0]<<8)) + (unsigned int)(g_cReceBuf[1]));
	   if ((g_cReceNum == i + 2) && ( i != 0 )) 
       {   
            for (j=1; j<g_cReceNum; j++)
            {   verify ^= g_cReceBuf[j];    }
            if (!verify)
	        {   
	    	    g_bReceOk  = 1;
	    	    g_cCommand = (((unsigned int)(g_cReceBuf[2]<<8)) + (unsigned int)(g_cReceBuf[3]));
	    	    g_bReceAA  = 0;
	    	    ES = 0;
	        }
        }

        if (g_cReceNum >= sizeof(g_cReceBuf))
        {   g_cReceNum=0;   }
    }
    if (TI)
    {	TI = 0;   }
}


/////////////////////////////////////////////////////////////////////
//用T2做延时子程序
/////////////////////////////////////////////////////////////////////
void DelayMs(unsigned int _MS)
{
    RCAP2LH = RCAP2_1ms;
    T2LH    = RCAP2_1ms;

    ET2     = 0; 	                                   // Disable timer2 interrupt
    T2CON   = 0x04;                                        // 16-bit auto-reload, clear TF2, start timer
    TR2     = 1;
    while (_MS--)
    {   while (!TF2);TF2 = 0;  }
    TR2 = 0;
}
void Delay_50us(unsigned char _50us)
{
    RCAP2LH = RCAP2_50us;
    T2LH    = RCAP2_50us;

    ET2     = 0; 	                                   // Disable timer2 interrupt
    T2CON   = 0x04;	                                   // 16-bit auto-reload, clear TF2, start timer
    while (_50us--)
    {   while (!TF2);TF2 = 0;  }
    TR2 = 0;
}


⌨️ 快捷键说明

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