找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2702|回复: 4
打印 上一主题 下一主题
收起左侧

单片机RFID高频RC632读卡程序,14443A,B.15693,都有

[复制链接]
跳转到指定楼层
楼主
ID:361650 发表于 2019-10-23 23:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是51单片机并行口rc632读卡程序

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <string.h>
  3. #include <intrins.h>
  4. #include "main.h"
  5. #include "slrc632.h"
  6. #include "iso14443a.h"
  7. #include "iso14443b.h"
  8. #include "iso15693.h"

  9. /*Declare SFR associated with the IAP */
  10. sfr  IAP_DATA     =   0xE2;      //Flash data register
  11. sfr  IAP_ADDRH    =   0xE3;            //Flash address HIGH
  12. sfr  IAP_ADDRL    =   0xE4;            //Flash address LOW
  13. sfr  IAP_CMD      =   0xE5;            //Flash command register
  14. sfr  IAP_TRIG     =   0xE6;            //Flash command trigger
  15. sfr  IAP_CONTR    =   0xE7;            //Flash control register

  16. //硬件版本号         
  17. unsigned char code hardmodel[12]  = {"SL601F-0512"};  

  18. bit g_bReceOk;                                              //正确接收到上位机指令标志
  19. bit g_bReceAA;                                              //接收到上位机发送的AA字节标志
  20. bit g_bRc632Ok;                                             //RC632复位正常标志
  21. bit g_bIblock;

  22. void outputconvery ();

  23. unsigned char Readcard_flag,start_flag=0,startnum=0;
  24. unsigned int  idata g_cReceNum;                            //接收到上位机的字节数
  25. unsigned int  data g_cCommand;                              //接收到的命令码
  26. unsigned char data g_cSNR[4];                               //M1卡序列号
  27. unsigned char g_cIcdevH;                                    //设备标记
  28. unsigned char g_cIcdevL;                                    //设备标记
  29. unsigned char g_cFWI;                                       //
  30. unsigned char idata  g_cCidNad,huankuaiflag=0;                                    //
  31. unsigned char idata g_cReceBuf[64];                         //和上位机通讯时的缓冲区
  32. unsigned char idata canshu[5]={0x00,0x00,0x00,0x10,0x01};//0:扇区,1:块,2-3:卡号首尾位置,4:读卡方式
  33. unsigned char idata key[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//密码
  34. unsigned char idata canshuflag=0,timenum=0,UID[4];
  35. struct TranSciveBuffer{unsigned char MfCommand;
  36.                        unsigned int  MfLength;
  37.                        unsigned char MfData[64];
  38.                       };

  39. /***************************定时器0初始化********************************/
  40. void timer0init (void)//22.1184MHZ,20ms
  41. {       
  42.         TH0=0x70;
  43.         TL0=0x00;
  44.         ET0=1;
  45.         TR0=1;
  46.         TMOD=0x21;
  47. }

  48. /*****************************定时器0中断函数********************************/
  49. void timer0(void) interrupt 1
  50. {
  51.         TH0=0x70;
  52.         TL0=0x00;
  53.         timenum++;
  54.         if(timenum==100)  canshuflag=1,timenum=0;
  55. }
  56.        
  57. void gonggongdaima(void)
  58. {
  59.         IAP_TRIG = 0x46;//发送46h到触发寄存器
  60.         IAP_TRIG = 0xB9;//发送B9h到触发寄存器
  61.         _nop_();//延时
  62.         IAP_CONTR = 0;//关闭IAP功能
  63.         IAP_CMD = 0;//清空命令寄存器
  64.         IAP_TRIG = 0;//清空命令触发寄存器
  65.         IAP_ADDRH = 0;//清空地址高位
  66.         IAP_ADDRL = 0;//清空地址低位
  67. }
  68. /**************************字节读函数***************************************/
  69. unsigned char Byte_Read(unsigned int add)
  70. {
  71.         IAP_DATA = 0x00;//清空数据
  72.         IAP_CONTR = 0x81;//打开IAP,设置操作等待时间
  73.         IAP_CMD = 0x01;//字节读命令
  74.         IAP_ADDRH = add>>8;//设置高8位地址
  75.         IAP_ADDRL = add&0x00ff;//设置低8位地址
  76.         gonggongdaima();
  77.         return (IAP_DATA);//返回读到的数据
  78. }

  79. /*****************************字节编程函数*****************************/
  80. void Byte_Program(unsigned int add, unsigned char dat)
  81. {
  82.         IAP_CONTR = 0x81;//打开IAP,设置操作等待时间
  83.         IAP_CMD = 0x02;//字节编程命令
  84.         IAP_ADDRH = add>>8;//设置高8位地址
  85.         IAP_ADDRL = add&0x00ff;//设置低8位地址
  86.         IAP_DATA = dat;//要编程的数据先送进IAP_DATA寄存器
  87.         gonggongdaima();
  88. }

  89. /*****************************扇区擦除函数****************************/
  90. void Sector_Erase(unsigned int add)
  91. {
  92.         IAP_CONTR = 0x81;//打开IAP,设置操作等待时间
  93.         IAP_CMD = 0x03;//扇区擦除命令
  94.         IAP_ADDRH = add>>8;//设置高8位地址
  95.         IAP_ADDRL = add&0x00ff;//设置低8位地?
  96.         gonggongdaima();
  97. }


  98. /****************************读取参数函数************************/
  99. void Read_canshu(void)
  100. {
  101.         canshu[0]=Byte_Read(0x8000);
  102.         canshu[1]=Byte_Read(0x8001);
  103.         canshu[2]=Byte_Read(0x8002);
  104.         canshu[3]=Byte_Read(0x8003);
  105.         canshu[4]=Byte_Read(0x8004);
  106. }       
  107. void Read_Akey(void)
  108. {
  109.         key[0]=Byte_Read(0x8200);
  110.         key[1]=Byte_Read(0x8201);
  111.         key[2]=Byte_Read(0x8202);
  112.         key[3]=Byte_Read(0x8203);
  113.         key[4]=Byte_Read(0x8204);
  114.         key[5]=Byte_Read(0x8205);
  115. }       
  116. void Read_Bkey(void)
  117. {
  118.         key[0]=Byte_Read(0x8400);
  119.         key[1]=Byte_Read(0x8401);
  120.         key[2]=Byte_Read(0x8402);
  121.         key[3]=Byte_Read(0x8403);
  122.         key[4]=Byte_Read(0x8404);
  123.         key[5]=Byte_Read(0x8405);
  124. }

  125. /****************************保存参数函数****************************/
  126. void Save_canshu(void)
  127. {
  128.         Sector_Erase(0x8000);//擦除扇区
  129.         Byte_Program(0x8000,canshu[0]);
  130.         Byte_Program(0x8001,canshu[1]);
  131.         Byte_Program(0x8002,canshu[2]);
  132.         Byte_Program(0x8003,canshu[3]);
  133.         Byte_Program(0x8004,canshu[4]);
  134. }
  135. void Save_Akey(void)
  136. {
  137.         Sector_Erase(0x8200);//擦除扇区
  138.         Byte_Program(0x8200,key[0]);
  139.         Byte_Program(0x8201,key[1]);
  140.         Byte_Program(0x8202,key[2]);
  141.         Byte_Program(0x8203,key[3]);
  142.         Byte_Program(0x8204,key[4]);
  143.         Byte_Program(0x8205,key[5]);
  144. }
  145. void Save_Bkey(void)
  146. {       
  147.         Sector_Erase(0x8400);//擦除扇区
  148.         Byte_Program(0x8400,key[0]);
  149.         Byte_Program(0x8401,key[1]);
  150.         Byte_Program(0x8402,key[2]);
  151.         Byte_Program(0x8403,key[3]);
  152.         Byte_Program(0x8404,key[4]);
  153.         Byte_Program(0x8405,key[5]);
  154. }                                                                                    

  155. void delay(unsigned int i)
  156. {
  157.    unsigned char j;
  158.    while(i--) for(j=0;j<200;j++);
  159. }

  160. void BEEP(unsigned char i)
  161. {
  162.   unsigned char k;
  163.         k=100;
  164.   sond =  0;
  165.         redled = 1;
  166.         blueled =  0;
  167.         delay(k);
  168.         sond =1;
  169.         blueled = 1;
  170.         redled = 0;   
  171. }

  172. void REDON(void)
  173. {
  174.     redled =  1;
  175. }

  176. void REDOFF(void)
  177. {
  178.     redled =  0;
  179. }
  180. void BLUEON(void)
  181. {
  182.     blueled =  1;
  183. }

  184. void BLUEOFF(void)
  185. {
  186.     blueled =  0;
  187. }


  188.                                           
  189. void main( )
  190. {      
  191.                 InitializeSystem( );
  192.                 Rc632Ready( );
  193.                 PcdConfigISOType( '1' );
  194.                 BEEP(2);                 
  195.                 DelayMs(1000);
  196.                 RC632_CE=0;
  197.                 ComSetBound();//波特率
  198.                 RC632_CE=1;
  199.                 EA=1;

  200.                 g_cReceBuf[6]=0;
  201.                 RC632_CE=0;
  202.                 ComPcdAntenna();//天线
  203.                 RC632_CE=1;
  204.                 EA=1;

  205.     RC632_CE=0;
  206.                 ComM632PcdConfigISOType();//ISO14443A/B或ISO15693
  207.                 RC632_CE=1;
  208.                 EA=1;

  209.                 Readcard_flag=0;
  210.                
  211.                 timer0init ();

  212.      while ( 1 )
  213.      {                                    
  214.                                  if(canshuflag==1) Read_canshu(),Read_Akey(),BEEP(3),canshuflag=0,TR0=0;//读取参数
  215.                                  if(Readcard_flag==0)
  216.                                  {
  217.                                          g_cReceBuf[6]=0;
  218.                                          RC632_CE=0;
  219.                                          ComPcdAntenna();
  220.                                          RC632_CE=1;
  221.                                          EA=1;
  222.                                  }
  223.                                  
  224.                                  if(Readcard_flag==2)
  225.                                  {
  226.                                  RC632_CE=0;
  227.                      ComM632PcdConfigISOType();
  228.                                  RC632_CE=1;
  229.          EA=1;
  230.                                  }
  231.                                  
  232.          if(Readcard_flag==3)
  233.                                  {       
  234.                                  g_cReceBuf[6]=1;
  235.                      RC632_CE=0;
  236.                      ComPcdAntenna();
  237.          RC632_CE=1;
  238.          EA=1;       
  239.                                
  240.                                  }                                         
  241.          
  242.                                  if(Readcard_flag==4)
  243.                                  {
  244.                                
  245.                                  RC632_CE=0;
  246.                                  ComISO15693_Inventory16();
  247.                
  248.                                          RC632_CE=1;
  249.          EA=1;
  250.             
  251.                                  }
  252.                                  
  253.                                
  254.                        
  255.                                
  256. //                              
  257. //                                  if(Readcard_flag==5)
  258. //                                  {
  259. //                                
  260. //                                    RC632_CE=0;
  261. //                        
  262. //                                   ComISO15693_Select();
  263. //                                          RC632_CE=1;
  264. //            EA=1;
  265. //             
  266. //                                  }
  267.                                  
  268.   
  269.                                  
  270.                                   if(Readcard_flag==5)
  271.                                  {
  272.                           
  273.                                          RC632_CE=0;
  274.                                          ComISO15693_Read_sm();
  275.                                          RC632_CE=1;
  276.                                          EA=1;
  277.                                  }
  278.                                  
  279.                                
  280.                                  
  281.                                  
  282.                                
  283.                                  
  284.                                                                                                    
  285.                                  g_bReceOk=0;
  286.          if (g_bReceOk)
  287.          {  
  288.                                          g_bReceOk = 0;  
  289.                                          RC632_CE=0;   
  290.                                          switch(g_cCommand)
  291.                                          {
  292.                                
  293.                                                                                         case 0x0101:
  294.                         ComSetBound();               break;
  295.                      case 0x0104:
  296.                         ComGetHardModel();           break;
  297.                      case 0x0108:
  298.                         ComM632PcdConfigISOType();   break;  
  299.                      case 0x010C:
  300.                         ComPcdAntenna();             break;
  301.                                  
  302.                      case 0x0201:
  303.                         ComRequestA();               break;  
  304.                      case 0x0202:
  305.                         ComAnticoll();               break;        
  306.                      case 0x0203:
  307.                         ComSelect();                 break;
  308.                      case 0x0204:
  309.                         ComHlta();                   break;
  310.                      case 0x0207:
  311.                         ComAuthentication();         break;
  312.                      case 0x0208:
  313.                         ComM1Read();                 break;
  314.                      case 0x0209:
  315.                         ComM1Write();                break;
  316.                      case 0x020A:
  317.                         ComM1Initval();              break;
  318.                      case 0x020B:
  319.                         ComM1Readval();              break;
  320.                      case 0x020C:
  321.                         ComM1Decrement();            break;
  322.                      case 0x020D:
  323.                         ComM1Increment();            break;  
  324.                      case 0x020E:
  325.                         ComM1Restore();              break;
  326.                      case 0x020F:
  327.                         ComM1Transfer();             break;
  328.                      case 0x0210:
  329.                         ComTypeARst();               break;
  330.                      case 0x0211:
  331.                         ComTypeACOS();               break;
  332.                                         case 0x0212:
  333.                         ComUL_PcdAnticoll();         break;
  334.                                         case 0x0213:
  335.                         ComUL_PcdWrite();            break;
  336.                      case 0x0301:
  337.                         ComTypeBRst();               break;  
  338.                   // case 0x1E:
  339.                   //      ComAttrib();    break;
  340.                      case 0x0302:
  341.                         ComHltb();                   break;
  342.                      case 0x0303:
  343.                         ComCL_Deselect();            break;   

  344.                      case 0x0401:
  345.                         ComRF020Check();             break;
  346.                      case 0x0402:
  347.                         ComRF020Read();              break;
  348.                      case 0x0403:
  349.                         ComRF020Write();             break;
  350.                      case 0x0404:
  351.                         ComRF020Lock();              break;
  352.                      case 0x0405:       
  353.                         ComRF020Count();             break;
  354.                      case 0x0406:       
  355.                         ComRF020Deselect();          break;

  356.                      case 0x0501:
  357.                         ComSelectSR();               break;
  358.                      case 0x0502:
  359.                         ComCompletionSR();           break;
  360.                      case 0x0503:
  361.                         ComReadSR176();              break;  
  362.                      case 0x0504:
  363.                         ComWriteSR176();             break;   
  364.                      case 0x0505:
  365.                         ComProtectSR176();           break;  
  366.                      case 0x0506:
  367.                         ComReadSR4K();               break;  
  368.                      case 0x0507:
  369.                         ComWriteSR4K();              break;      
  370.                      case 0x0508:
  371.                         ComAuthSR4K();               break;  
  372.                      case 0x0509:
  373.                         ComGetUIDSR4K();             break;
  374.                      case 0x050A:
  375.                         ComProtectSR4K();            break;

  376.                      case 0x1000:
  377.                         ComISO15693_Inventory16();   break;
  378.                      case 0x1001:
  379.                         ComISO15693_Inventory();     break;
  380.                      case 0x1002:
  381.                         ComISO15693_Stay_Quiet();    break;
  382.                      case 0x1003:
  383.                         ComISO15693_Select();        break;
  384.                      case 0x1004:
  385.                         ComISO15693_Reset_To_Ready();break;
  386.                      case 0x1005:
  387.                         ComISO15693_Read_sm();       break;
  388.                      case 0x1006:
  389.                         ComISO15693_Write_sm();      break;
  390.                      case 0x1007:
  391.                         ComISO15693_Lock_Block();    break;
  392.                      case 0x1008:
  393.                         ComISO15693_Write_AFI();     break;
  394.                      case 0x1009:
  395.                         ComISO15693_Lock_AFI();      break;
  396.                      case 0x100A:
  397.                         ComISO15693_Write_DSFID();   break;
  398.                      case 0x100B:
  399.                         ComISO15693_Lock_DSFID();    break;
  400.                      case 0x100C:
  401.                         ComISO15693_Get_System_Information();     break;
  402.                      case 0x100D:
  403.                         ComISO15693_Get_Multiple_Block_Security();break;  

  404.                      default:
  405.                         AnswerErr( FAULT11 );         break;
  406.                  }
  407.                                                         REDOFF();
  408.                                                         BLUEON();
  409.                                                   sond =  1;
  410.                                                         sond_1 =  1;
  411.                                                         REDON();
  412.                                                         BLUEOFF();
  413.                                                         RC632_CE=1;
  414.                                                         ES = 1;
  415.                                                         EA=1;
  416.           }
  417.      }
  418. }



  419. /////////////////////////////////////////////////////////////////////
  420. //系统初始化
  421. /////////////////////////////////////////////////////////////////////

  422. void InitializeSystem()
  423. {
  424.     TMOD &= 0x0F;
  425.     TMOD |= 0x21;
  426.     PCON |= 0x80;
  427.     SCON  = 0x50;
  428.     TH1 = TL1 = BOUND19200;
  429.     TR1=1;
  430.     P0 = P1 = P2 = P3 = 0xFF;
  431.     IE |= 0x90;
  432. }


  433. /////////////////////////////////////////////////////////////////////
  434. //初始化RC632
  435. /////////////////////////////////////////////////////////////////////
  436. void Rc632Ready()
  437. {
  438.     char status;
  439.     delay(100);
  440.     status = PcdReset();
  441.     if(status != MI_OK)
  442.     {
  443.         delay(10);
  444.         status = PcdReset();
  445.     }
  446.     if(status != MI_OK)
  447.     {
  448.         delay(10);
  449.         status = PcdReset();
  450.     }
  451.     if(status == MI_OK)
  452.     {
  453.         g_bRc632Ok = 1;
  454.     }      
  455. }
  456.        
  457. /////////////////////////////////////////////////////////////////////
  458. //响应上位机发送的设置波特率命令
  459. /////////////////////////////////////////////////////////////////////
  460. void ComSetBound()
  461. {
  462.     unsigned char bound =1;
  463.     if (bound > 7)
  464.     {  Readcard_flag=1;    }
  465.     else
  466.     {
  467.             Readcard_flag=1;
  468.             TR1 = 0;
  469.          
  470.             switch(bound)
  471.         {
  472.                  case 0:
  473.                       TH1=TL1=BOUND4800;
  474.                       break;
  475.                  case 1:
  476.                       TH1=TL1=BOUND9600;
  477.                       break;
  478.                  case 2:
  479.                       TH1=TL1=BOUND14400;
  480.                       break;
  481.                  case 3:
  482.                       TH1=TL1=BOUND19200;
  483.                       break;
  484.                  case 4:
  485.                       TH1=TL1=BOUND28800;
  486.                       break;
  487.                  case 5:
  488.                       TH1=TL1=BOUND38400;
  489.                       break;
  490.                  case 6:
  491.                       TH1=TL1=BOUND57600;
  492.                       break;
  493.                  case 7:
  494.                       TH1=TL1=BOUND115200;
  495.                       break;
  496.                  default:
  497.                       break;
  498.         }
  499.             TR1 = 1;
  500.      }          
  501. }


  502. /////////////////////////////////////////////////////////////////////
  503. //响应上位机发送的读取硬件版本号命令
  504. /////////////////////////////////////////////////////////////////////
  505. void ComGetHardModel()
  506. {
  507.     memcpy(&g_cReceBuf[0], &hardmodel[0], sizeof(hardmodel));
  508.     AnswerOk(&g_cReceBuf[0], sizeof(hardmodel));
  509. }   

  510.    
  511. /////////////////////////////////////////////////////////////////////
  512. //响应上位机发送的设置RC632协议命令,ISO14443A/B或ISO15693
  513. /////////////////////////////////////////////////////////////////////
  514. void ComM632PcdConfigISOType()
  515. {
  516.      if (MI_OK == PcdConfigISOType(49))
  517.      {   Readcard_flag=3;    }
  518.      else
  519.      {    Readcard_flag=0;    }  
  520. }
  521.    
  522. /////////////////////////////////////////////////////////////////////
  523. //响应上位机发送的天线命令
  524. /////////////////////////////////////////////////////////////////////
  525. void ComPcdAntenna()
  526. {
  527.     char status;
  528.              
  529.     if (!g_cReceBuf[6])
  530.     {   
  531.         status = PcdAntennaOff();  
  532.                           if (status == MI_OK)
  533.     {   
  534.                          Readcard_flag=2;   
  535.     }
  536.     else
  537.     {   
  538.                         Readcard_flag=3;
  539.     }
  540.     }
  541.     else
  542.     {  
  543.         DelayMs(5);
  544.         status = PcdAntennaOn();
  545.         DelayMs(5);
  546.                         if (status == MI_OK)
  547.     {   
  548.                          Readcard_flag=4;   
  549.     }
  550.     else
  551.     {   
  552.                         Readcard_flag=3;
  553.     }
  554.     }
  555.    
  556. }   
  557.   

  558. /////////////////////////////////////////////////////////////////////
  559. //响应上位机发送的寻卡命令
  560. /////////////////////////////////////////////////////////////////////
  561. /*void ComRequestA()
  562. {
  563.   unsigned char atq[2];
  564.         char status;

  565.         status = ISO15693_Inventory(0x7b,0x30,0x10);
  566.         if (status != MI_OK)
  567.         {    status = ISO15693_Inventory(0x7b,0x30,0x10);   }
  568.       if (status == MI_OK)
  569.     {   
  570.        if(start_flag==0)Readcard_flag=5;
  571.                         else
  572.                         {
  573.                                 startnum=0;
  574.                                 Readcard_flag=0;
  575.                         }
  576.      }
  577.     else
  578.     {
  579.                           Readcard_flag=0;
  580.                           if(start_flag==1)
  581.                         {
  582.                                 startnum++;
  583.                                 if(startnum>=5)
  584.                                 {
  585.                                         start_flag=0;
  586.                                         startnum=0;
  587.                                 }
  588.                         }
  589.                        
  590.    }           
  591. }
  592. /////////////////////////////////////////////////////////////////////
  593. //响应上位机发送的A卡防冲撞命令
  594. /////////////////////////////////////////////////////////////////////
  595. void ComAnticoll()
  596. {
  597.     if (MI_OK == ISO15693_Stay_Quiet(0x7b))
  598.     {
  599.                         Readcard_flag=6;
  600.   }
  601.     else
  602.     {   
  603.                         Readcard_flag=0;
  604.     }           
  605. }

  606. /////////////////////////////////////////////////////////////////////
  607. //响应上位机发送的A卡锁定命令
  608. /////////////////////////////////////////////////////////////////////
  609. void ComSelect()
  610. {
  611.     if (MI_OK == ISO15693_Select(0x7b))
  612.     {   
  613.          Readcard_flag=7;
  614.       }
  615.     else
  616.     {   
  617.       Readcard_flag=0;
  618.     }           
  619. }*/
  620. /////////////////////////////////////////////////////////////////////
  621. //响应上位机发送的A卡休眠命令
  622. /////////////////////////////////////////////////////////////////////
  623. void ComHlta()
  624. {
  625.     if (MI_OK == PcdHalt())
  626.     {    Readcard_flag=9;    }
  627.     else
  628.     {    Readcard_flag=0;   }           
  629. }

  630. /////////////////////////////////////////////////////////////////////
  631. //响应上位机发送的A卡验证密钥命令
  632. /////////////////////////////////////////////////////////////////////
  633. void ComAuthentication()
  634. {       
  635.     char status = MI_COM_ERR;
  636.     unsigned char *pkeys,*pSNR;
  637.     pkeys = &g_cReceBuf[20];
  638.     pSNR  = &g_cSNR;
  639.     if (MI_OK == ChangeCodeKey(&g_cReceBuf[8],pkeys))                       //转换密钥格式
  640.     {   
  641.             if (MI_OK == PcdAuthKey(pkeys))                                     //传送密钥到RC500FIFO
  642.         {
  643.              status = PcdAuthState(0x60, canshu[0]*4+3, pSNR);     //验证密钥0x08表示2扇区1块
  644.         }
  645.     }
  646.     if (status == MI_OK)
  647.     {   
  648.       Readcard_flag=8;
  649.     }
  650.     else
  651.     {   
  652.       Readcard_flag=4;
  653.     }
  654. }  
  655. /////////////////////////////////////////////////////////////////////
  656. //响应上位机读M1卡命令
  657. /////////////////////////////////////////////////////////////////////
  658. void ComM1Read()
  659. {
  660.     if (PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
  661.     {         
  662.                         sond =  0;
  663.             redled = 1;
  664.             blueled =  0;
  665.                         AnswerOk(&g_cReceBuf[0], 16);
  666.       Readcard_flag=4;
  667.                         if(TR0==0)start_flag=1;
  668.                         DelayMs(200);
  669.                         sond =  1;
  670.             redled = 0;
  671.             blueled =  1;
  672.     }
  673.     else
  674.     {   
  675.                         Readcard_flag=4;
  676.     }
  677. }

  678. /////////////////////////////////////////////////////////////////////
  679. //响应上位机写M1卡命令
  680. /////////////////////////////////////////////////////////////////////
  681. void ComM1Write()
  682. {
  683.     if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
  684.     {    AnswerCommandOk();    }
  685.     else
  686.     {    AnswerErr(FAULT24);   }
  687. }

  688. /////////////////////////////////////////////////////////////////////
  689. //响应上位机初始化钱包命令
  690. /////////////////////////////////////////////////////////////////////
  691. void ComM1Initval()
  692. {
  693.     g_cReceBuf[11]=~g_cReceBuf[7];g_cReceBuf[12]=~g_cReceBuf[8];
  694.     g_cReceBuf[13]=~g_cReceBuf[9];g_cReceBuf[14]=~g_cReceBuf[10];
  695.     g_cReceBuf[15]=g_cReceBuf[7];g_cReceBuf[16]=g_cReceBuf[8];
  696.     g_cReceBuf[17]=g_cReceBuf[9];g_cReceBuf[18]=g_cReceBuf[10];
  697.     g_cReceBuf[19]=g_cReceBuf[6];g_cReceBuf[20]=~g_cReceBuf[6];
  698.     g_cReceBuf[21]=g_cReceBuf[6];g_cReceBuf[22]=~g_cReceBuf[6];
  699.     if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
  700.     {    AnswerCommandOk();    }
  701.     else
  702.     {    AnswerErr(FAULT24);   }
  703. }

  704. /////////////////////////////////////////////////////////////////////
  705. //响应上位机读钱包命令
  706. /////////////////////////////////////////////////////////////////////
  707. void ComM1Readval()
  708. {
  709.     if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
  710.     {         AnswerOk(&g_cReceBuf[0], 4);   }
  711.     else
  712.     {    AnswerErr(FAULT23);         }
  713. }

  714. /////////////////////////////////////////////////////////////////////
  715. //响应上位机扣款命令
  716. /////////////////////////////////////////////////////////////////////
  717. void ComM1Decrement()
  718. {
  719.     if (MI_OK == PcdValue(PICC_DECREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
  720.     {    AnswerCommandOk();    }
  721.     else
  722.     {    AnswerErr(FAULT24);   }
  723. }
  724.    
  725. /////////////////////////////////////////////////////////////////////
  726. //响应上位机充值命令
  727. /////////////////////////////////////////////////////////////////////
  728. void ComM1Increment()
  729. {
  730.     if (MI_OK == PcdValue(PICC_INCREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
  731.     {    AnswerCommandOk();    }
  732.     else
  733.     {    AnswerErr(FAULT24);   }
  734. }

  735. /////////////////////////////////////////////////////////////////////
  736. //响应上位机M1卡回传命令
  737. /////////////////////////////////////////////////////////////////////
  738. void ComM1Restore()
  739. {
  740.     if (MI_OK == PcdRestore(g_cReceBuf[6]))
  741.     {    AnswerCommandOk();    }
  742.     else
  743.     {    AnswerErr(FAULT23);   }
  744. }

  745. /////////////////////////////////////////////////////////////////////
  746. //响应上位机M1卡值传送命令
  747. /////////////////////////////////////////////////////////////////////
  748. void ComM1Transfer()
  749. {
  750.     if (MI_OK == PcdTransfer(g_cReceBuf[6]))
  751.     {    AnswerCommandOk();    }
  752.     else
  753.     {    AnswerErr(FAULT24);   }
  754. }

  755. /////////////////////////////////////////////////////////////////////
  756. //响应上位机ultra light防冲撞命令
  757. /////////////////////////////////////////////////////////////////////
  758. void ComUL_PcdAnticoll()
  759. {
  760.     if (MI_OK == UL_PcdAnticoll(&g_cReceBuf[0]))
  761.     {   AnswerOk(&g_cReceBuf[0], 7);  }
  762.     else
  763.     {   AnswerErr(FAULT10);    }   
  764. }

  765. /////////////////////////////////////////////////////////////////////
  766. //响应上位机ultra light写卡命令
  767. /////////////////////////////////////////////////////////////////////
  768. void ComUL_PcdWrite()
  769. {
  770.     if (MI_OK == UL_PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
  771.     {   AnswerCommandOk();   }
  772.     else
  773.     {   AnswerErr(FAULT24);  }   
  774. }



  775. /////////////////////////////////////////////////////////////////////
  776. //响应上位机TYPEA卡高级复位命令
  777. /////////////////////////////////////////////////////////////////////
  778. void ComTypeARst()
  779. {
  780.     unsigned char status,i;
  781.     i = (FSDI << 4) & 0xF0;
  782.     status = PcdRequest(g_cReceBuf[6], &g_cReceBuf[0]);
  783.    
  784.     if (status != MI_OK)
  785.     {   status = PcdRequest(g_cReceBuf[6], &g_cReceBuf[0]);   }

  786.     if (status == MI_OK)
  787.     {   status =  PcdAnticoll(&g_cReceBuf[1]);   }
  788.    
  789.     if (status == MI_OK)
  790.     {   status =  PcdSelect(&g_cReceBuf[1], &g_cReceBuf[6]);   }   

  791.     if (status == MI_OK)
  792.     {       
  793.         g_cFWI         = 0xff;//g_cReceBuf[8]>>4;
  794.         g_cReceBuf[0] += 4;
  795.         g_cCidNad      = 0;//(g_cReceBuf[9] & 0x03) << 2;
  796.         AnswerOk(&g_cReceBuf[1], g_cReceBuf[0]);
  797.     }
  798.     else
  799.     {   AnswerErr(FAULT21);    }
  800. }   

  801. void ComTypeACOS()
  802. {
  803.     g_cReceBuf[0] -= 5;
  804.     if (MI_OK == MifareProCom(g_cCidNad, g_cFWI, &g_cReceBuf[0], &g_cReceBuf[6]))
  805.     {        AnswerOk(&g_cReceBuf[6], g_cReceBuf[0]);   }
  806.     else
  807.     {   AnswerErr(FAULT10);    }
  808. }

  809. /////////////////////////////////////////////////////////////////////
  810. //响应上位机高级复位TYPEB卡命令
  811. /////////////////////////////////////////////////////////////////////
  812. /*
  813. void ComTypeBRst()
  814. {
  815.     unsigned char status;
  816.        
  817.     if ((status = M531PiccRequestB(g_cReceBuf[6], 0, 0, &g_cReceBuf[0])) == MI_OK)
  818.     {       
  819.             g_cFWI    = 0xFF;//g_cReceBuf[11] >> 4;
  820.             g_cCidNad = 8;//((g_cReceBuf[11]&0x02)<<1) | ((g_cReceBuf[11]&0x01)<<3);
  821. //       status = M531PiccAttrib(&g_cReceBuf[1], g_cReceBuf[10]&0x0F, &g_cReceBuf[12]);   
  822.   //  }

  823. //   if (status == MI_OK)                {
  824.        AnswerOk(&g_cReceBuf[0], 12);   }
  825.     else
  826.     {   AnswerErr(FAULT21);    }
  827. }
  828. */

  829. void ComTypeBRst()
  830. {
  831.     unsigned char status;
  832.        
  833.     if ((status = M531PiccRequestB(g_cReceBuf[6], 0, 0, &g_cReceBuf[0])) == MI_OK)                                                          
  834. ……………………

  835. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
键盘口程序-15693.rar (334.37 KB, 下载次数: 39)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2019-10-23 23:31 | 只看该作者
真的很感谢这样一个学习的平台,很多曾经自己没玩过的东西,看了大家无偿提供的资料,很新鲜,也很想去试一试
回复

使用道具 举报

板凳
ID:381698 发表于 2020-8-7 21:00 | 只看该作者
请问当单片机的频率由11.0592MHz改为22.1184MHz后,不能读卡,请问程序哪里需要修改?
回复

使用道具 举报

地板
ID:591382 发表于 2020-8-8 10:55 | 只看该作者
初学者仰慕大神已久
回复

使用道具 举报

5#
ID:808937 发表于 2020-8-20 08:28 | 只看该作者
liu86708670 发表于 2020-8-7 21:00
请问当单片机的频率由11.0592MHz改为22.1184MHz后,不能读卡,请问程序哪里需要修改?

通讯波特率不对吧,有个头文件是定义晶振的,修改一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表