找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机读写RC522卡参考例程及上位机调试软件源码

  [复制链接]
跳转到指定楼层
楼主
原理图:


RC522上位机delphi软件源码与界面:


单片机源程序如下:
  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黑下载附件…………
复制代码

所有资料51hei提供下载:
51读写卡参考例程及上位机调试软件.zip (880.84 KB, 下载次数: 160)


评分

参与人数 1黑币 +1 收起 理由
yywudi + 1 正需要,但是为什么我的上位机无法使用

查看全部评分

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

使用道具 举报

沙发
ID:81544 发表于 2018-11-24 15:29 | 只看该作者
参考参考
回复

使用道具 举报

板凳
ID:290815 发表于 2020-5-27 06:05 | 只看该作者
我的上位机也不能用
回复

使用道具 举报

地板
ID:470365 发表于 2020-8-11 18:41 | 只看该作者
好人,我下载回来试试看能不能用的上
回复

使用道具 举报

5#
ID:417093 发表于 2020-8-29 18:09 | 只看该作者
单片机用5V的可以吗?RC522模块电源用5V转3.3V
回复

使用道具 举报

6#
ID:839933 发表于 2021-3-14 17:14 | 只看该作者
请问如果通过串口调试助手能够读到卡序列号,但是通过上位机程序就显示读卡器连接失败,这是为什么啊?
回复

使用道具 举报

7#
ID:839933 发表于 2021-3-14 17:16 | 只看该作者
通过串口调试助手能够读到卡序列号,但是用上位机程序就显示读卡器连接失败,而且是在卡片靠近时才显示失败,这是为什么啊
回复

使用道具 举报

8#
ID:791181 发表于 2022-1-21 02:23 来自手机 | 只看该作者
ting29785 发表于 2021-3-14 17:14
请问如果通过串口调试助手能够读到卡序列号,但是通过上位机程序就显示读卡器连接失败,这是为什么啊?

同问,求大佬指点
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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