找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2376|回复: 0
收起左侧

单片机+RC522串口助手操作CPU卡源程序

[复制链接]
ID:106249 发表于 2021-7-14 20:56 | 显示全部楼层 |阅读模式
本人调试通过。
51hei.png

单片机源程序如下:
  1. #include   <STDIO.H>
  2. #include <string.h>
  3. #include "reg52.h"
  4. #include "main.h"
  5. #include "rc522.h"
  6. #include "1602.h"




  7. //////////////////CPU卡的指令/////////////////////////////////////////////////////////////////////////////////
  8. unsigned char code Keyfile[7] ={0x3F, 0x00, 0xB0, 0x01, 0xF0, 0xFF, 0xFF};        //建密钥文件
  9. unsigned char code DefaultKey[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};  //原始外部密钥
  10. unsigned char code ExKey[5]   ={0x39, 0xF0, 0xF0, 0xAA, 0x55};             ////外部密钥建立的指令信息
  11. unsigned char code DFfile[13] ={0x38,0x05,0x20,0xF0,0xF0,0x95,0xFF,0xFF,0x44,0x44,0x46,0x30,0x31};//建立的DF文件                                                           
  12. unsigned char code EF_KEY_File[7]={0x3F, 0x01, 0x8F, 0x95, 0xF0, 0xFF, 0xFF};//建立EF密钥文件                                                                                                                  
  13. unsigned char code C_KEY[8]={0x3A, 0xF0, 0xEF, 0x44, 0x55, 0x12, 0x34, 0x56};    //增加口令密钥
  14. unsigned char code EF_File1[7]={0x28, 0x00, 0x1E, 0xF0, 0xF0, 0xFF, 0xFF};//        基本文件EF 建立的二进制文件1                                                   
  15. unsigned char code EF_File2[7]={0x28, 0x00, 0x0F, 0xF4, 0xF0, 0xFF, 0xFF};//        基本文件EF 建立的二进制文件2
  16. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////





  17. //////////////////文件标识的定义/////////////////////////////////////////////////////////////////////////////////

  18. unsigned char code MF_File_Flag[2] = {0x3f,0x00};       //MF文件标识3F00//
  19. unsigned char code KEY_File_Flag[2] = {0x00,0x00};      //密钥文件标识0000//
  20. unsigned char code KEY_Flag = {0x00};                //密钥标识00,即放在MF下密钥文件里面的密钥,用1个字节表示 //

  21. unsigned char code DF_File_Flag[2] = {0x3f,0x01};       //DF文件标识3F01//
  22. unsigned char code KEY_DF_File_Flag[2] = {0x00,0x01};   //DF下的密钥文件标识0001//
  23. unsigned char code Keyword_DF_Flag = {0x01};         //密钥标识01,即放在DF下密钥文件里面的密钥,用1个字节表示 //

  24. unsigned char code EF_File3_Flag[2]        = {0x00,0x03};       //EF文件标识0003//
  25. unsigned char code EF_File4_Flag[2]        = {0x00,0x04};       //EF文件标识0004//
  26. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  27. unsigned char xdata g_ucTempbuf[MAXRLEN];
  28. unsigned char  xdata Rec_Buf[MAXRLEN];        //接收到串口助手的数据缓存器

  29. unsigned char WorkInt;        //成功接收指令的标志
  30. unsigned char Cmd_Len;  //指令长度         
  31. void delay1(unsigned int z)
  32. {
  33.         unsigned int x,y;
  34.         for(x=z;x>0;x--)
  35.         for(y=110;y>0;y--);        
  36. }  

  37. void UART_Init()     
  38. {
  39. PCON=0x80; //PCON的最高位SMOD=1时波特率加倍
  40. TMOD=0x20;  //时器1为方式2 初值自动装入 产生波特率
  41. TH1=0xfd;   //定时器初始为0XFd,晶振为22.1184MHz,本函数实际产生的波特率为38400bps
  42. TL1=0xfd;         //同上   
  43. SCON=0x50;         //串口设置为方式1,REN=1,允许接收
  44. TR1=1;      //启动定时器1
  45. ES=1;       //使能串口接收中断,
  46. EA=1;       //打开所有中断
  47. }

  48. /**************************************************************************
  49. - 功能描述:51单片机的串口发送字节的函数
  50. - 隶属模块:STC51串口操作
  51. - 函数属性:外部,使用户使用
  52. - 参数说明:mydata:要发送的一个字节
  53. - 返回说明:无
  54. - 注:发送一个字节,是串口发送的基础操作
  55. **************************************************************************/

  56. void UART_Send_Byte(unsigned char mydata)        
  57. {
  58. ES=0;
  59. TI=0;
  60. SBUF=mydata;
  61. while(!TI);
  62. TI=0;
  63. ES=1;
  64. }

  65. /**************************************************************************
  66. - 功能描述:51单片机的串口发送0d 0a ,即回车换行
  67. - 隶属模块:STC51串口操作
  68. - 函数属性:外部,使用户使用
  69. - 参数说明:无
  70. - 返回说明:无
  71. - 注:此函数就是发送0d 0a这两个字节,在“超级终端”上会有回车换行的效果
  72. **************************************************************************/

  73. void UART_Send_Enter()
  74. {
  75. UART_Send_Byte(0x0d);
  76. UART_Send_Byte(0x0a);
  77. }
  78. /**************************************************************************
  79. - 功能描述:51单片机的串口发送字符串
  80. - 隶属模块:STC51串口操作
  81. - 函数属性:外部,使用户使用
  82. - 参数说明:s:指向字符串的指针
  83. - 返回说明:无
  84. - 注:如果在字符串中有'\n',则会发送一个回车换行
  85. **************************************************************************/

  86. void UART_Send_Str(char *s)
  87. {
  88. int len=strlen(s)-1;
  89. int i;
  90. for(i=0;i<len;i++)
  91. UART_Send_Byte(s[i]);
  92. if(s[i]=='\n')
  93. {
  94.   UART_Send_Enter();
  95. }
  96. else
  97. {
  98.   UART_Send_Byte(s[i]);
  99. }
  100. }




  101. /////////////////////////////////////////////////////////////////////
  102. //串行中断,接收串口助手发来的数据
  103. /////////////////////////////////////////////////////////////////////
  104. seri_int () interrupt 4 using 1
  105. {
  106. unsigned char len, i;
  107. unsigned int j=0;
  108.    if (RI)
  109.    {

  110.                 ES=0;
  111.                 len=SBUF;
  112.                 RI=0;        
  113.                 for(i=0;i<len;i++)
  114.                 {
  115.                         while(!RI)
  116.                         {
  117.                                 j++;
  118.                                 if(j>1000)
  119.                                 {
  120.                                    ES=1;
  121.                                     break;
  122.                                 }
  123.                         }
  124.                         if(j<1000)
  125.                         {
  126.                                 Rec_Buf[i]=SBUF;
  127.                                 RI=0;
  128.                                 j=0;
  129.                         }
  130.                         else
  131.                         {
  132.                            ES=1;
  133.                             break;
  134.                         }
  135.                 }
  136.                 if(i==len)
  137.                 {
  138.                         ES=1;
  139.                         Cmd_Len=len;
  140.                         WorkInt  = 1;
  141.                                        
  142.                 }
  143.     }

  144. }











  145.   
  146. void u8tostr(unsigned char dat)
  147. {

  148. switch(dat>>4)         //高位
  149. {
  150.          case 0: UART_Send_Byte(0x30);  break;
  151.         case 1: UART_Send_Byte(0x31);  break;
  152.         case 2: UART_Send_Byte(0x32);  break;
  153.         case 3: UART_Send_Byte(0x33);  break;
  154.         case 4: UART_Send_Byte(0x34);  break;
  155.         case 5: UART_Send_Byte(0x35);  break;
  156.         case 6: UART_Send_Byte(0x36);  break;
  157.         case 7: UART_Send_Byte(0x37);  break;
  158.         case 8: UART_Send_Byte(0x38);  break;
  159.         case 9: UART_Send_Byte(0x39);  break;
  160.         case 0x0A: UART_Send_Byte(0x41);  break;
  161.         case 0x0B: UART_Send_Byte(0x42); break;
  162.         case 0x0C: UART_Send_Byte(0x43); break;
  163.         case 0x0D: UART_Send_Byte(0x44); break;
  164.         case 0x0E: UART_Send_Byte(0x45); break;
  165.         case 0x0F: UART_Send_Byte(0x46); break;

  166. }

  167. switch(dat&0x0f)        //低位
  168. {
  169.          case 0: UART_Send_Byte(0x30);  break;
  170.         case 1: UART_Send_Byte(0x31);  break;
  171.         case 2: UART_Send_Byte(0x32);  break;
  172.         case 3: UART_Send_Byte(0x33);  break;
  173.         case 4: UART_Send_Byte(0x34);  break;
  174.         case 5: UART_Send_Byte(0x35);  break;
  175.         case 6: UART_Send_Byte(0x36);  break;
  176.         case 7: UART_Send_Byte(0x37);  break;
  177.         case 8: UART_Send_Byte(0x38);  break;
  178.         case 9: UART_Send_Byte(0x39);  break;
  179.         case 0x0A: UART_Send_Byte(0x41);  break;
  180.         case 0x0B: UART_Send_Byte(0x42); break;
  181.         case 0x0C: UART_Send_Byte(0x43); break;
  182.         case 0x0D: UART_Send_Byte(0x44); break;
  183.         case 0x0E: UART_Send_Byte(0x45); break;
  184.         case 0x0F: UART_Send_Byte(0x46); break;

  185. }

  186.   
  187. }
  188. void UART_Put_Num(unsigned char * dat,unsigned char len)
  189. {
  190.         unsigned char i;
  191.         
  192.         for(i=0;i<len;i++)
  193.         {
  194.                 u8tostr(dat[i]);
  195.         }
  196.         UART_Send_Enter();
  197. }



  198. //////////////////////////////////////////////////////////////////////////////

  199. void main( )
  200. {   
  201.         unsigned char status;
  202.         unsigned char tt[2],st[2];
  203.          unsigned int sst=0;
  204.            InitSystem( );
  205.          lcd_int();
  206.      RC522_Init();

  207.      PcdAntennaOff();
  208.      PcdAntennaOn();

  209.          display_welcome();

  210.          delay1(500);
  211.          BEEP=0;
  212.          delay1(100);
  213.          BEEP=1;

  214.           memset(g_ucTempbuf, 0x00, MAXRLEN); //清0

  215.           while(1)
  216.           {

  217.                    if(WorkInt)
  218.                    {
  219.                                 WorkInt=0;
  220.                  
  221.                                 if((Cmd_Len==1)&&(Rec_Buf[0]==0xAA))           //寻卡及复位只操作一次  约定指令为:01AA
  222.                                 {
  223.                                         Rec_Buf[0]=0;
  224.                                         Cmd_Len=0;
  225.                                         if(GetCard(PICC_REQALL,tt,g_ucTempbuf)!=ST_OK)  //寻卡函数
  226.                                         {
  227.                                                 UART_Send_Str("无卡!");
  228.                                                 UART_Send_Enter();
  229.                                                 continue;
  230.                                         }          //寻卡失败返回
  231.                                         else
  232.                                         {
  233.                                                         UART_Send_Str("类型:");
  234.                                                         UART_Put_Num(tt,2);         //串口助手显示返回
  235.                                                         UART_Send_Enter();
  236.                                                         UART_Send_Str("卡号:");
  237.                                                         UART_Put_Num(g_ucTempbuf,4);         //串口助手显示返回
  238.                                                         UART_Send_Enter();
  239.                                                         
  240.                                         }
  241.                                         memset(g_ucTempbuf, 0x00, MAXRLEN);        //清0
  242.                                         if (CardReset(g_ucTempbuf,st)!=ST_OK)                  //CPU卡复位函数
  243.                                         {
  244.                                                                 UART_Send_Str("复位失败!");
  245.                                                                 UART_Send_Enter();
  246.                                                         continue;
  247.                                                 }
  248.                                         UART_Send_Str("复位成功!");
  249.                                         UART_Send_Str("返回ATS值:");
  250.                                         UART_Send_Enter();
  251.                                         UART_Put_Num(g_ucTempbuf,st[0]);         //串口助手显示返回
  252.                                         UART_Send_Enter();
  253.                                         memset(g_ucTempbuf, 0x00, MAXRLEN);        //清0
  254.                                         BEEP=0;
  255.                                         delay1(500);
  256.                                         BEEP=1;                        
  257.                                         continue;
  258.                                 }


  259.                                 status=Pcd_Cmd(Rec_Buf, Cmd_Len, g_ucTempbuf,tt);
  260.                                 if(status)        //1时出错了
  261.                                 {

  262.                                         Cmd_Len=0;
  263.                                         memset(Rec_Buf, 0x00, MAXRLEN);
  264.                                         memset(g_ucTempbuf, 0x00, MAXRLEN);        //清0                                
  265.                                         UART_Send_Str("操作失败!");
  266.                                          
  267.                                         UART_Send_Enter();
  268.                                         continue;                                                //返回        
  269.                                 }
  270.                                 
  271.                                 UART_Put_Num(&g_ucTempbuf[2],tt[0]);         //串口助手显示返回状态

  272.                                 BEEP=0;
  273.                                 delay1(100);
  274.                                 BEEP=1;                        
  275.                                 delay1(100);
  276.                                 BEEP=0;
  277.                                 delay1(100);
  278.                                 BEEP=1;
  279.                            
  280.                                 memset(g_ucTempbuf, 0x00, MAXRLEN);        //清0
  281.         
  282.                    }

  283.           }                        


  284. }


  285. /////////////////////////////////////////////////////////////////////
  286. //系统初始化
  287. /////////////////////////////////////////////////////////////////////
  288. void InitSystem()
  289. {

  290.     P0 = P1 = P2 = P3 = 0xFF;
  291.         UART_Init();
  292. }
复制代码

所有资料51hei提供下载:
RC522_CPU卡.rar (126.91 KB, 下载次数: 49)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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