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

📄 msr.c

📁 非接触式M1卡读写器,读写源程序,可读S50/S70的卡
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************
*                                                                           *
* File:         MSR.C (Source)                                              *
*                                                                           *
* Description:  87C52-Firmware for mifare (R) Serial Reader (MSR + SerMMM)  *
*                                                                           *
*****************************************************************************
*                                                                           *
* Version | Date     | Description                                          *
* --------+----------+----------------------------------------------------- *
*         |          | MEDIUM_TIMEOUT = 16 (1.5 ms)                         *
*         |          | LONG_TIMEOUT   = 95 (9.0 ms)                         *
*         |          | mifs_write, mifs_transfer: SHORT_TIMEOUT -> MEDIUM_T.*
* V1.00   |          | adaption of check_write                              *
*         |          | commands 0x56 and 0x57 added                         *
*                                                                           *
****************************************************************************/

#include <reg52.h>

#define NO_TIMER2

#include <string.h>
#include <intrins.h>

#define __SRC
#include "msr.h"
#undef  __SRC

#include "lll_msr.h"


// Serial Number of the MSR/MMM (at the Top of Code Memory: 8 kByte)

uchar code Snr_MSR[4] _at_ 0x1FFC;

// Release Number of the Firmware

#ifdef MMM
 uchar code SW_Rel[] = "\n\r Rongcai(V1.00 16.03.01)\n\r";
#else
 uchar code SW_Rel[] = "\n\r Rongcai(V1.00 16.03.01) \n\r";
#endif

static uint Crc;

// Local Prototypes

void main(void);
void init(void);
void cmd_execution(void);
void putchar(uchar c);

// Interrupt Service Routines

void isr_timer0(void);
void isr_ext_intr1(void);
void isr_UART(void);

/****************************************************************************
*                                                                           *
* Function:     main                                                        *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
****************************************************************************/

void main(void)
{
  
  init();

  auto_baud();

  while (1)
  {
	auto_baud();

	if (CmdValid)
	{
	  CmdValid = FALSE;

	  cmd_execution();

	  CALL_isr_UART();

	  Idle = FALSE;
	}
	else if (Idle)
	{
	  auto_baud();

	  idle_mifs_request();

	  auto_baud();
	}
	else
	{
	  delay_10ms(10);
	}
	auto_baud();

	MCM_CS =0;
	MCM_CRCDATA = 0;            // Because of missing internal MIFSLS1x2
	MCM_CS =1;
	                           // pull-ups (reduces current consumption)
	auto_baud();
  }
}


/****************************************************************************
*                                                                           *
* Function:     init                                                        *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
* execute the initialize of the machine                                     *
*                                                                           *
****************************************************************************/

void init(void)
{
	EA          = TRUE;           // Enable all interrupts
	EX1         = FALSE;
	
//  EX1         = TRUE;           // Enable external interrupt 1 (overvoltage)
//  RS485_DE    = ON;             // Enable RS485 Transmitter
	
	CmdReceived = FALSE;
	CmdValid    = FALSE;
	Quit        = FALSE;
	LLfReady    = TRUE;
	SendReady   = TRUE;
	Idle        = TRUE;
	
	RepCnt      = 0;
	RecvState   = RECV_STX;
	EnableTransferCmd = FALSE;
	CheckByteCnt = BCC_CHECKBYTECNT;

#ifdef AUTODELAY
	DelayRate = 0;
	DelayRateLocked = TRUE;
#endif

	PCON = 0x80;                // SMOD = 1;
	SCON = 0x50;                // Mode 1, 8-bit UART, enable receiption
	T2CON = 0x30;               // add in 2001;
	AutoBaud = TRUE;
	TMOD     = 0x20;			// Timer 1, mode 2, 8-bit auto reload,
								// Timer 0, mode 0, 13-bit counter
	Capt_L   = 0;
	Capt_H   = 0;
	
	Enable_LEDs = TRUE;
	LED(GRUEN, OFF);
	if (Enable_LEDs){
		delay_10ms(20);
  	}

#ifdef MMM
	LED(GELB,  OFF);
#endif
	LED(GRUEN, ON);
	TOGGLE_WD();  
}


/****************************************************************************
*                                                                           *
* Function:     cmd_execution                                               *
*                                                                           *
* Input:        SerBuffer[]                                                 *
* Output:       SerBuffer[]                                                 *
*                                                                           *
* Description:                                                              *
*                                                                           *
*  according to the cmd received,to act the command                         *
****************************************************************************/

void cmd_execution(void)
{
  uchar Status;
  uchar len;
  uchar cmd;
  uchar adr;
  uchar idata tmp[16];
  uchar idata snr[4];
  uchar idata size;
  uchar idata tt[2];

  len = SerBuffer[LENGTH];
  SerBuffer[LENGTH] = 0;

  cmd = SerBuffer[COMMAND];

  switch (cmd)
  {
	case 0x40:                  // HL-Authentication

	  Status = mifs_request(SerBuffer[HLREQMODE] | ALL, tt);
	  if (Status != OK)
	  {
		break;
	  }
	  Status = mifs_select(&SerBuffer[HL_SERNR], &size);
	  if (Status != OK)
	  {
		break;
	  }
	  Status = mifs_authentication(SerBuffer[HLAUTHMODE], SerBuffer[HLSECNR]);
	  break;


	case 0x41:                  // Request

	  Status = mifs_request(SerBuffer[MODE], &SerBuffer[TAGTYPE]);
	  if (Status == OK)
	  {
		SerBuffer[LENGTH] = 2;
	  }
	  break;


	case 0x42:                  // Anticoll

	  Status = mifs_anticoll(SerBuffer[BCNT], &SerBuffer[SERNR]);
	  if (Status == OK)
	  {
		SerBuffer[LENGTH] = 4;
	  }
	  break;


	case 0x43:                  // Select

	  Status = mifs_select(&SerBuffer[SERNR], &SerBuffer[SIZE]);
	  if (Status == OK)
	  {
		SerBuffer[LENGTH] = 1;
	  }
	  break;


	case 0x44:                  // Authentication
	  Status = mifs_authentication(SerBuffer[MODE], SerBuffer[SECNR]);
	  break;


	case 0x45:                  // Halt

	  Status = mifs_halt();
	  break;


	case 0x46:                  // Read

	  Status = mifs_read(SerBuffer[ADR], &SerBuffer[ADR]);
	  if (Status == OK)
	  {
		SerBuffer[LENGTH] = 16;
	  }
	  break;


	case 0x47:                  // Write

	  Status = mifs_write(SerBuffer[ADR], &SerBuffer[DATABYTES]);
	  break;


	case 0x48:                  // Increment

	  Status = mifs_increment(SerBuffer[ADR], &SerBuffer[VALUE]);
	  break;


	case 0x49:                  // Decrement

	  Status = mifs_decrement(SerBuffer[ADR], &SerBuffer[VALUE]);
	  break;


	case 0x4A:                  // Restore

	  Status = mifs_restore(SerBuffer[ADR]);
	  break;


	case 0x4B:                  // Transfer

	  if (EnableTransferCmd)
	  {
		Status = mifs_transfer(SerBuffer[ADR]);
	  }
	  else
	  {
		Status = W_CODE;
	  }
	  break;


	case 0x4C:                  // Load Key

	  adr = (len == 18)? NKEY8 : NKEY6;

	  Status = mifs_load_key(SerBuffer[MODE],
							 SerBuffer[SECNR],
							 (KEY idata *)&SerBuffer[TKEY],
							 (KEY idata *)&SerBuffer[adr]);
	  break;


	case 0x4D:

	  if (SerBuffer[MODE] == SER_BCC)
	  {
		CheckByteCnt = BCC_CHECKBYTECNT;
	  }
	  else
	  {
		CheckByteCnt = CRC_CHECKBYTECNT;
	  }
	  Status = OK;
	  break;


	case 0x4E:                  // Reset

	  mifs_reset(&SerBuffer[TIME]);    ////TIME = 3;

	  Status = OK;
	  break;


	case 0x4F:                  // Get Info

	  if ((len == 0) || (len == 1 && SerBuffer[MODE] == 1))  ///MODE = 3
	  {
		for (adr = INFO; adr < INFO_CNT + INFO; adr++)   ///INFO=3 ; INFO_CNT=18
		{
		  SerBuffer[adr] = SW_Rel[INFO_TXT - INFO + adr]; ////INFO_TXT=11
		}
		SerBuffer[adr++] = ' ';
		SerBuffer[adr++] = '0';
		SerBuffer[adr++] = 'x';
		SerBuffer[adr++] = xtoa_h(Snr_MSR[3]);
		SerBuffer[adr++] = xtoa_l(Snr_MSR[3]);
		SerBuffer[adr++] = xtoa_h(Snr_MSR[2]);
		SerBuffer[adr++] = xtoa_l(Snr_MSR[2]);
		SerBuffer[adr++] = xtoa_h(Snr_MSR[1]);
		SerBuffer[adr++] = xtoa_l(Snr_MSR[1]);
		SerBuffer[adr++] = xtoa_h(Snr_MSR[0]);
		SerBuffer[adr++] = xtoa_l(Snr_MSR[0]);
		SerBuffer[adr++] = '\0';

		SerBuffer[LENGTH] = adr - INFO;  ///LENGTH IS DEFINE TO 2
	  }
	  else
	  {
		if (SerBuffer[MODE] == 2)
		{
		  SerBuffer[INFO]     = (uchar) Capt;
		  SerBuffer[INFO + 1] = (uchar)(Capt >> 8);
		  SerBuffer[INFO + 2] = BaudRate;
		  SerBuffer[INFO + 3] = DelayRate;
		}
		else
		{
		  SerBuffer[INFO]     = Snr_MSR[0];
		  SerBuffer[INFO + 1] = Snr_MSR[1];
		  SerBuffer[INFO + 2] = Snr_MSR[2];
		  SerBuffer[INFO + 3] = Snr_MSR[3];
		}
		SerBuffer[LENGTH] = 4;
	  }

	  Status = OK;
	  break;


	case 0x50:                  // Set Control Bit

	  mifs_set_control_bit(SerBuffer[CTLBYTE]);

	  Status = OK;
	  break;


	case 0x51:                  // Clr Control Bit

	  mifs_clr_control_bit(SerBuffer[CTLBYTE]);

	  Status = OK;
	  break;

⌨️ 快捷键说明

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