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

📄 emreader.c

📁 EM射频卡读写器源代码
💻 C
字号:
#include "common.h"

extern void SerialInit();
extern void SerialSend(BYTE SendCode);
extern BOOL SerialRece(BYTE *SBuf);
//extern void delay(unsigned int iDelay);
extern void delay_100us();
extern void delay_48us();
extern void delay_36us();

extern void TimerInit();
extern unsigned int GetTimerCount();

extern unsigned char rlc(unsigned char rc_Byte);

unsigned char GetOneBitNum(unsigned char buf,unsigned char from,unsigned char end);

sbit InPin = P3^7;
sbit ModePin = P1^7;

sbit Dat1 = P3^0;
sbit Dat2 = P3^1;

main()
{
 BYTE row,col,buffer;
 BYTE bitFlag[5];
 BYTE bitCount[4];
 BYTE ID[5];
 BOOL bBuf;
 BOOL bErrFlag = FALSE;
 BOOL bHeaderFlag = FALSE;
 BOOL bFirstBit,bEndBit;

 SerialInit();
 TimerInit();

 EA = 1;

 while(1)
 {
  //get the header
  bErrFlag = FALSE;
  if(bHeaderFlag == FALSE)
  {
   while(InPin == 0);
   GetTimerCount();

   TR0 = 1;
   while(InPin == 1);
   if(GetTimerCount() < 150) continue; //300us
  }
  while(InPin == 0);					// header 1 end

  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = FALSE;
   continue;
  }
  while(InPin == 1);
  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = TRUE;
   continue; //300us
  }
  while(InPin == 0);					// header 2 end

  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = FALSE;
   continue;
  }
  while(InPin == 1);
  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = TRUE;
   continue; //300us
  }
  while(InPin == 0);					// header 3 end

  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = FALSE;
   continue;
  }
  while(InPin == 1);
  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = TRUE;
   continue; //300us
  }
  while(InPin == 0);					// header 4 end

  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = FALSE;
   continue;
  }
  while(InPin == 1);
  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = TRUE;
   continue; //300us
  }
  while(InPin == 0);					// header 5 end

  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = FALSE;
   continue;
  }
  while(InPin == 1);
  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = TRUE;
   continue; //300us
  }
  while(InPin == 0);					// header 6 end

  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = FALSE;
   continue;
  }
  while(InPin == 1);
  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = TRUE;
   continue; //300us
  }
  while(InPin == 0);					// header 7 end

  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = FALSE;
   continue;
  }
  while(InPin == 1);
  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = TRUE;
   continue; //300us
  }
  while(InPin == 0);					// header 8 end

  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = FALSE;
   continue;
  }
  while(InPin == 1);
  if(GetTimerCount() > 150) 
  {
   bHeaderFlag = TRUE;
   continue; //300us
  }
 // while(InPin == 0);					// header 9 end
  bHeaderFlag = FALSE;

  TR0 = 0;
  delay_100us();
  delay_100us();
 
  //data
  bitCount[0] = 0;
  bitCount[1] = 0;
  bitCount[2] = 0;
  bitCount[3] = 0;
  for(row = 0; row < 11; row++)
  {
   buffer = 0;
   for(col = 0; col < 5; col++)
   {
    delay_100us();
	bBuf = InPin;
	TL0 = 0;
	TH0 = 0;
	TR0 = 1;
	while(bBuf == InPin);	//100us
	if(GetTimerCount() > 100) 
	{
	 bErrFlag = TRUE;
	 break;
	}
	if(col < 4) delay_100us();

	if(bBuf) 
	{
	 buffer++;
	 bitFlag[col] = 1;
	}
	else bitFlag[col] = 0;
	if(col < 4)
	{
	 if(bitFlag[col]) bitCount[col]++;
	}
	else if((col == 4) && ((buffer%2) != 0))
	{
	 if(row != 10) bErrFlag = TRUE;
	 break;
	}
   }//for col end

   if(bErrFlag) break;
   if(row == 10) break;
   if((row%2) == 0)
   {
    if(bitFlag[0]) ID[row/2] |= 0x80;
	else ID[row/2] &= 0x7f;
    if(bitFlag[1]) ID[row/2] |= 0x40;
	else ID[row/2] &= 0xbf;
    if(bitFlag[2]) ID[row/2] |= 0x20;
	else ID[row/2] &= 0xdf;
    if(bitFlag[3]) ID[row/2] |= 0x10;
	else ID[row/2] &= 0xef;
   }
   else
   {
    if(bitFlag[0]) ID[row/2] |= 0x08;
	else ID[row/2] &= 0xf7;
    if(bitFlag[1]) ID[row/2] |= 0x04;
	else ID[row/2] &= 0xfb;
    if(bitFlag[2]) ID[row/2] |= 0x02;
	else ID[row/2] &= 0xfd;
    if(bitFlag[3]) ID[row/2] |= 0x01;
	else ID[row/2] &= 0xfe;
   }

  }//for row end
  if(bErrFlag) continue;
  if((bitCount[0]%2) != 0) continue;
  if((bitCount[1]%2) != 0) continue;
  if((bitCount[2]%2) != 0) continue;
  if((bitCount[3]%2) != 0) continue;

  // Get ID OK 
  if(ModePin)
  {
	buffer = GetOneBitNum(ID[2],0,7);
	buffer += GetOneBitNum(ID[3],0,3);
	if((buffer%2) == 0) bFirstBit = 0;
	else bFirstBit = 1;
	buffer = GetOneBitNum(ID[3],4,7);
	buffer += GetOneBitNum(ID[4],0,7);
	if((buffer%2) == 0) bEndBit = 1;
	else bEndBit = 0;

	if(bFirstBit) 
	{
	 Dat2 = 0;
	 delay_48us();
	 Dat2 = 1;
	}
	else
	{
	 Dat1 = 0;
	 delay_48us();
	 Dat1 = 1;
     _nop_();
	 _nop_();
	}
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_48us();
	delay_36us();

	for(row = 0; row < 3; row++)
	{
	 buffer = ID[row+2];
	 for(col = 0; col <8; col++)
	 {
	  buffer = rlc(buffer);
	  if(CY) 
	  {
	   Dat2 = 0;
	   delay_48us();
	   Dat2 = 1;
	  }
	  else
	  {
	   Dat1 = 0;
	   delay_48us();
	   Dat1 = 1;
	   _nop_();
	   _nop_();
	  }
	  delay_100us();
	  delay_100us();
	  delay_100us();
	  delay_100us();
	  delay_100us();
	  delay_100us();
	  delay_100us();
	  delay_100us();
	  delay_48us();
	  if(col == 7) 
	  {
	   _nop_();
	   _nop_();
	   _nop_();
	  }
	  else delay_36us();
	 }
	}

  	delay_36us();
	if(bEndBit) 
	{
	 Dat2 = 0;
	 delay_48us();
	 Dat2 = 1;
	}
	else
	{
	 Dat1 = 0;
	 delay_48us();
	 Dat1 = 1;
     _nop_();
	 _nop_();
	}
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
	delay_100us();
  }
  else
  {
   SerialSend(ID[0]);
   SerialSend(ID[1]);
   SerialSend(ID[2]);
   SerialSend(ID[3]);
   SerialSend(ID[4]);
  }
 }
}

unsigned char GetOneBitNum(unsigned char buf,unsigned char from,unsigned char end)
{
 unsigned char i;
 unsigned char result = 0;
 i = from;
 while(i--)
 {
  buf = rlc(buf);
 }
 for(i = from; i < end+1; i++)
 {
  buf = rlc(buf);
  if(CY) result++;
 }
 return result;
}

⌨️ 快捷键说明

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