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

📄 11t6_sc.c

📁 读写Mifare One卡, 说明:此例程为一个块的读写操作
💻 C
📖 第 1 页 / 共 3 页
字号:
	txbuff[17]=0x0D;

    for(i=0;i<18;i++)
	{
		UART_PutByte(txbuff[i]);
	}

//;--------------------------------------------------------------------
//; Right: 3C 02 00 00 BCC 0D
//; Error: 3C 01 FF(错误代码) BCC 0D
//;--------------------------------------------------------------------
	for(i=0;i<6;i++)
        {
		rxbuff[i]=UART_GetByte();
                if(rxbuff[0]!=0x3C)i=0;
                if(rxbuff[i]==0x0D)break;
        }
    if(rxbuff[0]!=0x3C)goto t113;
    if(rxbuff[1]!=0x02)goto t113;
    if(rxbuff[2]!=0x00)goto t113;
    if(rxbuff[3]!=0x00)goto t113;
    if(rxbuff[5]!=0x0d)goto t113;
t113:        rxbuff[6]=0;
        for(i=0;i<4;i++)rxbuff[6]^=rxbuff[i];
	if(rxbuff[2]==0)
           if(rxbuff[4]==rxbuff[6])
		CardStatus=0x01;

}

/*--------------------------------------------------------------------
 FUNCTION: Read_Card,读指定块数据
 INPUT:	   uchar BlockNo,uchar *CardDataBuf
 OUTPUT:   16byte CardData,1byte CardStatus
--------------------------------------------------------------------*/
/**************************************************
四、	读指定块数据
;command:3C 04 01 66 00(绝对块号) 00 BCC 0D
**************************************************/
void Read_Card(uchar BlockNo_,uchar *CardDataBuf_)
{	uchar i;
	uchar txbuff[8];
	uchar rxbuff[22];
//t114:
    CardStatus=0;
	txbuff[0]=0x3C;
	txbuff[1]=0x04;
	txbuff[2]=0x01;
	txbuff[3]=0x66;
	txbuff[4]=BlockNo_;
	txbuff[5]=0x00;
        txbuff[6]=0;
	for(i=0;i<6;i++)txbuff[6]^=txbuff[i];
	txbuff[7]=0x0D;

    for(i=0;i<8;i++)
	{
		UART_PutByte(txbuff[i]);
	}
//;--------------------------------------------------------------------
//; Right: 3C 12 00 DATA0~DATA15 BCC 0D
//; Error: 3C 01 FF(错误返回代码) BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
	for(i=0;i<21;i++)
	{
		rxbuff[i]=UART_GetByte();
                if(rxbuff[0]!=0x3C)i=0;
                if(rxbuff[i]==0x0D)break;
	}
    if(rxbuff[0]!=0x3C)goto t114;
    if(rxbuff[1]!=0x12)goto t114;
    if(rxbuff[2]!=0x00)goto t114;
t114:	rxbuff[21]=0;
	for(i=0;i<19;i++)
		rxbuff[21]^=rxbuff[i];
	if(rxbuff[19]==rxbuff[21])
	  if(rxbuff[1]==0x12)	//成功取卡中的值
	  {	CardStatus=0x01;
		for(i=0;i<16;i++)
			*CardDataBuf_++=rxbuff[3+i];	//取卡数据
	  }

}

/*--------------------------------------------------------------------
 FUNCTION: Write_Card,向指定块写数据
 INPUT:	   uchar BlockNo,uchar *CardDataBuf
 OUTPUT:   1byte CardStatus
--------------------------------------------------------------------*/
/**************************************************
五、	向指定块写数据
command:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
***************************************************/
void Write_Card(uchar BlockNo_,uchar *CardDataBuf_)
{
	uchar i;

	uchar txbuff[23];
	uchar rxbuff[7];
        //i=BlockNo_;
        //i=*CardDataBuf_;//
//t115:
CardStatus=0;
	txbuff[0]=0x3C;
	txbuff[1]=0x13;
	txbuff[2]=0x01;
	txbuff[3]=0x67;
        txbuff[4]=BlockNo_;
	txbuff[4]=BlockNo_;			//block
	for(i=0;i<16;i++)
		txbuff[5+i]=*CardDataBuf_++;	//待写数据
        txbuff[21]=0;
	for(i=0;i<21;i++)
                txbuff[21]^=txbuff[i]; //BCC
	txbuff[22]=0x0D;

    for(i=0;i<23;i++)
	{
		UART_PutByte(txbuff[i]);
	}
//;--------------------------------------------------------------------
//;Write_Card return
//; Right: 3C  02 00 00 BCC 0D
//; Error: 3C 01 FF(错误返回代码) BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
	for(i=0;i<7;i++)
	{
		rxbuff[i]=UART_GetByte();
                if(rxbuff[0]!=0x3C)i=0;
		if(rxbuff[i]==0x0D)break;
	}
    if(rxbuff[0]!=0x3C)goto t115;
    if(rxbuff[1]!=0x02)goto t115;
    if(rxbuff[2]!=0x00)goto t115;
    if(rxbuff[3]!=0x00)goto t115;
    if(rxbuff[5]!=0x0d)goto t115;
t115:
        rxbuff[6]=0;
        for(i=0;i<4;i++)
                 rxbuff[6]^=rxbuff[i];
        if(rxbuff[6]==rxbuff[4])
                 CardStatus=0x01;

}
//==Write_Card end==

/*--------------------------------------------------------------------
 FUNCTION: TurnOff_Card,关卡
 INPUT:
 OUTPUT:   CardStatus
--------------------------------------------------------------------*/
/**************************************************
八、	关卡,关掉的M1卡片,这个命令不仅仅是关卡,还让读卡电路恢复到主动寻卡状态
command:3C 04 01 68 00 00 51 0D
**************************************************/

void 	TurnOff_Card(void)
{	uchar i;
	uchar txbuff[8];
	uchar rxbuff[7];
//t116:
    CardStatus=0;
	txbuff[0]=0x3C;
	txbuff[1]=0x04;
	txbuff[2]=0x01;
	txbuff[3]=0x68;
	txbuff[4]=0x00;
	txbuff[5]=0x00;
        txbuff[6]=0x51;
        txbuff[7]=0x0D;

    for(i=0;i<8;i++)
		UART_PutByte(txbuff[i]);
//;--------------------------------------------------------------------
//; Right: 3C 02 00 00 3E 0D
//; Error: 3C 01 FF (错误返回代码)BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
	for(i=0;i<6;i++)
	{
		rxbuff[i]=UART_GetByte();
                if(rxbuff[0]!=0x3C)i=0;
		if(rxbuff[i]==0x0D)break;
	}
    //if(rxbuff[0]!=0x3C)goto t116;
    //if(rxbuff[1]!=0x02)goto t116;
    //if(rxbuff[2]!=0x00)goto t116;
    //if(rxbuff[3]!=0x00)goto t116;
    //if(rxbuff[4]!=0x3e)goto t116;
   if(rxbuff[5]!=0x0d)goto t116;
t116:        rxbuff[7]=0;
        for(i=0;i<4;i++)rxbuff[7]^=rxbuff[i];
        if(rxbuff[7]==rxbuff[4])CardStatus=0x01;

}

/*--------------------------------------------------------------------
 FUNCTION: SetRes,如果该step失败,将tmpResult中该步对应位调整为0,操作成功则不做改变
 INPUT:	   CardStatus(step succed equal 0x01)
 OUTPUT:   tmpResult
--------------------------------------------------------------------*/
void SetRes(uchar RES,uchar NUM)
{
        uchar temp1,temp2;
        if(RES==0)     //如果SETP操作失败(完成标记字节为零),调整tmpResult中对应该位为0态
         {
	   temp1=0xFF>>NUM;
           temp2=0xFF<<9-NUM;
           temp1=temp1|temp2;
	   tmpResult=temp1&tmpResult;
	}

}
/*--------------------------------------------------------------------
 FUNCTION: display() ;操作成功步对应位绿灯亮;操作失败步对应位红灯亮
 INPUT:	   tmpResult
 OUTPUT:   P1 AND P3.5 OR P3.7
--------------------------------------------------------------------*/
void display(uchar DispData)
{	P1=DispData;		//操作成功步对应位亮
	GREEN_LINE=0;   //绿灯亮
	delay10ms(20);
	GREEN_LINE=1;   //绿灯灭
	P1=~DispData&0xfc;      //操作失败步对应位亮
	RED_LINE=0;	//红灯亮
	delay10ms(30);
	RED_LINE=1;	//红灯灭
}

/*--------------------------------------------------------------------
 FUNCTION: led_cyc_on()
 INPUT:
 OUTPUT:
--------------------------------------------------------------------*/
//void led_cyc_on(void)
//{
  //  uchar i,Ddata=0x80;
  //  P1=0x00;
//	GREEN_LINE =1;
//	RED_LINE=1;
//	delay10ms(10);
//	GREEN_LINE=0;
//	for(i=0;i<8;i++)
//	{
//
//	    P1=_cror_(Ddata,i);
	//	delay10ms(10);

//	}
/*	GREEN_LINE=1;
	RED_LINE=0;
	Ddata=0x01;
	for(i=0;i<8;i++)
	{

	    P1=_crol_(Ddata,i);
		delay10ms(20);

	}*/
//	GREEN_LINE =1;
//	RED_LINE=1;
//}

//**************************************************
void wangdianshezhi(uchar *CardNo)
   {
     uchar CardBlockNo,i;
	 //uchar data CardNo[4];
	 uchar CardDataBuf[16];
	 uchar data CardBlockKey[6];
     uchar BlockKeyAorB=0;//A套密码
	 for(i=0;i<6;i++) CardBlockKey[i]=0xff;
	 //for(i=0;i<4;i++) CardNo[i]=i+1;

      //读块4
jixudukuai4:
 
          CardBlockNo=0x04;
      	  Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
          if (CardStatus)
		    {
            CardBlockNo=0x04;
	        Read_Card(CardBlockNo,CardDataBuf);
			//for (i=0;i<16;i++)
		       //sen(CardDataBuf[i]);
		       //sen(CardDataBuf[0]);
		       //sen(CardDataBuf[1]);
            };
		  if (CardStatus) 
 		        {
 			      writertc(wangdiangaodizhi,CardDataBuf[0]);
				  writertc(wangdiandidizhi,CardDataBuf[1]);
				 // sen(readrtc(wangdiangaodizhi));
				 // sen(readrtc(wangdiandidizhi));
		    	}
             else
			    goto jixudukuai4;

   }


void wangdianpanduan(uchar *CardNo)
   {
     uchar   BlockNo,CardBlockNo,i,j,k;
	 //uchar data CardNo[4];
 	 uchar CardDataBuf[16];
	 uchar data CardBlockKey[6];
     uchar BlockKeyAorB=0;//A套密码
     bit douweiling;
	 for(i=0;i<6;i++) CardBlockKey[i]=0xff;
	 //for(i=0;i<4;i++) CardNo[i]=i+1;
     //读取第4块   
          CardBlockNo=0x04;
      	  Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
	      Read_Card(CardBlockNo,CardDataBuf);
          
	 //如果是注册用户则读取第C块
		 if (CardDataBuf[0]==readrtc(wangdiangaodizhi) && CardDataBuf[1]==readrtc(wangdiandidizhi))  //如果是启动卡
		     {
			    //读取第C块
                CardBlockNo=0x0c;
      	        Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
                Read_Card(CardBlockNo,CardDataBuf);
                //如果内容为16个 0 则 写数据 ,播放可以通过声音 
				douweiling=1;
                for(i=0;i<16;i++)
				   {
				    if ( CardDataBuf[i]!=0)
					   	douweiling=0;
				   };

                if (douweiling==1)
				   {
				   //如果内容为16个 0 则 写数据 ,播放可以通过声音 
				   BlockNo=0x0c;
                   CardDataBuf[2]=readrtc(0x08);     //月
                   CardDataBuf[3]=readrtc(0x07);     //日
                   CardDataBuf[4]=readrtc(0x04);     //时
                   CardDataBuf[5]=readrtc(0x02);     //分
                   CardDataBuf[6]=0x00;     //00
                   CardDataBuf[7]=0x10;     //10
                   CardDataBuf[15]=0x02;     //02
                   CardDataBuf[0]==readrtc(wangdiangaodizhi);
                   CardDataBuf[1]==readrtc(wangdiandidizhi);


				     
				   Write_Card(BlockNo,CardDataBuf);
                   TurnOff_Card();  //关闭卡片
 
                   // Read_Card(CardBlockNo,CardDataBuf);
				   for(k=0;k<2;k++)  //响3声
				   {
				    beep=bofang;
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
				    beep=tingzhi;
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
                    };

 				    keyitongxing=bofang;
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
                    for (i=0;i<250;i++)
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
	                       for(j=0;j<100;j++);

				   for(k=0;k<2;k++)  //响3声
				   {
				    beep=bofang;
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
				    beep=tingzhi;
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
                    };

 				    keyitongxing=bofang;
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
                    for (i=0;i<250;i++)
	                       for(j=0;j<100;j++);
                    for (i=0;i<250;i++)

⌨️ 快捷键说明

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