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

📄 read_write_card.txt

📁 C8051F310开发的低成本的读写卡的方案
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    rxdbuff[4]=0x00;
    rxdbuff[5]=0x00;
    rxdbuff[6]=0x51;
    rxdbuff[7]=0x0d;
    uarttxd(7);
    rxdi=0;//清空

   Delay_10ms();Delay_10ms();//Delay_10ms();Delay_10ms();
   // for (i=0;i<20;i++) Delay_10ms();
    n=0;
    while (n<30)
     {
     if (rxdbuff[4]==0x0d) break;
     if (rxdi>=6) break;
     Delay_10ms();
     n++;
     }
    rxdi=0;
    if (rxdbuff[1]==0x02) return 0;//成功
    else return 1;//失败
   }
/////////////////密码验证(只用A密码)//////////
BYTE  SetPassword()
{
uint n;
//uchar i;
//下传命令:3C  0A 01 69 00(A套密码) 00(扇区号=00~15) 六字节卡密码 BCC 0D
//成功返回:3C 02 00 00 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D

  Delay_10ms(); Delay_10ms();
    rxdbuff[0]=0x3c;
    rxdbuff[1]=0x0a;
    rxdbuff[2]=0x01;
    rxdbuff[3]=0x69;
    rxdbuff[4]=0x00;//01
    rxdbuff[5]=0x00;//00~15
    //////////////  六字节密码

    rxdbuff[6]=0xff;
    rxdbuff[7]=0xff;
    rxdbuff[8]=0xff;
    rxdbuff[9]=0xff;
    rxdbuff[10]=0xff;
    rxdbuff[11]=0xff;
   /////////////    六字节密码
    rxdbuff[12]=XORCheck(rxdbuff,12);

    rxdbuff[13]=0x0d;
    uarttxd(13);  //发密码
   // rxdbuff[15]=0;
    rxdi=0;
//////////////////////////////////////////////
    n=0;
    while (n<30)
     {
     if (rxdbuff[4]==0x0d) break;//错误返回
     if (rxdi>=6) break;
     Delay_10ms();
     n++;
     }
      rxdi=0;
    if (rxdbuff[1]==0x02) return 0;
    else return 1;
     // rxdbuff[4]=0;
}

////////////////读指定块号处得到16位//////////////////////////////
BYTE  ReadCard(BYTE BlockNo)        //耗时
{
        BYTE i,value;
        uint n=0;
/////////////////////////////////密码验证
///下传命令:3C 08 01 6A 00(A密码或B密码01) 00(块号) 四字节卡号 BCC 0D
///成功返回:3C 02 00 00 BCC 0D
///错误返回:3C 01 FF(错误代码) BCC 0D

    Delay_10ms(); Delay_10ms();
//      Delay_10ms(); Delay_10ms();
//       Delay_10ms(); Delay_10ms();  Delay_10ms(); Delay_10ms();
    rxdbuff[0]=0x3c;    //密码验证
    rxdbuff[1]=0x08;
    rxdbuff[2]=0x01;
    rxdbuff[3]=0x6a;
    rxdbuff[4]=0x00;//01
    rxdbuff[5]=BlockNo;//
    ///////////////////////////
    rxdbuff[6]=CardNO1[0];
    rxdbuff[7]=CardNO1[1];
    rxdbuff[8]=CardNO1[2];
    rxdbuff[9]=CardNO1[3];

    rxdbuff[10]=XORCheck(rxdbuff,10);

    rxdbuff[11]=0x0d;
    uarttxd(11);
        rxdi=0;
//////////////////////////////////////////////
    Delay_10ms();

    n=0;
    while (n<30)
     {
     if (rxdbuff[4]==0x0d) break;
     if (rxdi>=6) break;
     Delay_10ms();
     n++;
     }
      rxdi=0;
     if (rxdbuff[1]!=0x02)
       {value=1;//不成功
	   goto rcardret;};
 //---------     rxdbuff[4]=0;
///////////////////////////////////////////////////
    //3C 04 01 66 00(绝对块号) 00 BCC 0D
    // 成功返回:3C 17 00 DATA0~DATA15 BCC 0D
    // 错误返回:3C 01 FF(错误返回代码) BCC 0D

 Delay_10ms(); Delay_10ms();

    rxdbuff[0]=0x3c;    //读卡命令
    rxdbuff[1]=0x04;
    rxdbuff[2]=0x01;
    rxdbuff[3]=0x66;
    rxdbuff[4]=BlockNo;//
    rxdbuff[5]=0x00;

    rxdbuff[6]=XORCheck(rxdbuff,6);

    rxdbuff[7]=0x0d;
    uarttxd(7);  //发读命令
	rxdi=0;

//////////////////////////////////////////////
    n=0;
    while (n<30)
     {
     if (rxdbuff[4]==0x0d) break;
     if (rxdi>=21) break;
     Delay_10ms();
     n++;
     }

     value=(rxdbuff[1]==0x17)?0:1;
      rxdi=0;

      for(i = 0; i < 16; i++) 
	  	CardData[i] = rxdbuff[i+3];

rcardret:
      CloseCard();
    return value;
}

///////////////////在指定地方写卡///////////////////////////
BYTE  WriteCard(BYTE BlockNo)            
{   uchar i,value;
     uint n=0;
/////////////////////////////////密码验证
///下传命令:3C 08 01 6A 00(A密码或B密码01) 00(块号) 四字节卡号 BCC 0D
///成功返回:3C 02 00 00 BCC 0D
///错误返回:3C 01 FF(错误代码) BCC 0D


    Delay_10ms(); Delay_10ms(); 

    rxdbuff[0]=0x3c;    //密码验证
    rxdbuff[1]=0x08;
    rxdbuff[2]=0x01;
    rxdbuff[3]=0x6a;
    rxdbuff[4]=0x00;
    rxdbuff[5]=BlockNo;//
    ///////////////////////////
    rxdbuff[6]=CardNO1[0];
    rxdbuff[7]=CardNO1[1];
    rxdbuff[8]=CardNO1[2];
    rxdbuff[9]=CardNO1[3];
    //////////////////////////

    rxdbuff[10]=XORCheck(rxdbuff,10);

    rxdbuff[11]=0x0d;
    uarttxd(11);
    rxdi=0;
//////////////////////////////////////////////
    Delay_10ms();

    n=0;
    while (n<30)
     {
     if (rxdbuff[4]==0x0d) break;
     if (rxdi>=6) break;
     Delay_10ms();
     n++;
     }
      rxdi=0;
     if (rxdbuff[1]!=0x02)
       {value=1;
	    goto wcardret;}
 //     rxdbuff[4]=0;
///////////////////////////////////////////////////
    //写卡:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
    //成功返回:3C 02 00 00 BCC 0D
    //错误返回:3C 01 FF(错误返回代码) BCC 0D
   Delay_10ms(); Delay_10ms();

    rxdbuff[0]=0x3C;    //卡命令
    rxdbuff[1]=0x13;
    rxdbuff[2]=0x01;
    rxdbuff[3]=0x67;
    rxdbuff[4]=BlockNo;//

    for (i=0;i<16; i++) 
		rxdbuff[i+5]=CardData[i];

    rxdbuff[21]=XORCheck(rxdbuff,21);

    rxdbuff[22]=0x0d;
    uarttxd(22);  //写命令	由低位->高位发送
    rxdi=0;

//////////////////////////////////////////////
 Delay_10ms();

   n=0;
    while (n<30)
     {
     if (rxdbuff[4]==0x0d) break;
     if (rxdi>=6) break;
     Delay_10ms();
     n++;
     }

    value=(rxdbuff[1]==0x02)?0:1;
      if ((n==30)&&(rxdi==0)) value=2;//写失败
wcardret:
    CloseCard();
   return value;
}
///////////////////延时足够长时间///////////////////
 void delay(unsigned int count)
{    unsigned int  i;    for(i=0;i<=count;i++){};  }

/////////////////////异或/////////////////////////
BYTE XORCheck(BYTE *psData,BYTE length)
{
	BYTE i;
	BYTE XORData;

	XORData = 0;

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

	return XORData;
}

//////////////////写卡号////////////////////////////
   unsigned char write_card(unsigned char cardNO)
   {
     unsigned char CardInOk,WriteOK;
     delay(7000);
     CardInOk=CardReady();
     if(CardInOk!=0)return(1);
     WriteOK=WriteCard(cardNO);

     if(WriteOK==0)return(0);
     if(WriteOK==2)return(2);
     else return(1);
   }


//内部晶振24。5M,波特率为9600
//TH1=0x6A;
//CKCON=XXXX0X00;
//////////////////////时钟初始化/////////////////////////
void SYSCLK_Init (void)
{ 
OSCICN |= 0x03;                     // Configure internal oscillator for
                                       // its maximum frequency
   RSTSRC = 0x04;                      // Enable missing clock detector
}


//-----------------------------------------------------------------------------
// 串口及端口初始化
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//////////////////////串口及端口初始化//////////////////////////////////////////
void UART0_Init (void)
{
	  

// 		P0SKIP=0X0c;       //跳过晶振
		P0MDOUT=0xff;       
  		P1MDOUT=0xff;       //系统初始化
  		P2MDOUT=0xff;
  		P3MDOUT=0xff;
		P0SKIP=0x80;       //跳过P0.6,用于外部中断    
		XBR0=0x01;        //使用外部时钟,串口允许交叉开关
  		XBR1=0xc0;          //禁止弱上拉,使能交叉译码开关

        P0=P1=P2=0X00;     //FF;


        SCON0 = 0x10;        // SCON0: 8-bit variable bit rate
		                              
        TI0 = 1;               //串口发送中断标志                        
        EA=1;                // 全部中断控制
                         //T1=10;//不允许定时器1中断

		PS0=1;             //串口优先
        PT1=1;             //定时器1优先
        IT01CF=0x0c;        //配制中断数据传输外部中断寄存器,INT0端口为P0.6
        IT0=1;           
}

/////////////////////////定时器1初始化///////////////////////////////////
void Timer1_Init (void)
{
   if (SYSCLK/BAUDRATE/2/256 <1)
   {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx
      CKCON |=  0x08;
   } else if (SYSCLK/BAUDRATE/2/256 < 4)
 {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01                  
      CKCON |=  0x09;
   } else if (SYSCLK/BAUDRATE/2/256 < 12)
 {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   } else {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   }

   TL1 = TH1;                          // init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;                       
   TR1 = 1;     // START Timer1
 }  

  //////////////*主函数*////////////////
 void main()
 {
// 	uchar i;
    unsigned char CardInOk;
 /////////////////内部初始化/////////////////

		PCA0MD=0x00;    //停止看门狗

		SYSCLK_Init ();//时钟初始化

		UART0_Init ();//串口及端口初始化

		Timer1_Init ();//定时器1初始化

//////////////////////外设初始化////////////////////////////



//////////////////////主程序开始//////////////////////////

   delay(20000);




//     CardInOk=SetPassword();	//设置密码
      for(;;)                              //主循环
     {
       delay(1800);                   //主循环开始
       CardInOk=CardReady();

        delay(15000);
       CardInOk=ReadCard(1);
        delay(15000);
       CardInOk=write_card(1);
     }  
//L///////////////主程序/////////////////////
/*
while(1)
{
	while(1)//提起枪
	{
		while(!GUN);
		Delay_10ms();Delay_10ms();Delay_10ms();
		if(GUN)break;
	}
	///开中断///

	while(1)//放下枪
	{
		while(GUN);
		Delay_10ms();Delay_10ms();Delay_10ms();
		if(!GUN)break;
	}
	for(i=0;i<16;i++)
		card_ad[i]=LEDBUF[i];
	//关中断///
}
*/
//L///////////////////主程序结束////////////////
}

⌨️ 快捷键说明

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