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

📄 ic_card.c

📁 C8051读写M1射频卡源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//用C8051F410读写器读写M1射频卡,读卡模块用WM-11T6
#include <C8051F410.h>
#include <stdio.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// typedef
//-----------------------------------------------------------------------------
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef signed char s8;
typedef signed int s16;
typedef signed long s32;
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------

//////////////以下为卡密码/////////////////////////
/*
 #define key1 0xff
 #define key2 0xff
 #define key3 0xff
 #define key4 0xff
 #define key5 0xff
 #define key6 0xff
 //*/
#define SYSCLK       24500000    // SYSCLK frequency in Hz
#define BAUDRATE       9600     // Baud rate of UART in bps
#define T0_RELOAD_H    0xF0  // Reload value for Timer0 high byte //to calc
#define T0_RELOAD_L    0x00  // Reload value for Timer0 low byte
#define BUFSIZE_UREC 26         //接收缓冲区最大长度	
			
//-----------------------------------------------------------------------------
//定义全局变量
//-----------------------------------------------------------------------------
u8 indexUartRec = 0;  //接收指针
u8 Numrxdi = 0;    //接收到的数据字节数
u8 srxdbuff[24];//发送缓冲区
u8 rxdbuff[21];	//接收缓冲区
u8 CardData[16];//读卡数据缓冲区
u8 CardNO1[4];//卡号
u8 WriteCardData[16];
bit rx_complete = 0;//发送完成标志位

//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void Init_SYSCLK (void)
{
   OSCICN = 0x87;                      // configure internal oscillator for
                                       // 24.5MHz
   RSTSRC = 0x04;                      // enable missing clock detector
}


void Init_T0(void)
{
  TH0 = T0_RELOAD_H;           // Init Timer0 High register
  TL0 = T0_RELOAD_L ;          // Init Timer0 Low register
  TMOD = 0x01;                 // Timer0 in 16-bit mode
  CKCON = 0x02;                // Timer0 uses a 1:48 prescaler
  ET0 = 1;                     // Timer0 interrupt enabled
  TR0 = 0;                     // Timer0 OFF //
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------

void Init_PORT (void)
{
  P0MDIN    = 0xFF;          //所有端口数字
  P0MDOUT   = 0x10;          // Enable UTX as push-pull output 
 // P0SKIP    = 0x0C;          //INT0: P0.2:  & INT1: P0.3       
  XBR0     = 0x01;           // Enable UART on P0.4(TX) and P0.5(RX)
  XBR1     = 0x40;           // Enable crossbar and weak pull-ups
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//-----------------------------------------------------------------------------

void Init_UART0 (void)
{
   SCON0 = 0x10;                       //        SCON0: 8-bit variable bit rate
                                       //        level of STOP bit is ignored
                                       //        RX enabled
                                       //        ninth bits are zeros
                                       //        clear RI0 and TI0 bits
   if (SYSCLK/BAUDRATE/2/256 < 1) {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON |=  0x08;                  // T1M = 1; SCA1:0 = xx
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01
      CKCON |=  0x01;
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   } else if (SYSCLK/BAUDRATE/2/256 < 48) {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   } else {
      while (1);                       // Error.  Unsupported baud rate
   }

   TL1 = TH1;                          // init Timer1
 //  TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;
   TR1 = 1;                            // START Timer1
   TI0 = 1;                            // Indicate TX0 ready
   ES0 = 1;                            // enable uart0 interrupt      
}


u8 XORCheck(u8 *psData,u8 length)
{
    u8 i;
    u8 XORData=0;

    for(i = 0; i < length; i++)
    {
            XORData ^= psData[i];
    }

    return XORData;
}
void Delay_10ms(void)//10ms
{
       u8 i;
        for(i = 0; i < 150;  i++)//
        {
        }
}


//-----------------------------------------------------------------------------
// 通过UART0发送数据
//-----------------------------------------------------------------------------
void Uart0_Send (void *ptr, u8 num)
{
	TI0 = 0; // 可删除

   	REN0=0;//禁止接受
	EA = 0;

  while(num!= 0)
  {
	SBUF0 = *((char *)ptr)++;
    while(!TI0);  //wait for sending
	TI0 = 0;   
	num--;  
  }

    REN0=1;//允许接受,	
	EA = 1;
}

//寻卡
//下传命令:3C 04 01 70 00(寻卡模式00(IDLE)或01(ALL)) 00 BCC 0D
//成功返回:3C 05 四字节卡号 00 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D  
//11T6读卡模块无论卡在不在感应区内都返回寻卡成功,飞利浦的设计 
u8  CardReady()     //成功则返回0,否则返回失败原因
  {
   u8 j;
   u16 n;
CardReadyERR:
   Delay_10ms(); //保证每条指令之间延时20ms
   Delay_10ms();
   TR0=0;
   srxdbuff[0]=0x3c;
   srxdbuff[1]=0x04;
   srxdbuff[2]=0x01;
   srxdbuff[3]=0x70;
   srxdbuff[4]=0x01;//寻卡模式
   srxdbuff[5]=0x00;
   srxdbuff[6]=XORCheck(srxdbuff,6);
   srxdbuff[7]=0x0d;  	
   Uart0_Send(srxdbuff,8);
   n=20000;
   while(n)
   {
     if(rx_complete)//接收完成
	 {
	   rx_complete = 0;
	 //  n = 0;
	   break;
	 }
	 Delay_10ms();
	 n--;
   }
   if(n==0)
     return 1;//超时返回
	if(rxdbuff[1] == 0x01)
	  {
	    return 2;			//错误返回	 
	  }
	else if(rxdbuff[1] == 0x05)
	  {
	   if((XORCheck(rxdbuff,7)==rxdbuff[7])&&(rxdbuff[8])==0x0d)
	     {
		   for(j=0;j<4;j++)
		      {
			    CardNO1[j]=rxdbuff[2+j];
			  }
		   return 0;//寻卡成功返回		
		 }
		else 

		{
		  return 3;//校验错误返回
		 }

	  }
    else  goto CardReadyERR;
}
//密码验证
//下传命令:3C 0E 01 6C 六字节密码 认证模式(00-A/01-B) 绝对块号 四字节卡号 校验位 0D
//成功返回:3C 02 00 00 BCC 0D 
//错误返回:3C 01 FF(错误代码) BCC 0D
//注:根据原先的设置,一般都用B密码
u8 KeyPass(u8 BlockNum)//成功则返回0,否则返回失败原因
{
  u16 n;
  Delay_10ms(); //保证每条指令之间延时20ms
  Delay_10ms();
  TR0=0;
  srxdbuff[0]=0x3c;
  srxdbuff[1]=0x0e;
  srxdbuff[2]=0x01;
  srxdbuff[3]=0x6c;
  srxdbuff[4]=key1;//六字节密码
  srxdbuff[5]=key2;
  srxdbuff[6]=key3;
  srxdbuff[7]=key4;  
  srxdbuff[8]=key5;
  srxdbuff[9]=key6;
  srxdbuff[10]=0x00;//采用A密码
  srxdbuff[11]=BlockNum;
  srxdbuff[12]=CardNO1[0];  
  srxdbuff[13]=CardNO1[1];  
  srxdbuff[14]=CardNO1[2];  
  srxdbuff[15]=CardNO1[3]; 
  srxdbuff[16]=XORCheck(srxdbuff,16);
  srxdbuff[17]=0x0d;   
  Uart0_Send(srxdbuff,18);
  n=20000;
   while(n)
   {
     if(rx_complete)//接收完成
	 {
	   rx_complete = 0;
	 //  n = 0;
	   break;
	 }
	 Delay_10ms();
	 n--;
   }
  if(n==0)
     return 1;//超时返回
  if(rxdbuff[1] == 0x01)
	{
	  return 2;			//错误返回	 
	}
  else if(rxdbuff[1] == 0x02)
	  {
	   if((XORCheck(rxdbuff,4)==rxdbuff[4])&&((rxdbuff[5])==0x0d))
	     {
		   return 0;//寻卡成功返回		
		 }
		else 

		{
		  return 3;//校验错误返回
		 }

	  }
    else  return 4;//其它错误返回 	 
}

//读卡
//下传命令:3C 04 01 66 00(绝对块号) 00 BCC 0D
//成功返回:3C 12 00 DATA0~DATA15 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D
u8 CardRead_step(u8 BlockNum)//成功则返回0,否则返回失败原因
{
   u8 j;
   u16 n;
   Delay_10ms(); //保证每条指令之间延时20ms
   Delay_10ms();
   TR0=0;
   srxdbuff[0]=0x3c;
   srxdbuff[1]=0x04;
   srxdbuff[2]=0x01;
   srxdbuff[3]=0x66;
   srxdbuff[4]=BlockNum;
   srxdbuff[5]=0x00;

⌨️ 快捷键说明

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