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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3325|回復: 1
收起左側

PN532 NFC標簽讀寫 STM32程序源代碼

[復制鏈接]
ID:709528 發表于 2020-3-17 09:08 | 顯示全部樓層 |閱讀模式
附件是關于NFC標簽的讀寫程序源碼,大家可參考,適合新手學習

單片機源程序如下:
  1. #include "nfc.h"

  2. #include"delay.h"
  3. u32 Uart0_rev_countmap;//串口讀取的數據長度
  4. u8 RxBuffer1[500];
  5. extern u8 flag_1; //第一次 讀出 UID碼成功
  6. extern u8 flag_2;
  7. extern u8 flag_3;
  8. u8 flag_rev_finish;//串口接收到數據的標志, 1為接收到
  9. u8 flag_nfc_status;
  10. u8 UID[4]; //存儲 UID
  11. extern u8 UID_backup[4];//UID備份  用于處理 不連續寫同一卡

  12. ////55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00  
  13. void nfc_WakeUp(void)
  14. {
  15.     u8 data[24];
  16.     u8 i;
  17.     u8 CheckCode=0; //數據校驗碼
  18.     u8 temp=0;
  19.   
  20.     while(1)
  21.     {
  22.         flag_rev_finish=0;
  23.         data[0]=0x55;
  24.         data[1]=0x55;
  25.         data[2]=0x00;
  26.         data[3]=0x00;
  27.         data[4]=0x00;
  28.         data[5]=0x00;
  29.         data[6]=0x00;
  30.         data[7]=0x00;
  31.         data[8]=0x00;
  32.         data[9]=0x00;
  33.         data[10]=0x00;
  34.         data[11]=0x00;
  35.         data[12]=0x00;
  36.         data[13]=0x00;
  37.         data[14]=0x00;
  38.         data[15]=0x00;
  39.         
  40.         data[16]=0xFF;
  41.         data[17]=0x03; //包 長度
  42.         data[18]=0xFD; //包 長度 校驗  0x100-data[3]
  43.         data[19]=0xD4; //命令標識碼
  44.         data[20]=0x14; //命令標識碼
  45.         data[21]=0x01;
  46.         data[22]=0x17; //數據 校驗   0x100-
  47.         data[23]=0x00;
  48.         
  49.         SendData(data,24);//往USART1,發送 length長度的數據data
  50.         delay_ms(180);
  51.       
  52.       
  53.    //00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00   
  54.         if(flag_rev_finish)
  55.         {         
  56.             flag_rev_finish=0;
  57.             for(i=11;i<13;i++)
  58.             {
  59.                 temp+=RxBuffer1[i];
  60.             }
  61.             CheckCode=0x100-temp;
  62.             if(CheckCode==RxBuffer1[13])
  63.             {
  64.                 CheckCode=0x100-temp;
  65.                 CleanBuffer(40);//清除 串口接收緩沖區前30 個字節數據

  66.                 break;
  67.             }
  68.         }
  69.     }
  70. }

  71. //配置 106 kbps type A (ISO/IEC14443 Type A),
  72. //00 00 FF 04 FC D4 4A 01 00 E1 00
  73. void  nfc_InListPassiveTarget(void)
  74. {
  75.     u8 data[11];
  76.     u8 i;
  77.     u8 CheckCode=0; //數據校驗碼
  78.     u8 temp=0;
  79.     while(1)
  80.     {   
  81.         flag_rev_finish=0;
  82.         data[0]=0x00;
  83.         data[1]=0x00;
  84.         data[2]=0xFF;
  85.         data[3]=0x04; //包 長度
  86.         data[4]=0xFC; //包 長度 校驗  0x100-data[3]
  87.         data[5]=0xD4; //命令標識碼
  88.         data[6]=0x4A; //命令標識碼
  89.         data[7]=0x01;
  90.         data[8]=0x00;
  91.         data[9]=0xE1; //數據 校驗   0x100-
  92.         data[10]=0x00;
  93.         
  94.         SendData(data,11);//往USART1,發送 length長度的數據data
  95.         delay_ms(180);
  96.       
  97.         temp=0;
  98.         if(flag_rev_finish)
  99.         {         
  100.             flag_rev_finish=0;
  101.             for(i=11;i<23;i++)
  102.             {
  103.                 temp+=RxBuffer1[i];
  104.             }
  105.             CheckCode=0x100-temp;
  106.             if(CheckCode==RxBuffer1[23])
  107.             {
  108.                 UID[0]=RxBuffer1[19];
  109.                 UID[1]=RxBuffer1[20];
  110.                 UID[2]=RxBuffer1[21];
  111.                 UID[3]=RxBuffer1[22];  
  112.                
  113.                 CleanBuffer(40);//清除 串口接收緩沖區前30 個字節數據
  114.                 break;
  115.             }
  116.         }
  117.     }
  118. }


  119. // 密碼授權,驗證KeyA
  120. //00 00 FF 0F F1 D4 40 01 60 03 FF FF FF FF FF FF UID1 UID2 UID3 UID4 2A 00
  121. //00 00 FF 0F F1 D4 40 01 60 03 FF FF FF FF FF FF 94 8A 3B 0B 2A 00
  122. void  nfc_PsdVerifyKeyA(void)
  123. {
  124.     u8 data[22];
  125.     u8 temp=0;
  126.     u8 i;
  127.     u8 CheckCode=0; //數據校驗碼
  128.      flag_rev_finish=0;
  129.     data[0]=0x00;
  130.     data[1]=0x00;
  131.     data[2]=0xFF;
  132.    
  133.     data[3]=0x0F; //包 長度
  134.     data[4]=0xF1; //包 長度 校驗  0x100-data[3]
  135.    
  136.     data[5]=0xD4; //命令標識碼
  137.     data[6]=0x40; //命令標識碼
  138.    
  139.     data[7]=0x01;
  140.     data[8]=0x60;
  141.     data[9]=0x03;
  142.    
  143.     data[10]=0xFF; //KEY A 密碼 FF FF FF FF FF FF
  144.     data[11]=0xFF;
  145.     data[12]=0xFF;
  146.     data[13]=0xFF;
  147.     data[14]=0xFF;
  148.     data[15]=0xFF;
  149.    
  150.     data[16]=UID[0];
  151.     data[17]=UID[1];
  152.     data[18]=UID[2];
  153.     data[19]=UID[3];
  154.    
  155.     for(i=5;i<20;i++)
  156.     {
  157.         temp+=data[i];
  158.     }

  159.     data[20]=0x100-temp;   //數據 校驗   0x100-
  160.    
  161.     data[21]=0x00;
  162.    
  163.     SendData(data,22);//往USART1,發送 length長度的數據data
  164.      
  165.    
  166.    
  167.     delay_ms(180);
  168.    
  169.   // while(!flag_rev_finish)
  170.   //  ;
  171.   // flag_rev_finish=0;
  172.   
  173.    temp=0;
  174.     for(i=11;i<14;i++)
  175.     {
  176.         temp+=RxBuffer1[i];
  177.     }
  178.     CheckCode=0x100-temp;
  179.     if(CheckCode==RxBuffer1[14])
  180.     {
  181.        if(RxBuffer1[13]==0x00)
  182.        {
  183.          CleanBuffer(40);//清除 串口接收緩沖區前40 個字節數據
  184.          
  185.          if(flag_nfc_status==0)
  186.          {         
  187.             nfc_read();
  188.          }
  189.          else if(flag_nfc_status==1)
  190.          {
  191.               nfc_write(0x55);
  192.          }
  193.          else if(flag_nfc_status==2)
  194.          {
  195.               nfc_write(0xAA);
  196.          }

  197.        }
  198.     }
  199. }



  200. //默認 讀 02區的16個字節
  201. //00 00 FF 05 FB D4 40 01 30 02 B9 00
  202. void  nfc_read()
  203. {
  204.     u8 data[12];
  205.     u8 temp=0;
  206.     u8 i;
  207.     u8 CheckCode=0; //數據校驗碼

  208.     flag_rev_finish=0;
  209.     data[0]=0x00;
  210.     data[1]=0x00;
  211.     data[2]=0xFF;
  212.    
  213.     data[3]=0x05; //包 長度
  214.     data[4]=0xFB; //包 長度 校驗  0x100-data[3]
  215.    
  216.     data[5]=0xD4; //命令標識碼
  217.     data[6]=0x40; //命令標識碼
  218.    
  219.     data[7]=0x01;
  220.     data[8]=0x30;
  221.     data[9]=0x02; //讀第二塊的16字節數據
  222.    
  223.     data[10]=0xB9; //數據校驗
  224.     data[11]=0x00;

  225.     SendData(data,12);//往USART1,發送 length長度的數據data
  226.    
  227.     delay_ms(180);
  228.     //while(!flag_rev_finish)
  229.    // ;
  230.   // flag_rev_finish=0;
  231.   
  232.    temp=0;
  233.     for(i=11;i<30;i++)
  234.     {
  235.         temp+=RxBuffer1[i];
  236.     }
  237.     CheckCode=0x100-temp;
  238.     if(CheckCode==RxBuffer1[30])
  239.     {      
  240.          if(RxBuffer1[14]==0xAA)
  241.          {
  242.             GPIO_SetBits(GPIOA, GPIO_Pin_4);//點亮 D4
  243.          }
  244.          else if(RxBuffer1[14]==0x55)
  245.          {
  246.             GPIO_ResetBits(GPIOA,GPIO_Pin_4);//熄滅 D4
  247.          }
  248.          
  249.          if((UID_backup[0]!=UID[0])|(UID_backup[1]!=UID[1])|(UID_backup[2]!=UID[2])|(UID_backup[3]!=UID[3]))
  250.          {
  251.             GPIO_ResetBits(GPIOD,GPIO_Pin_3);//蜂鳴器 叫
  252.             delay_ms(50);
  253.             GPIO_SetBits(GPIOD, GPIO_Pin_3);//蜂鳴器 不叫
  254.          }
  255.          UID_backup[0]=UID[0];
  256.          UID_backup[1]=UID[1];
  257.          UID_backup[2]=UID[2];
  258.          UID_backup[3]=UID[3];
  259.          
  260.          CleanBuffer(40);//清除 串口接收緩沖區前40 個字節數據
  261.     }
  262. }



  263. //默認往 02區寫 16個字節的第一個字節
  264. //00 00 FF 15 EB D4 40 01 A0 02 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F D1 00
  265. void  nfc_write(u8 LedData)
  266. {
  267.     u8 data[28];
  268.     u8 temp=0;
  269.     u8 i;
  270.     u8 CheckCode=0;
  271.    
  272.     data[0]=0x00;
  273.     data[1]=0x00;
  274.     data[2]=0xFF;
  275.    
  276.     data[3]=0x15; //包 長度
  277.     data[4]=0xEB; //包 長度 校驗  0x100-data[3]
  278.    
  279.     data[5]=0xD4; //命令標識碼
  280.     data[6]=0x40; //命令標識碼
  281.    
  282.     data[7]=0x01; //讀寫大于6字節 就置1,看手冊
  283.     data[8]=0xA0; //寫
  284.     data[9]=0x02; //寫第二塊的16字節數據
  285.    
  286.     data[10]=LedData; //第 1 字節 數據
  287.     data[11]=0x00;
  288.     data[12]=0x00; //第 3 字節 數據
  289.     data[13]=0x00;
  290.     data[14]=0x00; //第 5 字節 數據
  291.     data[15]=0x00;
  292.     data[16]=0x00; //第 7 字節 數據
  293.     data[17]=0x00;
  294.     data[18]=0x00; //第 9 字節 數據
  295.     data[19]=0x00;
  296.     data[20]=0x00; //第 11 字節 數據
  297.     data[21]=0x00;
  298.     data[22]=0x00; //第 13 字節 數據
  299.     data[23]=0x00;
  300.     data[24]=0x00; //第 15 字節 數據
  301.     data[25]=0x00;
  302.    
  303.     for(i=5;i<26;i++)
  304.     {
  305.         temp+=data[i];
  306.     }
  307.     data[26]=0x100-temp; //數據 校驗碼
  308.     data[27]=0x00;

  309.     SendData(data,28);//往USART1,發送 length長度的數據data
  310.    
  311.      
  312.     delay_ms(180);
  313.     //while(!flag_rev_finish)
  314.    // ;
  315.   // flag_rev_finish=0;
  316.   //00 00 FF 00 FF 00 00 00 FF 03 FD D5 41 00 EA 00
  317.     temp=0;
  318.     for(i=11;i<14;i++)
  319.     {
  320.         temp+=RxBuffer1[i];
  321.     }
  322.     CheckCode=0x100-temp;
  323.     if(CheckCode==RxBuffer1[14])
  324.     {
  325.          CleanBuffer(40);//清除 串口接收緩沖區前40 個字節數據
  326.          
  327.          if((UID_backup[0]!=UID[0])|(UID_backup[1]!=UID[1])|(UID_backup[2]!=UID[2])|(UID_backup[3]!=UID[3]))
  328.          {
  329.             GPIO_ResetBits(GPIOD,GPIO_Pin_3);//蜂鳴器 叫
  330.             delay_ms(50);
  331.             GPIO_SetBits(GPIOD, GPIO_Pin_3);//蜂鳴器 不叫
  332.          }
  333.          UID_backup[0]=UID[0];
  334.          UID_backup[1]=UID[1];
  335.          UID_backup[2]=UID[2];
  336.          UID_backup[3]=UID[3];
  337.     }
  338. }

  339. //往USART1,發送 length長度的數據data
  340. void SendData(u8 *data,u8 length)
  341. {
  342.     u8 i;
  343.     for(i=0;i<length;i++)
  344.     {
  345.         USART_SendData(USART2, data[i]);
  346.         while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)//等得發送完成
  347.         {
  348.         }  
  349.     }
  350. }

  351. void CleanBuffer(u16 num)//清零 前 多少個字節的數據
  352. {
  353.     u16 i=0;
  354.    
  355.     for(i=0;i<num;i++)
  356.       RxBuffer1[i]=0x00;
  357. }
復制代碼

所有資料51hei提供下載:
NFC標簽讀寫.zip (290.49 KB, 下載次數: 44)




回復

使用道具 舉報

ID:1 發表于 2020-3-17 13:23 | 顯示全部樓層
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久在线观看| 一区欧美| 一区二区三区影院 | 欧美一区二区三区在线观看 | 精品国产一区二区国模嫣然 | 精品久久久久久 | 午夜资源| 欧美日韩亚洲国产综合 | 免费观看一级特黄欧美大片 | 性色视频 | 精品国产乱码久久久久久丨区2区 | 草比网站 | 精品国产一区二区三区久久久蜜月 | 国产精品一区二区三区久久久 | aaaa日韩 | 观看av | 久久av一区二区三区 | 亚洲va欧美va人人爽午夜 | 亚洲在线日韩 | 日韩一区在线播放 | 777777777亚洲妇女 | 国产精品久久 | 中文字幕影院 | 91色在线| 日韩在线播放一区 | 亚洲精品无人区 | 狠狠操狠狠色 | 午夜精品一区 | 美女张开腿露出尿口 | 亚洲国产一区二区三区在线观看 | 日本不卡一区 | 男人的天堂久久 | 美女人人操 | 丝袜一区二区三区 | 超碰在线人人 | 亚洲综合在线播放 | 欧美日韩视频 | 国产成人免费视频网站高清观看视频 | 亚洲精品片 | 亚洲高清免费观看 | 国产精品1区2区 |