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

📄 main.c

📁 采用单片机89C52对飞利浦13.56Mhz的射频芯片MFRC500进行密码的配置与扇区的读写。可以由电脑通过串口发送命令来对MFRC500进行寄存器的配置读写。
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#include "main.h"
#include "mfrc500.h"
#include "mifare.h"


bit g_bReceOk;                                              //正确接收到上位机指令标志
bit g_bReceAA;                                              //接收到上位机发送的AA字节标志
unsigned char idata g_cReceBuf[64];                         //和上位机通讯时的缓冲区
//接收到上位机的通讯命令后该缓冲区内容依次为:长度字2字节+命令码2字节+数据+校验字
unsigned int  g_cReceNum;                                   //接收到上位机的字节数
unsigned int  g_cCommand;                                   //接收到的命令码
unsigned char g_cSNR[4];                                    //M1卡序列号
unsigned char g_cCid;                                       //

void main( )
{    
     InitializeSystem( );
     Rc500Ready( );
     PcdConfigISOType( 'A' );  
     while ( 1 )
     {   
         if (g_bReceOk)
         {
             g_bReceOk=0;
			     switch(g_cCommand)
                 {
                     
                     case 0x0101:
                        ComSetBound();               break;
				     case 0x0108:
                        ComM500PcdConfigISOType();   break;
                     case 0x010C:
                        ComPcdAntenna();             break; 
                                  
                     case 0x0201:
                        ComRequestA();               break;  
                     case 0x0202:
                        ComAnticoll();               break;        
                     case 0x0203:
                        ComSelect();                 break;
                     case 0x0204:
                        ComHlta();                   break;
                     case 0x0207:
                        ComAuthentication();        break; 
                     case 0x0208:
                        ComM1Read();                 break;
                     case 0x0209:
                        ComM1Write();                break;
                     case 0x020A:
                        ComM1Initval();              break; 
                     case 0x020B:
                        ComM1Readval();              break;
                     case 0x020C:
                        ComM1Decrement();            break;
                     case 0x020D:
                        ComM1Increment();            break;  
                     case 0x020E:
                        ComM1BakValue();             break;
                     case 0x0212:
                        ComUL_PcdAnticoll();         break;      
                     case 0x0213:
                        ComUL_PcdWrite();            break;  
                     default:
                        AnswerErr( -1 );         break;
                 }
             ES = 1;
         }
     }
}



/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
    TMOD &= 0x0F;
    TMOD |= 0x21;
    PCON |= 0x80;
    SCON  = 0x50;
    TH1 = TL1 = BOUND19200; 
    TR1=1;
    P0 = P1 = P2 = P3 = 0xFF;
    IE |= 0x90;
}

/////////////////////////////////////////////////////////////////////
//初始化RC632
/////////////////////////////////////////////////////////////////////
void Rc500Ready()
{
    char status;
    DelayMs(100);
    status = PcdReset();
    if(status != MI_OK)
    {
        DelayMs(10);
        status = PcdReset();
    } 
    if(status != MI_OK)
    {
        DelayMs(10);
        status = PcdReset();
    } 
    if(status == MI_OK)
    {    LED_GREEN = 0;     }       
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置波特率命令
/////////////////////////////////////////////////////////////////////
void ComSetBound()
{
    unsigned char bound = g_cReceBuf[4];
    if (bound > 4)
    {   AnswerErr(-1);    }
    else
    {
    	AnswerCommandOk();
    	TR1 = 0;
    	switch(bound)
        {
                 case 0:
                      TH1=TL1=BOUND4800;
                      break;
                 case 1:
                      TH1=TL1=BOUND9600;
                      break;
                 case 2:
                      TH1=TL1=BOUND14400;
                      break;
                 case 3:
                      TH1=TL1=BOUND19200;
                      break;
                 case 4:
                      TH1=TL1=BOUND28800;
                      break;
                 default:
                      break;
        }
    	TR1 = 1;
     }   	
}	

/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置A/B方式命令
/////////////////////////////////////////////////////////////////////
void ComM500PcdConfigISOType()
{
     if (MI_OK == PcdConfigISOType(g_cReceBuf[4]))
     {    AnswerCommandOk();    }
     else
     {    AnswerErr(-1);   }  
} 
   
/////////////////////////////////////////////////////////////////////
//响应上位机发送的天线命令
/////////////////////////////////////////////////////////////////////
void ComPcdAntenna()
{
    if (!g_cReceBuf[4])
    {   PcdAntennaOff();   }
    else
    {   PcdAntennaOn();    }
    AnswerCommandOk();  
}    

/////////////////////////////////////////////////////////////////////
//响应上位机发送的寻A卡命令
/////////////////////////////////////////////////////////////////////
void ComRequestA()
{
    unsigned char atq[2];
    char status;
    status = PcdRequest(g_cReceBuf[4], atq);
    if (status == MI_OK)
    {    AnswerOk(atq,2);     }
    else
    {    AnswerErr(-1);   }    	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComAnticoll()
{ 
    if (MI_OK == PcdAnticoll(g_cReceBuf))
    {    AnswerOk(g_cReceBuf,4);  }
    else
    {    AnswerErr(-1);   }    	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡锁定命令
/////////////////////////////////////////////////////////////////////
void ComSelect()
{
    if (MI_OK == PcdSelect(&g_cReceBuf[4]))
    {    
        memcpy(g_cSNR, &g_cReceBuf[4], 4);
        AnswerOk(&g_cReceBuf[0], 1);   
    }
    else
    {    AnswerErr(-1);   }    	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡休眠命令
/////////////////////////////////////////////////////////////////////
void ComHlta()
{
    if (MI_OK == PcdHalt())
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(-1);   }    	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡验证密钥命令
//g_cReceBuf[4]:密码验证方式
//g_cReceBuf[5]:要验证的块号
//g_cReceBuf[6]6字节密钥
/////////////////////////////////////////////////////////////////////
void ComAuthentication()
{	
    char status;
    if (MI_OK == ChangeCodeKey(&g_cReceBuf[6],&g_cReceBuf[12]))                       //转换密钥格式
    {    
    	if (MI_OK == PcdAuthKey(&g_cReceBuf[12]))                                     //传送密钥到RC500FIFO
        {
             status = PcdAuthState(g_cReceBuf[4], g_cReceBuf[5], g_cSNR);     //验证密钥
        }
    }
    if (status == MI_OK)
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(-1);   }
}    

/////////////////////////////////////////////////////////////////////
//响应上位机读M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Read()
{
    if (MI_OK == PcdRead(g_cReceBuf[4], &g_cReceBuf[0]))
    {	 AnswerOk(&g_cReceBuf[0], 16);  }
    else
    {    AnswerErr(-1);            }
}

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

/////////////////////////////////////////////////////////////////////
//响应上位机初始化钱包命令
//g_cReceBuf[4]:块号
//g_cReceBuf[5]:4字节初始值,低字节在前
//钱包格式:4字节钱包值+4字节钱包值取反+4字节钱包值+1字节块号+1字节块号取反+1字节块号+1字节块号取反
/////////////////////////////////////////////////////////////////////
void ComM1Initval()
{
    g_cReceBuf[9]=~g_cReceBuf[5];
    g_cReceBuf[10]=~g_cReceBuf[6];
    g_cReceBuf[11]=~g_cReceBuf[7];
    g_cReceBuf[12]=~g_cReceBuf[8];
    
    g_cReceBuf[13]=g_cReceBuf[5];
    g_cReceBuf[14]=g_cReceBuf[6];
    g_cReceBuf[15]=g_cReceBuf[7];
    g_cReceBuf[16]=g_cReceBuf[8];
    
    g_cReceBuf[17]=g_cReceBuf[4];
    g_cReceBuf[18]=~g_cReceBuf[4];
    g_cReceBuf[19]=g_cReceBuf[4];
    g_cReceBuf[20]=~g_cReceBuf[4];
    
    if (MI_OK == PcdWrite(g_cReceBuf[4], &g_cReceBuf[5]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(-1);   }
}

/////////////////////////////////////////////////////////////////////
//响应上位机读钱包命令
/////////////////////////////////////////////////////////////////////
void ComM1Readval()
{
    if (MI_OK == PcdRead(g_cReceBuf[4], &g_cReceBuf[0]))
    {	 AnswerOk(&g_cReceBuf[0], 4);   }
    else
    {    AnswerErr(-1);         }
}

/////////////////////////////////////////////////////////////////////
//响应上位机扣款命令
//g_cReceBuf[4]:块号
//g_cReceBuf[5]:4字节扣款值,低字节在前
/////////////////////////////////////////////////////////////////////
void ComM1Decrement()
{
    if (MI_OK == PcdValue(PICC_DECREMENT, g_cReceBuf[4], &g_cReceBuf[5]))
    {    AnswerCommandOk();    }
    else

⌨️ 快捷键说明

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