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

📄 11t6_sc.lst

📁 读写Mifare One卡, 说明:此例程为一个块的读写操作
💻 LST
📖 第 1 页 / 共 3 页
字号:
 472   1      
 473   1      }
 474          
 475          /*--------------------------------------------------------------------
 476           FUNCTION: Write_Card,向指定块写数据
 477           INPUT:    uchar BlockNo,uchar *CardDataBuf
 478           OUTPUT:   1byte CardStatus
 479          --------------------------------------------------------------------*/
 480          /**************************************************
 481          五、    向指定块写数据
 482          command:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
 483          ***************************************************/
 484          void Write_Card(uchar BlockNo_,uchar *CardDataBuf_)
 485          {
 486   1              uchar i;
 487   1      
 488   1              uchar txbuff[23];
 489   1              uchar rxbuff[7];
C51 COMPILER V7.06   11T6_SC                                                               09/12/2007 12:40:46 PAGE 9   

 490   1              //i=BlockNo_;
 491   1              //i=*CardDataBuf_;//
 492   1      //t115:
 493   1      CardStatus=0;
 494   1              txbuff[0]=0x3C;
 495   1              txbuff[1]=0x13;
 496   1              txbuff[2]=0x01;
 497   1              txbuff[3]=0x67;
 498   1              txbuff[4]=BlockNo_;
 499   1              txbuff[4]=BlockNo_;                     //block
 500   1              for(i=0;i<16;i++)
 501   1                      txbuff[5+i]=*CardDataBuf_++;    //待写数据
 502   1              txbuff[21]=0;
 503   1              for(i=0;i<21;i++)
 504   1                      txbuff[21]^=txbuff[i]; //BCC
 505   1              txbuff[22]=0x0D;
 506   1      
 507   1          for(i=0;i<23;i++)
 508   1              {
 509   2                      UART_PutByte(txbuff[i]);
 510   2              }
 511   1      //;--------------------------------------------------------------------
 512   1      //;Write_Card return
 513   1      //; Right: 3C  02 00 00 BCC 0D
 514   1      //; Error: 3C 01 FF(错误返回代码) BCC 0D
 515   1      //;--------------------------------------------------------------------
 516   1      //;;;;;;
 517   1              for(i=0;i<7;i++)
 518   1              {
 519   2                      rxbuff[i]=UART_GetByte();
 520   2                      if(rxbuff[0]!=0x3C)i=0;
 521   2                      if(rxbuff[i]==0x0D)break;
 522   2              }
 523   1          if(rxbuff[0]!=0x3C)goto t115;
 524   1          if(rxbuff[1]!=0x02)goto t115;
 525   1          if(rxbuff[2]!=0x00)goto t115;
 526   1          if(rxbuff[3]!=0x00)goto t115;
 527   1          if(rxbuff[5]!=0x0d)goto t115;
 528   1      t115:
 529   1              rxbuff[6]=0;
 530   1              for(i=0;i<4;i++)
 531   1                       rxbuff[6]^=rxbuff[i];
 532   1              if(rxbuff[6]==rxbuff[4])
 533   1                       CardStatus=0x01;
 534   1      
 535   1      }
 536          //==Write_Card end==
 537          
 538          /*--------------------------------------------------------------------
 539           FUNCTION: TurnOff_Card,关卡
 540           INPUT:
 541           OUTPUT:   CardStatus
 542          --------------------------------------------------------------------*/
 543          /**************************************************
 544          八、    关卡,关掉的M1卡片,这个命令不仅仅是关卡,还让读卡电路恢复到主动寻卡状态
 545          command:3C 04 01 68 00 00 51 0D
 546          **************************************************/
 547          
 548          void    TurnOff_Card(void)
 549          {       uchar i;
 550   1              uchar txbuff[8];
 551   1              uchar rxbuff[7];
C51 COMPILER V7.06   11T6_SC                                                               09/12/2007 12:40:46 PAGE 10  

 552   1      //t116:
 553   1          CardStatus=0;
 554   1              txbuff[0]=0x3C;
 555   1              txbuff[1]=0x04;
 556   1              txbuff[2]=0x01;
 557   1              txbuff[3]=0x68;
 558   1              txbuff[4]=0x00;
 559   1              txbuff[5]=0x00;
 560   1              txbuff[6]=0x51;
 561   1              txbuff[7]=0x0D;
 562   1      
 563   1          for(i=0;i<8;i++)
 564   1                      UART_PutByte(txbuff[i]);
 565   1      //;--------------------------------------------------------------------
 566   1      //; Right: 3C 02 00 00 3E 0D
 567   1      //; Error: 3C 01 FF (错误返回代码)BCC 0D
 568   1      //;--------------------------------------------------------------------
 569   1      //;;;;;;
 570   1              for(i=0;i<6;i++)
 571   1              {
 572   2                      rxbuff[i]=UART_GetByte();
 573   2                      if(rxbuff[0]!=0x3C)i=0;
 574   2                      if(rxbuff[i]==0x0D)break;
 575   2              }
 576   1          //if(rxbuff[0]!=0x3C)goto t116;
 577   1          //if(rxbuff[1]!=0x02)goto t116;
 578   1          //if(rxbuff[2]!=0x00)goto t116;
 579   1          //if(rxbuff[3]!=0x00)goto t116;
 580   1          //if(rxbuff[4]!=0x3e)goto t116;
 581   1         if(rxbuff[5]!=0x0d)goto t116;
 582   1      t116:        rxbuff[7]=0;
 583   1              for(i=0;i<4;i++)rxbuff[7]^=rxbuff[i];
 584   1              if(rxbuff[7]==rxbuff[4])CardStatus=0x01;
 585   1      
 586   1      }
 587          
 588          /*--------------------------------------------------------------------
 589           FUNCTION: SetRes,如果该step失败,将tmpResult中该步对应位调整为0,操作成功则不做改变
 590           INPUT:    CardStatus(step succed equal 0x01)
 591           OUTPUT:   tmpResult
 592          --------------------------------------------------------------------*/
 593          void SetRes(uchar RES,uchar NUM)
 594          {
 595   1              uchar temp1,temp2;
 596   1              if(RES==0)     //如果SETP操作失败(完成标记字节为零),调整tmpResult中对应该位为0态
 597   1               {
 598   2                 temp1=0xFF>>NUM;
 599   2                 temp2=0xFF<<9-NUM;
 600   2                 temp1=temp1|temp2;
 601   2                 tmpResult=temp1&tmpResult;
 602   2              }
 603   1      
 604   1      }
 605          /*--------------------------------------------------------------------
 606           FUNCTION: display() ;操作成功步对应位绿灯亮;操作失败步对应位红灯亮
 607           INPUT:    tmpResult
 608           OUTPUT:   P1 AND P3.5 OR P3.7
 609          --------------------------------------------------------------------*/
 610          void display(uchar DispData)
 611          {       P1=DispData;            //操作成功步对应位亮
 612   1              GREEN_LINE=0;   //绿灯亮
 613   1              delay10ms(20);
C51 COMPILER V7.06   11T6_SC                                                               09/12/2007 12:40:46 PAGE 11  

 614   1              GREEN_LINE=1;   //绿灯灭
 615   1              P1=~DispData&0xfc;      //操作失败步对应位亮
 616   1              RED_LINE=0;     //红灯亮
 617   1              delay10ms(30);
 618   1              RED_LINE=1;     //红灯灭
 619   1      }
 620          
 621          /*--------------------------------------------------------------------
 622           FUNCTION: led_cyc_on()
 623           INPUT:
 624           OUTPUT:
 625          --------------------------------------------------------------------*/
 626          //void led_cyc_on(void)
 627          //{
 628            //  uchar i,Ddata=0x80;
 629            //  P1=0x00;
 630          //      GREEN_LINE =1;
 631          //      RED_LINE=1;
 632          //      delay10ms(10);
 633          //      GREEN_LINE=0;
 634          //      for(i=0;i<8;i++)
 635          //      {
 636          //
 637          //          P1=_cror_(Ddata,i);
 638                  //      delay10ms(10);
 639          
 640          //      }
 641          /*      GREEN_LINE=1;
 642                  RED_LINE=0;
 643                  Ddata=0x01;
 644                  for(i=0;i<8;i++)
 645                  {
 646          
 647                      P1=_crol_(Ddata,i);
 648                          delay10ms(20);
 649          
 650                  }*/
 651          //      GREEN_LINE =1;
 652          //      RED_LINE=1;
 653          //}
 654          
 655          //**************************************************
 656          void wangdianshezhi(uchar *CardNo)
 657             {
 658   1           uchar CardBlockNo,i;
 659   1               //uchar data CardNo[4];
 660   1               uchar CardDataBuf[16];
 661   1               uchar data CardBlockKey[6];
 662   1           uchar BlockKeyAorB=0;//A套密码
 663   1               for(i=0;i<6;i++) CardBlockKey[i]=0xff;
 664   1               //for(i=0;i<4;i++) CardNo[i]=i+1;
 665   1      
 666   1            //读块4
 667   1      jixudukuai4:
 668   1       
 669   1                CardBlockNo=0x04;
 670   1                Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
 671   1                if (CardStatus)
 672   1                          {
 673   2                  CardBlockNo=0x04;
 674   2                      Read_Card(CardBlockNo,CardDataBuf);
 675   2                              //for (i=0;i<16;i++)
C51 COMPILER V7.06   11T6_SC                                                               09/12/2007 12:40:46 PAGE 12  

 676   2                             //sen(CardDataBuf[i]);
 677   2                             //sen(CardDataBuf[0]);
 678   2                             //sen(CardDataBuf[1]);
 679   2                  };
 680   1                        if (CardStatus) 
 681   1                              {
 682   2                                    writertc(wangdiangaodizhi,CardDataBuf[0]);
 683   2                                        writertc(wangdiandidizhi,CardDataBuf[1]);
 684   2                                       // sen(readrtc(wangdiangaodizhi));
 685   2                                       // sen(readrtc(wangdiandidizhi));
 686   2                              }
 687   1                   else
 688   1                                  goto jixudukuai4;
 689   1      
 690   1         }
 691          
 692          
 693          void wangdianpanduan(uchar *CardNo)
 694             {
 695   1           uchar   BlockNo,CardBlockNo,i,j,k;
 696   1               //uchar data CardNo[4];
 697   1               uchar CardDataBuf[16];
 698   1               uchar data CardBlockKey[6];
 699   1           uchar BlockKeyAorB=0;//A套密码
 700   1           bit douweiling;
 701   1               for(i=0;i<6;i++) CardBlockKey[i]=0xff;
 702   1               //for(i=0;i<4;i++) CardNo[i]=i+1;
 703   1           //读取第4块   
 704   1                CardBlockNo=0x04;
 705   1                Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
 706   1                    Read_Card(CardBlockNo,CardDataBuf);
 707   1                
 708   1               //如果是注册用户则读取第C块
 709   1                       if (CardDataBuf[0]==readrtc(wangdiangaodizhi) && CardDataBuf[1]==readrtc(wangdiandidizhi))  //如果是启

⌨️ 快捷键说明

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