找回密码
 立即注册

QQ登录

只需一步,快速开始

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

mfrc522与MSP430开发板及51单片机连接(含上位机测试软件)

[复制链接]
跳转到指定楼层
楼主
mfrc522与MSP430F149开发板及51单片机连接(含上位机测试软件)


51读写卡参考例程及上位机调试软件:



51单片机源程序如下:
  1. #include "reg52.h"
  2. #include "main.h"
  3. #include "mfrc522.h"       
  4. #include <string.h>
  5. //M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
  6. //4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
  7. unsigned char code data2[4]  = {0x12,0,0,0};
  8. unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  9. unsigned char g_ucTempbuf[20];   
  10. unsigned char idata MLastSelectedSnr[4];
  11. unsigned char idata RevBuffer[30];  
  12. unsigned char data SerBuffer[20];
  13. bit CmdValid;                           

  14. void iccardcode()
  15. {             
  16.           unsigned char cmd;
  17.         unsigned char status;
  18.        
  19.         cmd = RevBuffer[0];
  20.         switch(cmd)
  21.         {
  22.                 case 1:     // Halt the card     //终止卡的操作
  23.                         status= PcdHalt();;                       
  24.                         RevBuffer[0]=1;
  25.                         RevBuffer[1]=status;
  26.                         break;                       
  27.                 case 2:     // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
  28.                                 // 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)
  29.                         status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
  30.                         if(status!=0)
  31.                         {
  32.                                 status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
  33.                                 if(status!=0)                               
  34.                                 {
  35.                                         RevBuffer[0]=1;       
  36.                                         RevBuffer[1]=status;
  37.                                         break;
  38.                                 }
  39.                         }  
  40.                         RevBuffer[0]=3;       
  41.                         RevBuffer[1]=status;
  42.                         break;
  43.                        
  44.                 case 3:                         // 防冲突 读卡的系列号 MLastSelectedSnr
  45.                         status = PcdAnticoll(&RevBuffer[2]);
  46.                         if(status!=0)
  47.                         {
  48.                                 RevBuffer[0]=1;       
  49.                                 RevBuffer[1]=status;
  50.                                 break;
  51.                         }
  52.                         memcpy(MLastSelectedSnr,&RevBuffer[2],4);
  53.                         RevBuffer[0]=5;
  54.                         RevBuffer[1]=status;
  55.                         break;       
  56.                 case 4:                                    // 选择卡 Select Card
  57.                         status=PcdSelect(MLastSelectedSnr);
  58.                         if(status!=MI_OK)
  59.                         {
  60.                                 RevBuffer[0]=1;       
  61.                                 RevBuffer[1]=status;
  62.                                 break;
  63.                         }
  64.                         RevBuffer[0]=3;
  65.                         RevBuffer[1]=status;                       
  66.                         break;
  67.                 case 5:            // Key loading into the MF RC500's EEPROM
  68.             status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校验卡密码
  69.                         RevBuffer[0]=1;
  70.                         RevBuffer[1]=status;                       
  71.                         break;                                                       
  72.                 case 6:
  73.                         RevBuffer[0]=1;
  74.                         RevBuffer[1]=status;                       
  75.                         break;                               
  76.                 case 7:     
  77.                     RevBuffer[0]=1;
  78.                         RevBuffer[1]=status;                       
  79.                         break;
  80.                 case 8:     // Read the mifare card
  81.                             // 读卡
  82.                         status=PcdRead(RevBuffer[1],&RevBuffer[2]);
  83.                         if(status==0)
  84.                         {RevBuffer[0]=17;}
  85.                         else
  86.                         {RevBuffer[0]=1;}
  87.                         RevBuffer[1]=status;                       
  88.                         break;
  89.                 case 9:     // Write the mifare card
  90.                             // 写卡  下载密码
  91.                         status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
  92.                         RevBuffer[0]=1;
  93.                         RevBuffer[1]=status;                       
  94.                         break;
  95.                 case 10:
  96.             PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
  97.                         RevBuffer[0]=1;       
  98.                         RevBuffer[1]=status;
  99.                         break;
  100.                 case 12:    // 参数设置
  101.                     PcdBakValue(RevBuffer[1], RevBuffer[2]);
  102.                         RevBuffer[0]=1;        //contact
  103.                         RevBuffer[1]=0;
  104.                         break;               
  105.         }






  106.         }
  107. /////////////////////////////////////////////////////////////////////
  108. //系统初始化
  109. /////////////////////////////////////////////////////////////////////
  110. void InitializeSystem()
  111. {
  112.     P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;



  113.         ET2 = 0;        
  114.         T2CON = 0x04;               
  115.     PCON = 0x80;               
  116.     SCON = 0x70;                 
  117.     TMOD = 0x21;        //TMOD = 0x22;

  118.         TH1   = BAUD_9600;
  119.         TL1   = TH1;
  120.         TR1   = 1;             // 波特率发生器

  121.         TH0 = 0x60;
  122.     TL0 = 0x60;
  123.     TR0 = 0;
  124.    
  125.     ET0=0;
  126.         ET1=0;
  127.         EA=1;
  128.         EX0=1;
  129.         IT0 = 1;       
  130.         TR2=0;
  131.         ES = 1;   
  132.         CmdValid=0;

  133.      LED_GREEN = 1;
  134.      PcdReset();
  135.      PcdAntennaOff();
  136.      PcdAntennaOn();  
  137.          M500PcdConfigISOType( 'A' );
  138.      LED_GREEN = 0;
  139.          delay_10ms(10);       
  140.      LED_GREEN = 1;
  141.          delay_10ms(10);
  142.      LED_GREEN = 0;
  143. }

  144. /////////////////////////////////////////////////////////////////////
  145. //用T2做延时子程序
  146. /////////////////////////////////////////////////////////////////////


  147. ///////////////////////////////////////////////////////////////////////
  148. // 接收和发送中断
  149. ///////////////////////////////////////////////////////////////////////
  150. void isr_UART(void) interrupt 4 using 1
  151. {
  152.     unsigned char len, i;
  153.           unsigned int j=0;
  154.          
  155.           if(RI)
  156.         {               
  157.                 len=SBUF;
  158.                 RI=0;       
  159.                 for(i=0;i<len;i++)
  160.                 {
  161.                         while(!RI)
  162.                         {
  163.                                 j++;
  164.                                 if(j>1000)
  165.                                 {
  166.                                     break;
  167.                                 }
  168.                         }
  169.                         if(j<1000)
  170.                         {
  171.                                 RevBuffer[i]=SBUF;
  172.                                 RI=0;
  173.                                 j=0;
  174.                         }
  175.                         else
  176.                         {
  177.                             break;
  178.                         }
  179.                 }
  180.                 if(i==len)
  181.                 {
  182.                         REN=0;
  183.                         CmdValid=1;
  184.                 }
  185.         }
  186.         else if(!RI && TI)
  187.         {
  188.                 TI=0;
  189.                 len=RevBuffer[0];
  190.                 for(i=0;i<len+1;i++)
  191.                 {
  192.                         SBUF=RevBuffer[i];
  193.                         while(!TI);
  194.                         TI=0;                       
  195.                 }
  196.                 REN=1;
  197.         }
  198. }



  199.   void main( )
  200. {   
  201.     unsigned char baud;
  202.      InitializeSystem( );
  203.     while (1)
  204.     {       
  205.             if (CmdValid)
  206.             {
  207.                     CmdValid = FALSE;
  208.                     if(RevBuffer[0]==11)            //为了加快相应速度 测试风鸣器
  209.                     {
  210.                             RevBuffer[2]=RevBuffer[1];
  211.                               RevBuffer[0]=1;         //contact
  212.                             RevBuffer[1]=0;
  213.                             CALL_isr_UART();               
  214.                 LED_GREEN = 1;
  215.                             delay_10ms(RevBuffer[2]);
  216.                 LED_GREEN = 0;
  217.                     }
  218.                     else if(RevBuffer[0]==13)   //设置通讯波特率
  219.                     {
  220.                             switch(RevBuffer[1])
  221.                             {
  222.                                     case 0:
  223.                                             baud=BAUD_9600;
  224.                                             break;
  225.                                     case 1:
  226.                                             baud=BAUD_14400;
  227.                                             break;
  228.                                     case 2:
  229.                                             baud=BAUD_19200;
  230.                                             break;
  231.                                     case 3:
  232.                                             baud=BAUD_28800;
  233.                                             break;
  234.                                     case 4:
  235.                                             baud=BAUD_38400;
  236.                                             break;
  237.                                     case 5:
  238.                                             baud=BAUD_57600;
  239.                                             break;
  240. ……………………

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

msp430单片机源程序:
  1.                                                                         //
  2. //===========================================================================//

  3. #include "msp430x14x.h"
  4. #include "PIN_DEF.H"
  5. #include "RC522.H"
  6. #include "UART0_Func.c"
  7. #include "ctype.h"
  8. #include "BoardConfig.h"

  9. unsigned char UID[5],Temp[4]                                       ;
  10. unsigned char RF_Buffer[18]                                        ;
  11. unsigned char Password_Buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}   ; // Mifare One 缺省密码

  12. char          MBRX[30]                                             ;
  13. char          MBKeyTP[30]                                          ;
  14. char          Event                                                ;
  15. unsigned char DISP_MODE,i                                            ; // 编辑控件显示模式
  16. unsigned char des_on       = 0                                     ; // DES加密标志
  17. void Key_TP_Task(void)                                             ;

  18. //***************************************************************************//
  19. //                                                                           //
  20. //                 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1)                  //
  21. //                                                                           //
  22. //***************************************************************************//
  23. void Init_CLK(void)
  24. {
  25.   unsigned int qq;
  26.   WDTCTL     = WDTPW + WDTHOLD                                     ; // 关看门狗
  27.   BCSCTL1 &= ~XT2OFF;           //打开XT2高速晶体振荡器  
  28.   do
  29.   {
  30.     IFG1 &= ~OFIFG;           //Clear oscFault flag清除振荡器失效标志
  31.     for(qq=0xff;qq>0;qq--);
  32.   }while((IFG1&OFIFG));       //oscFault flag still set
  33.   
  34.   BCSCTL2 |= SELM_2;          //MCLK=XT2
  35.   //BCSCTL2 |= DIVM_0;        //控制MCLK不分频,默认
  36.   
  37.   BCSCTL2 |= SELS;            //SMCLK=XT2
  38.   //BCSCTL2 |= DIVS_0;        //控制SMCLK不分频,默认
  39. }

  40. void Delay(unsigned int time)
  41. {
  42.   unsigned int i,k                             ;
  43.   for(i=0;i<255;i++)
  44.     for(k=0;k<time;k++)
  45.       _NOP()                                   ;          
  46. }

  47. void Auto_Reader(void)
  48. {
  49.   while(1)
  50.   {
  51.     if(PcdRequest(0x52,Temp)==MI_OK)
  52.     {
  53.       if(Temp[0]==0x04&&Temp[1]==0x00)  
  54.           PutString("MFOne-S50");
  55.         else if(Temp[0]==0x02&&Temp[1]==0x00)
  56.           PutString("MFOne-S70");
  57.         else if(Temp[0]==0x44&&Temp[1]==0x00)
  58.           PutString("MF-UltraLight");
  59.         else if(Temp[0]==0x08&&Temp[1]==0x00)
  60.           PutString("MF-Pro");
  61.         else if(Temp[0]==0x44&&Temp[1]==0x03)
  62.           PutString("MF Desire");
  63.         else
  64.           PutString("Unknown");
  65.       if(PcdAnticoll(UID)==MI_OK)
  66.       {
  67.         PutString0("Card Id is:");
  68.         tochar(UID[0]);
  69.         tochar(UID[1]);
  70.         tochar(UID[2]);
  71.         tochar(UID[3]);
  72.         while (!(IFG1 & UTXIFG0));
  73.         TXBUF0 = '\n';                              //发送换行指令
  74.                         
  75.         RED_LED_ON                                            ;
  76.         Delay(200)                                           ;
  77.         RED_LED_OFF                                           ;
  78.         Delay(200)                                           ;
  79.       }
  80.     }
  81.   else GRE_LED_OFF                                            ;
  82.   }
  83. }

  84. void Find_Card(void)
  85. {
  86.     if(PcdRequest(0x52,Temp)==MI_OK)
  87.     {
  88.       if(Temp[0]==0x04&&Temp[1]==0x00)  
  89.           PutString("MFOne-S50");
  90.         else if(Temp[0]==0x02&&Temp[1]==0x00)
  91.           PutString("MFOne-S70");
  92.         else if(Temp[0]==0x44&&Temp[1]==0x00)
  93.           PutString("MF-UltraLight");
  94.         else if(Temp[0]==0x08&&Temp[1]==0x00)
  95.           PutString("MF-Pro");
  96.         else if(Temp[0]==0x44&&Temp[1]==0x03)
  97.           PutString("MF Desire");
  98.         else
  99.           PutString("Unknown");
  100.         PutString("SUCCESS!");
  101.     }
  102.     else PutString("Faile!");                                             
  103. }

  104. void Init_Port(void)
  105. {
  106.   P4DIR   =   RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT                     ;
  107.   P2DIR |= BIT0+RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT;
  108.   P1DIR   =   RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT                     ;
  109. }
  110. /*******************************************
  111. 函数名称:HandleConfigMenu
  112. 功    能:处理PC的配置函数
  113. 参    数:inputvalue--接收到的来自PC机的字符
  114. 返回值  :无
  115. ********************************************/
  116. void HandleConfigMenu(uchar inputvalue)
  117. {
  118.     switch(toupper(inputvalue))
  119.     {
  120.     case 'A':
  121.               Auto_Reader();
  122.               break;
  123.     case 'F':
  124.               Find_Card();
  125.               break;
  126.     default:
  127.               DisplayConfigMenu();  
  128.     }
  129. }

  130. ……………………

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




所有资料51hei提供下载:
TJDZ-RC522射频卡用户使用手册资料Ver_1.0.rar (990.57 KB, 下载次数: 45)

评分

参与人数 1黑币 +5 收起 理由
474344468 + 5 很给力!很有参考价值!谢谢

查看全部评分

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

使用道具 举报

沙发
ID:46475 发表于 2018-4-16 22:10 | 只看该作者
给力!很有参考价值!谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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