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

📄 main.c

📁 射频卡读卡头的程序
💻 C
📖 第 1 页 / 共 3 页
字号:
  ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer


  while (n_10ms--)
  {
	while (!TF2)
	{
	  if (CmdValid || CmdReceived)
	  {
		TR2 = FALSE;
		TF2 = FALSE;
		return;
	  }
	}
	TF2 = FALSE;
  }
  TR2 = FALSE;

}







#ifdef NOP_DELAY

/****************************************************************************
*                                                                           *
* Function:     delay_50us_NOP                                              *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description: 延时函数                                                     *
*                                                                           *
*                                                                           *
*                                                                           *
****************************************************************************/

void 	delay_50us_NOP (void)
{
  uchar i;

  for(i=0; i<81; i++) _nop_();
}

#endif


/****************************************************************************
*                                                                           *
* Function:     delay_8us_NOP                                               *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
*                                                                           *
****************************************************************************/

void 	delay_8us_NOP (void)
{
  uchar i;

  for(i=0; i<14; i++) _nop_();
}


/*****************************************************


*******************************************************/
void   RingOn (void)
{
          BEEP = 0;
          delay_10ms(2);
          BEEP = 1;
          delay_10ms(2);
          BEEP = 0;
          delay_10ms(2);
          BEEP = 1;
          delay_10ms(2);
          BEEP = 0;
          delay_10ms(2);
          BEEP = 1;
 }


#pragma aregs


/****************************************************************************
*                                                                           *
* Function:     xtoa_h                                                      *
*                                                                           *
* Input:        _byte                                                       *
* Output:       ASCII High-Nibble                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
* Wandelt das High-Nibble des 乥ergebenen Bytes in ein ASCII-Zeichen um.    *
*                                                                           *
****************************************************************************/

uchar 	xtoa_h (uchar _byte)
{
  uchar nibble = _byte >> 4;

  return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0');
}


/****************************************************************************
*                                                                           *
* Function:     xtoa_l                                                      *
*                                                                           *
* Input:        _byte                                                       *
* Output:       ASCII Low-Nibble                                            *
*                                                                           *
* Description:                                                              *
*                                                                           *
* Wandelt das Low-Nibble des 乥ergebenen Bytes in ein ASCII-Zeichen um.     *
*                                                                           *
****************************************************************************/

uchar 	xtoa_l (uchar _byte)
{
  uchar nibble = _byte & 0x0F;

  return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0');
}


/****************************************************************************
*                                                                           *
* Function:     isr_timer0                                                  *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
*                                                                           *
****************************************************************************/

void 	isr_timer0 (void) interrupt 1 using 2
{
  if (Timer0Cnt)
  {
	--Timer0Cnt;
  }
  else
  {
	STOP_T0();

#ifdef AUTODELAY
	if (DelayRate < MAXDELAYRATE && CmdCnt > 0)
	{
	  DelayRate++;
	  DelayRateLocked = FALSE;
	}
#endif

	RecvState = RECV_STX;

	if (!SendReady && LLfReady)
	{
	  if (RepCnt < MAXREPCNT)
	  {
		RepCnt++;
		CALL_isr_UART();
	  }
	  else
	  {
		RepCnt = 0;
		Quit = FALSE;
		SendReady = TRUE;
	  }
	}
  }
}


/****************************************************************************
*                                                                           *
* Function:     isr_UART                                                    *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
* Diese Interrupt-Funktion wird vom UART aufgerufen und bearbeitet das      *
* serielle Protokoll.                                                       *
*                                                                           *
****************************************************************************/

void 	isr_UART (void) interrupt 4 using 1
{
   uchar c ;
  //uchar oldRecvState, chk;

  if (RI)
  {
    c = SBUF ;

    RI = 0 ;

    if (FrameEnd==1)
    {
      if( !(ChkSum ^=c) )
      {
       FrameOk = 1;
       LED =  ON;
      }

      else
      FrameOk = 0 ;

      FrameEnd = 0 ;
    }

    if (FrameHead&(c !=ETX)&!FrameEnd)
    {
        PcData[DataNum++] = c  ;
        ChkSum ^= c;
        DataLen++;

    }

    if( c == STX )
    {

         Pt = PcData;
         DataLen =0 ;
         FrameHead = 1;
         FrameEnd = 0;
         DataNum = 0;
         ChkSum = 0;
    }

    if( c == ETX )
    {
      FrameEnd = 1;
      FrameHead = 0;
    }


  }


}

/***************************************************************************/

unsigned char  AsiToHex(unsigned char ch1,unsigned char ch2)
{
       unsigned char i,j,num1,num2,HexNum;
       i = ch1; j = ch2;
       if ((i>=0x30)&&(i<=0x39))
       {
         i-=0x30 ;
         num1 = i<<4 ;
       }
       else
       {
        i-= 0x41;
        num1 = i ;
         switch (num1)
           {
            case  0 : num1 = 0xa0; break;
            case  1 : num1 = 0xb0; break;
            case  2 : num1 = 0xc0; break;
            case  3 : num1 = 0xd0; break;
            case  4 : num1 = 0xe0; break;
            case  5 : num1 = 0xf0; break;
           }

      }



       if((j>=0x30)&&(j<=0x39))
        {
         j-= 0x30;
         num2 = j ;
        }

       else
       {
         j-= 0x41;
         num2 = j ;
        switch (num2)
        {
            case  0 : num2 = 0x0a; break;
            case  1 : num2 = 0x0b; break;
            case  2 : num2 = 0x0c; break;
            case  3 : num2 = 0x0d; break;
            case  4 : num2 = 0x0e; break;
            case  5 : num2 = 0x0f; break;
        }

       }



       HexNum = num1+num2;

       return HexNum ;

}


void TransAsiHex(unsigned char *PtData1,unsigned char *PtData2,unsigned char cnt)
{
    unsigned char *Pt0,*Pt1;
    unsigned char i,cnt0,ch1,ch2;

    Pt0 = PtData1;
    Pt1 = PtData2;
    cnt0 = cnt/2;
    for(i=0;i<cnt0;i++)
    {
       ch1 = *Pt0++;
       ch2 = *Pt0++;
       *Pt1 = AsiToHex(ch1,ch2);
        Pt1++;
    }
}


void TransHexAsi(unsigned char  *PtData1,unsigned char  *PtData2,unsigned char cnt)
{
    unsigned char  *Pt0,*Pt1;
    unsigned char i,cnt0,ch1;

    Pt0 = PtData1;
    Pt1 = PtData2;
    cnt0 = cnt;
    for(i=0;i<cnt0;i++)
    {
       ch1 = *Pt0;
       HexToAsi(ch1,Pt1);
       Pt0++;
       Pt1++; Pt1++;

    }
}

 void HexToAsi(unsigned char ch,unsigned char *Ptm)
 {
   unsigned char i,j;
   unsigned char *Pt0;
   Pt0 = Ptm;
   i = ch;
   i = (i&0xf0)>>4;
   if(i<=9)
      i+=0x30;
   else
      {
          switch(i)
          {
             case 0x0a: i = 0x41; break;
             case 0x0b: i = 0x42; break;
             case 0x0c: i = 0x43; break;
             case 0x0d: i = 0x44; break;
             case 0x0e: i = 0x45; break;
             case 0x0f: i = 0x46; break;
          }
      }

     *Pt0 = i;
     j = ch;
     j = ch&0x0f;
     if(j<=9)
        j += 0x30;
     else

     {


        switch(j)
        {
             case 0x0a: j = 0x41; break;
             case 0x0b: j = 0x42; break;
             case 0x0c: j = 0x43; break;
             case 0x0d: j = 0x44; break;
             case 0x0e: j = 0x45; break;
             case 0x0f: j = 0x46; break;
         }
     }

     Pt0++;
     *Pt0 = j;

 }

 void SendDataToPc(uchar *Ptm,uchar cnt)
 {
    unsigned char i;
    unsigned char  checksum = 0;

    SBUF = STX ;
    while(!TI);
    TI = 0;
    for(i=0; i<cnt ; i++)
    {
      SBUF = *Ptm ;
      while(!TI);
      TI = 0;
      checksum ^= *Ptm;
      ++Ptm;

    }

    SBUF = ETX ;
    while(!TI);
    TI = 0;


    SBUF = checksum ;
    while(!TI);
    TI = 0;


 }




void SendSnrToPc(uchar *Ptm,uchar cnt)
{
    unsigned char i;
    unsigned char  checksum = 0;

    SBUF = STX ;
    while(!TI);
    TI = 0;
    for(i=0; i<cnt ; i++)
    {
      SBUF = *Ptm ;
      while(!TI);
      TI = 0;

      ++Ptm;

    }


    SBUF = 0x0d;
    while(!TI);
    TI = 0;

    SBUF = 0x0a;
    while(!TI);
    TI = 0;


    SBUF = ETX ;
    while(!TI);
    TI = 0;

}



// 将 PtData1:PC ASCII 码 命令帧转换为 HEX 数据 并存放到首地址PtData2

void  TransData(uchar  *PtData1, uchar  *PtData2,uchar cnt)
{

  TransAsiHex(PtData1,PtData2, cnt);

}


void test(void)
{
  uchar i = 0,j=10;
  uchar code str[]="ChangZhou ALED Electronic Corp.";
  uchar xdata *Ptm,*Pts;
  Ptm = 0x380;
  Pts = str;
  for(i=0; i<36; i++)
  {
    *Ptm = *Pts;
     Ptm++;
     Pts++;
  }

}


void ChangCardSnr(void)
{
   uchar data checksum = 0;

   CardSnrNum[0] = 0x00;

   CardSnrNum[1] = card_snr[3];

   CardSnrNum[2] = card_snr[2];

   CardSnrNum[3] = card_snr[1];

   CardSnrNum[4] = card_snr[0];

   checksum ^=  CardSnrNum[0];
   checksum ^=  CardSnrNum[1];
   checksum ^=  CardSnrNum[2];
   checksum ^=  CardSnrNum[3];
   checksum ^=  CardSnrNum[4];
   CardSnrNum[5] = checksum;

}


void SendSnrNum(void)
{

   ChangCardSnr();
   TransHexAsi(CardSnrNum,CardData,6);
   SendSnrToPc(CardData,12);
}

void FlashLED(void)
{
  uchar data FlashNum =5;

  while(FlashNum--)
  {
   LED = !LED;
   delay_10ms(5);
  }
}

uchar   CheckSnrNum(void)
{
   uchar data SnrNumErr;

   if(card_snr[3] == 0x30)
   {
     if(card_snr[2] == 0x30)
     {
        if(card_snr[1] == 0x30)
        {
            if(card_snr[0] == 0x30)
            SnrNumErr = 1;
            else
            SnrNumErr = 0;
        }
        else
        SnrNumErr = 0;

     }
    else
    SnrNumErr = 0;
   }

   else
   SnrNumErr = 0;

  return  SnrNumErr;

}



⌨️ 快捷键说明

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