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

📄 11t6_sc.c

📁 读写Mifare One卡, 说明:此例程为一个块的读写操作
💻 C
📖 第 1 页 / 共 3 页
字号:
	                       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(j=0;j<100;j++);
					benci=1;
                    //chongxinshuaka=tingzhizhi;
            
				   // for (i=0;i<16;i++)
				       // sen(CardDataBuf[i]);
                   sen(0x30);

				   };
				//if (benci==1)keyitongxing=bofang;
	            //如果内容不为 0 则  嘀  嘀  嘀 响3声;
                if (douweiling==0 )
				   {
				   //如果内容不为 0 则  嘀  嘀  嘀 响3声;
                 TurnOff_Card();  //关闭卡片
 
                for(k=0;k<3;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++);
                    };

                  // CardBlockNo=0x0c;
      	          // Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
			      // for(i=0;i<16;i++)
				   //  CardDataBuf[i]=0x00;
				  // Write_Card(CardBlockNo,CardDataBuf);
			       //for(i=0;i<16;i++)
				    //  CardDataBuf[i]=0x03;

                  // Read_Card(CardBlockNo,CardDataBuf);
				  // for (i=0;i<16;i++)
				    // sen(CardDataBuf[i]);
                     sen(0x33);

				   };
			 }   
            else	 //如果是非注册用户 则响  5 声;
			 {
                 //响  5 声
				    // keyitongxing=tingzhizhi;
                    //chongxinshuaka=bofang;
					 TurnOff_Card();  //关闭卡片
                for(k=0;k<5;k++)  //响5声
				   {
				    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++);
                    };

			        sen(0x35);
			 };
	 
   }



//************************************************8
void main(void)
{
	uchar i,j,k;
	uchar data CardNo[4],CardBlockKey[6];
	uchar idata CardDataBuf[16];
	bit qidongzhuangtai;
	uchar CardBlockNo=02; //默认块02(0-63)
    uchar BlockKeyAorB=0;//A套密码
	 
    //TL1=0xfa;
	//TH1=0xfa;
	//TL0=0x30;
	//TH0=0x30;
//	TMOD=0x21;  
	//SCON=0x50;   // 串口工作方式1,允许接收
   // PCON = 0x80;
//	ET0=1;
	//TR0=1;
//	EA=1;
 //	REN=1;
   // TR1=1;

	 PCON = 0x00;   //SMOD=0
     TMOD = 0x20;   //Timer1:Mode2
     TH1  = 0xfd;   //9600Baud, 11.059M
     TL1  = 0xfd;
     SCON = 0x50;   //mode 1,8bit UART ,SM2=0,REN=1
     TR1  = 1;
	 Init_UART();
     keyitongxing=tingzhi;
     chongxinshuaka=tingzhi;
	for(i=0;i<6;i++) CardBlockKey[i]=0xff;
	for(i=0;i<4;i++) CardNo[i]=i+1;

    //writertc(qidongzhuangtaidizhi,0x30);
	qidongzhuangtai=0;
    if (readrtc(qidongzhuangtaidizhi)==0x31)
	   qidongzhuangtai=1;
	//判断是否进行过启动操作
     for (i=0;i<250;i++)
	    for(j=0;j<200;j++);
     for (i=0;i<250;i++)
	    for(j=0;j<200;j++);
     for (i=0;i<250;i++)
	    for(j=0;j<200;j++);
     for (i=0;i<250;i++)
	    for(j=0;j<200;j++);
 	if (qidongzhuangtai==1)
         {sen(0x31);}
	  else
	     sen(0x30);


//	GREEN_LINE=0;		  //green led on
//	delay10ms(50);
//	GREEN_LINE=1;		  //led off

//	RED_LINE=0;			  //red led on
//	delay10ms(50);
//	RED_LINE=1;			  //led off
            
//	display(tmpResult);
//	led_cyc_on();        

    while(1)
    {
 
 start: 
       time=0;
	  
       tmpResult=0xFC;
	   // led_cyc_on();
     // for (i=0;i<250;i++);
	    //for(j=0;j<100;j++);
         keyitongxing=tingzhi;
       chongxinshuaka=tingzhi;
		//  if (benci==1)keyitongxing=bofang;
       keyitongxing=tingzhi;
       chongxinshuaka=tingzhi;

/*-----------------------------------------------------------------------------------------------
;Step1
;通讯测试
;下传命令:3C 04 00 60 00 00  BCC 0D
;成功返回:3C 01 01 BCC 0D
;错误返回:3C 01 00 BCC 0D*/

     

	  Commu_test();
	  //SetRes(CardStatus,1); //Result中最高位是Commu_Test成功标志,执行此条把tmpResult的最高位置零
  	  delay10ms(3); 
 //延时30ms



 
/*-----------------------------------------------------------------------------------------------
;Step2
;寻卡 void	Search_Card(uchar *CardNo,uchar SearMode)
;下传命令:3C 04 01 70 00(寻卡模式00(IDLE)或01(ALL)) 00 BCC 0D
;成功返回:3C 05 四字节卡号 00 BCC 0D
;错误返回:3C 01 FF(错误返回代码) BCC 0D
;其中:00寻卡模式要求操作的卡在读写完成后要离开感应区才能再读写;
;01寻卡模式要求操作的卡在读写完成后卡片只需关闭后又可读写;*/
    if (CardStatus)  //如果通讯测试正常,则执行寻卡操作
	      {Search_Card(CardNo,SearMode);}
      else
	      {
		   //chongxinshuaka=bofang;
		    //benci=0;
	       goto start;
          };
 //************************************************
//发送卡号
  
 
 //	for(i = 0; i<4; i++) //依次发送待合成的文本数据
			//	{ SBUF = CardNo[i];
			//		while (TI == 0) ;
			//		TI = 0;
			//		//CardNo++;
			//	};

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

	//SetRes(CardStatus,2);//Result中第二位成功标志,执行此条把tmpResult的第二位置零
	delay10ms(3);

/*-----------------------------------------------------------------------------------------------
;Step3
;密码验证:void Psd_Verify(uchar *BlockKey,uchar BlockKeyAorB,uchar BlockNo,uchar *CardNo)
;下传命令:3C 0E 01 6C 六字节密码 认证模式(00-A/01-B) 绝对块号 四字节卡号 BCC 0D
;成功返回:3C 02 00 00 BCC 0D
;错误返回:3C 01 FF(错误代码) BCC 0D
;其中:0为A密码,1为B密码*/
 // CardBlockNo=0x0c;
 if (CardStatus)  //如果寻卡正常,则执行密码验证操作
     	{Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
		 //benci=0;
        }
      else
	      {
		   //chongxinshuaka=bofang;
           //benci=0;
	       goto start;

          };
	//SetRes(CardStatus,3);
	//sen(0xfe);
	delay10ms(3);
			    //   for(i=0;i<16;i++)
				  //   CardDataBuf[i]=0x00;
				 //  Write_Card(CardBlockNo,CardDataBuf);
			    //   for(i=0;i<16;i++)
				 //     CardDataBuf[i]=0x03;

                 //  Read_Card(CardBlockNo,CardDataBuf);
				  // for (i=0;i<16;i++)
				  //   sen(CardDataBuf[i]);

/*-----------------------------------------------------------------------------------------------
;Step4
;读卡: void Read_Card(uchar BlockNo,uchar *CardDataBuf)
;下传命令:3C 04 01 66 00(绝对块号) 00 BCC 0D
;成功返回:3C 12 00 DATA0~DATA15 BCC 0D
;错误返回:3C 01 FF(错误返回代码) BCC 0D*/
//        CardBlockNo=55;
    if (CardStatus)  //如果密码验证通过,则执行读取块1操作
	    {
          CardBlockNo=0x01;
	      Read_Card(CardBlockNo,CardDataBuf);
		}
	  else
	      {
		   //chongxinshuaka=bofang;
	       goto start;
          };

//	SetRes(CardStatus,4);
	delay10ms(3);
    if (CardStatus)  //如果读取块1数据正常,则执行卡类识别操作
	    {
		 if (CardDataBuf[0]==0xaa)  //如果是启动卡
		     {
			  //调用网点设置程序
               wangdianshezhi(CardNo);
			   //sen(0xee);

               writertc(qidongzhuangtaidizhi,0x31);   //设置启动状态数据字节
			   qidongzhuangtai=1;
			   TurnOff_Card();  //关闭卡片

			   sen(0x39);
                for(k=0;k<1;k++)  //响一长声
				   {
				    beep=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++);
				    beep=tingzhi;
                    };

			   goto start;
			 };   
		 if (CardDataBuf[0]==0x55 && qidongzhuangtai ) //如果是通行卡,并且处于启动状态
		     {  //调用网点判断及处理程序
			    wangdianpanduan(CardNo);
                //响 1声
			//	sen(0x31);

			   // TurnOff_Card();  //关闭卡片
			    goto start;
			 };   
		 if (CardDataBuf[0]==0x55 && qidongzhuangtai==0 ) //如果是通行卡,并且处于不启动状态
		     {  
                //响 5 声
			    TurnOff_Card();  //关闭卡片
                sen(0x37);
                for(k=0;k<5;k++)  //响5短声
				   {
				    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++);
                    };
			    goto start;
			 };   
		}
	  else
	      {
		   chongxinshuaka=bofang;
	       goto start;
          };
    
/*;-----------------------------------------------------------------------------------------------
;Step5
;写卡:void Write_Card(uchar BlockNo,uchar *CardDataBuf)
;下传命令:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
;成功返回:3C  02 00 00 BCC 0D
;错误返回:3C 01 FF(错误返回代码) BCC 0D*/
//	for(i=0;i<16;i++) CardDataBuf[i]=8;
//	Write_Card(CardBlockNo,CardDataBuf);
//	SetRes(CardStatus,5);
//	delay10ms(3);

/*;-----------------------------------------------------------------------------------------------
;Step6
;关闭卡片:3C 04 01 68 00 00 51 0D
;正确返回:3C 02 00 00 3E 0D
;错误返回:3C 01 FF (错误返回代码)BCC 0D*/
    if (CardStatus)  //如果密码验证通过,则执行读取块1操作
	    {
  	    // TurnOff_Card();
		}
	  else
	      {
		   //chongxinshuaka=bofang;
	       goto start;
          };
	//TurnOff_Card();
	//SetRes(CardStatus,6);
	delay10ms(3);
   // display(tmpResult);

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

//数据区:
   //启动卡:1块   4块
       // 1块:AA 以后全零
	   // 4块:02 38 02 38  以后全零


   //通行卡:1块   4块 
       // 1块:55 以后全零
	   // 4块:02 38 以后全零


       //使用后  	C块    D块   E块   10块
           //C块:02 38 09 02 18 54 00 10 除最后1个外全零  02

           //D块:02 38 09 02 18 55 00 10 除最后1个外全零  02

		   //E块:同D块

		   //10块:同D块


//2007.9.3  程序流程


//上电流程
  //1、读取标志,判断是否初始化过;
  //2、如果初始化过,则初始化标志置位,等待读卡;
  //3、如果没有初始化过,等待读卡;


//1、寻卡
//2、如果有卡则密码验证
//3、验证正确后,读1块,判断是启动卡,还是通行卡
//4、如果是启动卡,读取4块,验证数据一致性,如果一致则存储数据
//5、如果是通行卡,读取4块,验证是否和启动数据一致,如果一致并且C块没有数据则写收车数据;
//6、如果和启动数据不一致,则报告错误;
//7、返回  寻卡






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


    }
}

⌨️ 快捷键说明

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