久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2776|回復: 0
打印 上一主題 下一主題
收起左側(cè)

單片機+RC522串口助手操作CPU卡源程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:106249 發(fā)表于 2021-7-14 20:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本人調(diào)試通過。


單片機源程序如下:
  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個字節(jié)表示 //

  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個字節(jié)表示 //

  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];        //接收到串口助手的數(shù)據(jù)緩存器

  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 初值自動裝入 產(chǎn)生波特率
  41. TH1=0xfd;   //定時器初始為0XFd,晶振為22.1184MHz,本函數(shù)實際產(chǎn)生的波特率為38400bps
  42. TL1=0xfd;         //同上   
  43. SCON=0x50;         //串口設置為方式1,REN=1,允許接收
  44. TR1=1;      //啟動定時器1
  45. ES=1;       //使能串口接收中斷,
  46. EA=1;       //打開所有中斷
  47. }

  48. /**************************************************************************
  49. - 功能描述:51單片機的串口發(fā)送字節(jié)的函數(shù)
  50. - 隸屬模塊:STC51串口操作
  51. - 函數(shù)屬性:外部,使用戶使用
  52. - 參數(shù)說明:mydata:要發(fā)送的一個字節(jié)
  53. - 返回說明:無
  54. - 注:發(fā)送一個字節(jié),是串口發(fā)送的基礎(chǔ)操作
  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單片機的串口發(fā)送0d 0a ,即回車換行
  67. - 隸屬模塊:STC51串口操作
  68. - 函數(shù)屬性:外部,使用戶使用
  69. - 參數(shù)說明:無
  70. - 返回說明:無
  71. - 注:此函數(shù)就是發(fā)送0d 0a這兩個字節(jié),在“超級終端”上會有回車換行的效果
  72. **************************************************************************/

  73. void UART_Send_Enter()
  74. {
  75. UART_Send_Byte(0x0d);
  76. UART_Send_Byte(0x0a);
  77. }
  78. /**************************************************************************
  79. - 功能描述:51單片機的串口發(fā)送字符串
  80. - 隸屬模塊:STC51串口操作
  81. - 函數(shù)屬性:外部,使用戶使用
  82. - 參數(shù)說明:s:指向字符串的指針
  83. - 返回說明:無
  84. - 注:如果在字符串中有'\n',則會發(fā)送一個回車換行
  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. //串行中斷,接收串口助手發(fā)來的數(shù)據(jù)
  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)  //尋卡函數(shù)
  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卡復位函數(shù)
  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]);         //串口助手顯示返回狀態(tài)

  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. //系統(tǒng)初始化
  287. /////////////////////////////////////////////////////////////////////
  288. void InitSystem()
  289. {

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

所有資料51hei提供下載:
RC522_CPU卡.rar (126.91 KB, 下載次數(shù): 49)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区国产精品 | 伊人伊成久久人综合网站 | 99热热99 | 国产美女在线免费观看 | 黄免费观看 | 中文字幕在线一区二区三区 | 在线观看国产视频 | 曰韩三级 | 久久国内 | 黄色一级免费 | 国产91色在线 | 亚洲 | 中文字幕亚洲视频 | 国产高清精品一区二区三区 | 日韩av三区 | 久久精品国产精品青草 | 国产精品美女久久久av超清 | 国产综合精品一区二区三区 | 国产精品大全 | 99re在线视频 | 日韩在线免费电影 | 伊人精品国产 | 国产91在线播放精品91 | 99精品国产一区二区三区 | 欧美一级大片免费看 | 亚洲视频免费播放 | 日韩一区二区三区av | 伊人网站 | 日韩三| 国产成人99久久亚洲综合精品 | 九九免费在线视频 | 一区二区三区免费在线观看 | 91天堂| 亚洲国产精品99久久久久久久久 | 中文字幕精品一区二区三区精品 | 青青草原综合久久大伊人精品 | 久久久www成人免费精品张筱雨 | 五月天激情综合网 | 夜夜久久 | 中文字幕亚洲区 | www天天操 | 日韩精品一区二区三区在线播放 |