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

📄 main.c

📁 RC500可用的程序
💻 C
字号:
#include "reg52.h"
#include <string.h>
#include <intrins.h>
#include <absacc.h>
#include "main.h"
#include "slrc500.h"
#include "iso14443a.h"


bit g_bReceOk;                                              //正确接收到上位机指令标志
bit g_bRc500Ok;                                             //RC500复位正常标志


unsigned int  data g_cCommand;                              //接收到的命令码
unsigned char data g_cSNR[4];                               //M1卡序列号
unsigned char g_cCidNad;                                    //
unsigned char idata g_cReceBuf[64];                         //和上位机通讯时的缓冲区

struct TranSciveBuffer{unsigned char MfCommand;
                       unsigned int  MfLength;
                       unsigned char MfData[64];
                      };
void main( )
{    
     
     InitializeSystem( );	//系统初始化
     Rc500Ready( );			//初始化RC500
     PcdConfigISOType( 'A' );    
     while ( 1 )
     {   
         if (g_bReceOk)    //正确接收到上位机指令标志
         {

                 g_bReceOk = 0;//清上位机指令标志
				 g_cCommand=g_cReceBuf[0];//从接收缓冲区中读取数据     
                 switch(g_cCommand)
                 {
                     case 13:
                        ComSetBound();               break;//设置波特率             
                     case 2:
                        ComRequestA();               break;//响应上位机发送的寻A卡命令
                     case 3:
                        ComAnticoll();               break;//防冲突        
                     case 4:
                        ComSelect();                 break;//选卡
					 case 5:
                        ComM500PiccAuthE2();         break;
					 case 6:
                        ComM500PcdLoadKeyE2();       break;
                     case 1:
                        ComHlta();                   break;
                     case 7:
                        ComAuthentication();         break; 
                     case 8:
                        ComM1Read();                 break;//读卡
                     case 9:
                        ComM1Write();                break;//写卡
                     case 10:
                        ComM1Decrement();            break;
					 case 11:
                        Comsond();                   break;  
					 case 12:    // 参数设置
		               	g_cReceBuf[0]=1;	//contact
		            	g_cReceBuf[1]=0;
			                                         break;		

                 }
             ES = 1;
          }
     }
}




///////////////////////////////////////////////////////////////////
//////
///////////////////////////////////////////////////////////////////
void Comsond()
{
	  	    	g_cReceBuf[0]=1;         //contact
		    	g_cReceBuf[1]=0;
				AnswerOk();		
		    	sond       = 0;
		    	DelayMs(200);
				DelayMs(200);

		    	sond       = 1;
		
}


/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
    TMOD &= 0x0F;   		//
    TMOD |= 0x21;			//定时器0为方式0,定时器1为方式2.软件启动定时器
    PCON |= 0x80;			//SMOD=1;串行口用于方式1、2、3时波特率加倍
    SCON  = 0x50;			//10位异步收发(方式1),波特率可变,REN = 1(可以接收)
    TH1 = TL1 = BOUND9600;	//波特率9.6k
    TR1=1;					//启动定时器1
    P0 = P1 = P2 = P3 = 0xFF;//IO端口初始化
    IE |= 0x90;				//EA=1,ES=1;CPU中断允许,串行口中断允许
}

/////////////////////////////////////////////////////////////////////
//初始化RC500
/////////////////////////////////////////////////////////////////////
void Rc500Ready()
{
    char status;
    DelayMs(100);
    DelayMs(100);
	DelayMs(100);
    DelayMs(100);
    DelayMs(100);
    DelayMs(100);
    DelayMs(100);

    status = PcdReset();
    if(status != MI_OK)
    {
        DelayMs(10);
        status = PcdReset();//假如复位不成功,连续三次复位
    } 
    if(status != MI_OK)
    {
        DelayMs(10);
        status = PcdReset();
    } 
    if(status == MI_OK)
    {
        g_bRc500Ok = 1;
        sond       = 1;                //蜂鸣器响一声,表示RC500复位成功
		 DelayMs(200);
		 DelayMs(200);
		sond       = 0;
    }       
}
	
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置波特率命令
/////////////////////////////////////////////////////////////////////
void ComSetBound()
{
    unsigned char bound = g_cReceBuf[1];

    	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;
                 case 5:
                      TH1=TL1=BOUND38400;
                      break;
                 case 6:
                      TH1=TL1=BOUND57600;
                      break;
                 case 7:
                      TH1=TL1=BOUND115200;
                      break;
                 default:
                      break;
        }
		g_cReceBuf[0]=1;	        //contact
	    g_cReceBuf[1]=0;
	    AnswerOk();
		DelayMs(20);
    	TR1 = 1;  	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的寻A卡命令
/////////////////////////////////////////////////////////////////////
void ComRequestA()
{
	char status;
	status = PcdRequest(g_cReceBuf[1], &g_cReceBuf[2]);
	if (status != MI_OK)
	{    status = PcdRequest(g_cReceBuf[1], &g_cReceBuf[2]);   }
    if (status != MI_OK)
	  {  
	g_cReceBuf[0]=1;	
	g_cReceBuf[1]=status; 
	 AnswerOk(); 
	 return;   
	  } 

	  if(g_cReceBuf[2]==2)
	      g_cCidNad=mifarepro;     // Mifare Pro 卡
		 else  if(g_cReceBuf[2]==4)
			  g_cCidNad=mifare1;       // Mifare One 卡
				else   if(g_cReceBuf[2]==16)
				       g_cCidNad=mifarelight;   // Mifare Light 卡
					 else    	g_cCidNad=unknowncard;

			g_cReceBuf[0]=3;	
			g_cReceBuf[1]=status;
 
	
	 AnswerOk(); 

   	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComAnticoll()
{ 
	char status;
	status=PcdAnticoll(&g_cSNR);
    if (status!=MI_OK )
    {   
	 g_cReceBuf[0]=1;	
	g_cReceBuf[1]=status;
	 AnswerOk(); 
	 return;  
	 }
	 g_cReceBuf[2]=g_cSNR[0];
	 g_cReceBuf[3]=g_cSNR[1];
	 g_cReceBuf[4]=g_cSNR[2];
	 g_cReceBuf[5]=g_cSNR[3];
	//memcpy(g_cReceBuf[2],&g_cSNR,4);
			g_cReceBuf[0]=5;
			g_cReceBuf[1]=status;
    AnswerOk();     	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡锁定命令
/////////////////////////////////////////////////////////////////////
void ComSelect()
{
char status;
	status=PcdSelect(g_cSNR, &g_cReceBuf[2]);
    if (status!=MI_OK)
    {  
	
		g_cReceBuf[0]=1;	
		g_cReceBuf[1]=status; 
	    AnswerOk(); 
		return;     
	}
            g_cReceBuf[0]=3;
			g_cReceBuf[1]=status;
  			AnswerOk();
}
////////////////////////////////////////////////////////////////////////
///校验密码
///////////////////////////////////////////////////////////////////////
void ComM500PiccAuthE2()
{
char status;
unsigned char *pSNR;
pSNR  = &g_cSNR;
status=PcdLoadKeyE2(g_cReceBuf[1],g_cReceBuf[2]);
     if(status==0)
	      {
		    status = PcdAuthState(g_cReceBuf[1], g_cReceBuf[3], pSNR);     //验证密钥
            g_cReceBuf[0]=1;
			g_cReceBuf[1]=status;
			AnswerOk();
			return; 
		  }
		  AnswerOk();
}

//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
///下载密码
///////////////////////////////////////////////////////////////////////
void ComM500PcdLoadKeyE2()
{
char status;
status=M500PcdLoadKeyE2(g_cReceBuf[1],g_cReceBuf[2],&g_cReceBuf[3]);
			g_cReceBuf[0]=1;
			g_cReceBuf[1]=status;
			AnswerOk();
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡休眠命令
/////////////////////////////////////////////////////////////////////
void ComHlta()
{
unsigned char status;
   status=PcdHalt();
    g_cReceBuf[0]=1;
			g_cReceBuf[1]=status;
			AnswerOk();   	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡验证密钥命令
/////////////////////////////////////////////////////////////////////
void ComAuthentication()
{	
    char status = MI_COM_ERR;
    unsigned char *pkeys,*pSNR;
    pkeys = &g_cReceBuf[20];
    pSNR  = &g_cSNR;
    if (MI_OK == ChangeCodeKey(&g_cReceBuf[3],pkeys))                       //转换密钥格式
    {    
    	if (MI_OK == PcdAuthKey(pkeys))                                     //传送密钥到RC500FIFO
        {
             status = PcdAuthState(g_cReceBuf[1], g_cReceBuf[3], pSNR);     //验证密钥
        }
    }
    if (status == MI_OK)
    {   g_cReceBuf[0]=1;
			g_cReceBuf[1]=status;
			 AnswerOk();
			    }

}    

/////////////////////////////////////////////////////////////////////
//响应上位机读M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Read()
{
char status;
	status=PcdRead(g_cReceBuf[1], &g_cReceBuf[2]);
    if (status==MI_OK)
    {	
		if(g_cCidNad==mifare1||g_cCidNad==mifarepro)
			   g_cReceBuf[0]=17;
			else	  if(g_cCidNad==1)
					 g_cReceBuf[0]=9;
				else		  g_cReceBuf[0]=16;
		g_cReceBuf[1]=status;
    	AnswerOk(); 
		return; 
	}
    else
    {   g_cReceBuf[0]=1;            }
		g_cReceBuf[1]=status;
		AnswerOk();
}


/////////////////////////////////////////////////////////////////////
//响应上位机写M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Write()
{
    char status;
	status=PcdWrite(g_cReceBuf[1], &g_cReceBuf[2]);
	    g_cReceBuf[0]=1;          
		g_cReceBuf[1]=status;
		AnswerOk();

}
/////////////////////////////////////////////////////////////////////
//响应上位机扣款命令	充值命令
/////////////////////////////////////////////////////////////////////
void ComM1Decrement()
{
   char status;
	status=PcdValue(g_cReceBuf[1], g_cReceBuf[2], &g_cReceBuf[3]);
    if (status==MI_OK)
    { 
	    g_cReceBuf[0]=1;         
		g_cReceBuf[1]=status;
		AnswerOk(); 
		return;
     }
	 g_cReceBuf[0]=1;         
		g_cReceBuf[1]=status;
		AnswerOk(); 
		return;

}
   

/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答 
//input:answerdata = 应答数据
//       answernum  = 数据长度
/////////////////////////////////////////////////////////////////////
void AnswerOk()
{    
    unsigned char len, i;
    ES = 0;						//不允许串行中断
    TI=0;						//清发送标志位  
		len=g_cReceBuf[0];		//长度
		for(i=0;i<len+1;i++)    //发送
		{
			SBUF=g_cReceBuf[i];
			while(!TI);
			TI=0;			
		}            
     
     TI = 0;
	ES = 1;
}

/////////////////////////////////////////////////////////////////////
//串行中断,接收上位机数据
/////////////////////////////////////////////////////////////////////
seri_int () interrupt 4 using 1
{
unsigned char len, i;
unsigned int j=0;
   if (RI)
   { 

	ES=0;
	len=SBUF; 						//首先接收数据包长度
		RI=0;	
		for(i=0;i<len;i++)
		{
			while(!RI)				//假如没有接收到第二个数据(命令字),则等待
			{
				j++;
				if(j>1000)			//超时退出接收中断
				{
					ES = 1;
				    break;
				}
			}
			if(j<1000)				//不超时超时
			{
				g_cReceBuf[i]=SBUF; //读出命令字和数据
				RI=0;
				j=0;
			}
			else					//超时退出接收中断					
			{
				ES = 1;
			    break;
			}
		}
		if(i==len)					//接收的个数与数据包长度一致接收正常
		{
			ES = 1;
			g_bReceOk  = 1;			//置接收完成标志位
		}
    }

}


/////////////////////////////////////////////////////////////////////
//用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;									   //启动定时器2
    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 + -