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

📄 ic_card.c

📁 C8051读写M1射频卡源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
   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] == 0x12)
	  {
	    
	   if((XORCheck(rxdbuff,19)==rxdbuff[19])&&((rxdbuff[20])==0x0d))
	     {
		   for(j=0;j<16;j++)
		      {
			    CardData[j]=rxdbuff[3+j];
			  }
		   return 0;//读卡成功返回		
		 }
		else 

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

	  }
    else  return 4;//其它错误返回
}
//写卡
//下传命令:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
//成功返回:3C  02 00 00 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D
u8 CardWrite_step(BlockNum)//成功则返回0,否则返回失败原因
{
   u8 j;
   int n;
   Delay_10ms(); //保证每条指令之间延时20ms
   Delay_10ms();
   TR0=0;
   srxdbuff[0]=0x3c;
   srxdbuff[1]=0x13;
   srxdbuff[2]=0x01;
   srxdbuff[3]=0x67;
   srxdbuff[4]=BlockNum;
   for (j=0;j<16; j++) 
     srxdbuff[j+5]=WriteCardData[j];
   srxdbuff[21]=XORCheck(srxdbuff,21);
   srxdbuff[22]=0x0d;	 
   Uart0_Send(srxdbuff,23);
   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 68 00 00 51 0D
//正确返回:3C 02 00 00 3E 0D
//错误返回:3C 01 FF (错误返回代码)BCC 0D

u8 CardClose()//成功则返回0,否则返回失败原因
{
  u8 i;
  u16 n;
CardCloseERR:
  srxdbuff[0]=0x3c;
  srxdbuff[1]=0x04;
  srxdbuff[2]=0x01;
  srxdbuff[3]=0x68;
  srxdbuff[4]=0x00;//0x01;
  srxdbuff[5]=0x00;
  srxdbuff[6]=0x51;
  srxdbuff[7]=0x0d;	
  Delay_10ms(); //保证每条指令之间延时20ms
  Delay_10ms();
  TR0=0; //发送标志位清零
  Uart0_Send(srxdbuff,8);
  n=20000;
   while(n)
   {
     if(rx_complete)//接收完成
	 {
	   rx_complete = 0;
	   break;
	 }
	 Delay_10ms();
	 n--;
   }
   if(n==0)
     return 1;//超时返回
  if(rxdbuff[1] == 0x01)
    {
	  return 2;			//错误返回	 
	}
  else if(rxdbuff[1] == 0x02)
	  {
	   i = XORCheck(rxdbuff,4);
	   if((i==rxdbuff[4])&&(rxdbuff[5])==0x0d)
	     {
		   i = 0;
		   return 0;//寻卡成功返回		
		 }
		else 
		{
		  i = 0;
		  return 3;//校验错误返回
		 }

	  }
    else  goto CardCloseERR;
} 
//点亮一次LED
LED_ON()
{
  srxdbuff[0]=0x3c;
  srxdbuff[1]=0x03;
  srxdbuff[2]=0x01;
  srxdbuff[3]=0x6d;
  srxdbuff[4]=0x55;//0x01;
  srxdbuff[5]=0x06;
  srxdbuff[6]=0x0d;
  Delay_10ms(); //保证每条指令之间延时20ms
  Delay_10ms();
  TR0=0; //发送标志位清零
  Uart0_Send(srxdbuff,8);
  while(!rx_complete);
  rx_complete = 0;   //接收完成了则清标志位

} 
//蜂鸣器响一声
Buzzer_ON()
{
  srxdbuff[0]=0x3c;
  srxdbuff[1]=0x03;
  srxdbuff[2]=0x01;
  srxdbuff[3]=0x6b;
  srxdbuff[4]=0x55;//0x01;
  srxdbuff[5]=0x00;
  srxdbuff[6]=0x0d;
  Delay_10ms(); //保证每条指令之间延时20ms
  Delay_10ms();
  TR0=0; //发送标志位清零
  Uart0_Send(srxdbuff,8);
  while(!rx_complete);
  rx_complete = 0;   //接收完成了则清标志位 
}
//读卡
u8 CardRead(u8 BlockNum) //读卡成功返回1,读出来的值存在CardData[16]中,失败返回0
{
  if(!CardReady())//寻卡成功
  {
    // while(!CardReady())
	 //{
	 //   CardClose();
	// }
     if(!KeyPass(BlockNum))//密码验证成功
	   {
	     if(!CardRead_step(BlockNum))//读卡某块成功
	       {
		     LED_ON();//亮一次LED
		     CardClose();//关卡
             return 0;   //成功返回
		   }
		 else
		 {
           goto Fail;	
		 } 	 		  
	    } 
      else
	  { 
       goto Fail;	
	   }	  
 } 
Fail:  
   Buzzer_ON();//蜂鸣器响一声
   CardClose();
   return 1;
}
//写卡


u8 CardWrite(u8 BlockNum)
{
   if(!CardReady())//寻卡成功
    {
     if(!KeyPass(BlockNum))//密码验证成功
	   {
	     if(!CardWrite_step(BlockNum))//写卡某块成功
	       {
		     LED_ON();//亮一次LED
		     CardClose();//关卡
             return 0;   //成功返回
		   }
		 else
           goto Fail;		 		  
	    } 
      else
	    goto Fail;	  
  } 
Fail: 
   Buzzer_ON();//蜂鸣器响一声 
   CardClose();
   return 1;
}


//-----------------------------------------------------------------------------
// 主函数
//-----------------------------------------------------------------------------

void main (void)
{
   u16 h;
  PCA0MD &= ~0x40;                 // WDTE = 0 (clear watchdog timer
                                   // enable)
  Init_SYSCLK ();
  Init_PORT ();
  Init_T0();
  Init_UART0 ();
  EA = 1; 
  _nop_();
  while(1)
  {
  _nop_();
  CardRead(15);
  _nop_();
   }

}
//定时器T0中断,用来判断接收结束
void ISR_T0 (void) interrupt 1
{
  TR0 = 0;                        // Timer0 OFF //;                        // Timer0 ON
  Numrxdi = indexUartRec;      // 需完善
  rx_complete = 1; //接收完成标志位置位
  indexUartRec = 0;
  _nop_();
  //Uart0_Send(BufUartRec, numUartRec);
  //Uart0_Send(BufUartRec, numUartRec);
}


//接收中断
void ISR_UART0 (void) interrupt 4
{
  if (RI0 == 1)
  {                                                                                                                                                                                    
    RI0 = 0;  //clear flag bit
    rxdbuff[indexUartRec] = SBUF0;
	         TH0 = T0_RELOAD_H;           // Init Timer0 High register
             TR0 = 1;                   // Timer0 ON     
    indexUartRec++;
	         if(indexUartRec >= BUFSIZE_UREC) //接收缓冲区溢出
                {
                 TF0 = 1; //触发定时器中断(待测试)
                }
  }
  else	//	 不加则会发生发送数据丢失,可能是别的地方将TI0置位而导致进入中断?			
  {
   TI0 = 0;
  }
}

⌨️ 快捷键说明

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