附件是關于NFC標簽的讀寫程序源碼,大家可參考,適合新手學習
單片機源程序如下:
- #include "nfc.h"
- #include"delay.h"
- u32 Uart0_rev_countmap;//串口讀取的數據長度
- u8 RxBuffer1[500];
- extern u8 flag_1; //第一次 讀出 UID碼成功
- extern u8 flag_2;
- extern u8 flag_3;
- u8 flag_rev_finish;//串口接收到數據的標志, 1為接收到
- u8 flag_nfc_status;
- u8 UID[4]; //存儲 UID
- extern u8 UID_backup[4];//UID備份 用于處理 不連續寫同一卡
- ////55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00
- void nfc_WakeUp(void)
- {
- u8 data[24];
- u8 i;
- u8 CheckCode=0; //數據校驗碼
- u8 temp=0;
-
- while(1)
- {
- flag_rev_finish=0;
- data[0]=0x55;
- data[1]=0x55;
- data[2]=0x00;
- data[3]=0x00;
- data[4]=0x00;
- data[5]=0x00;
- data[6]=0x00;
- data[7]=0x00;
- data[8]=0x00;
- data[9]=0x00;
- data[10]=0x00;
- data[11]=0x00;
- data[12]=0x00;
- data[13]=0x00;
- data[14]=0x00;
- data[15]=0x00;
-
- data[16]=0xFF;
- data[17]=0x03; //包 長度
- data[18]=0xFD; //包 長度 校驗 0x100-data[3]
- data[19]=0xD4; //命令標識碼
- data[20]=0x14; //命令標識碼
- data[21]=0x01;
- data[22]=0x17; //數據 校驗 0x100-
- data[23]=0x00;
-
- SendData(data,24);//往USART1,發送 length長度的數據data
- delay_ms(180);
-
-
- //00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
- if(flag_rev_finish)
- {
- flag_rev_finish=0;
- for(i=11;i<13;i++)
- {
- temp+=RxBuffer1[i];
- }
- CheckCode=0x100-temp;
- if(CheckCode==RxBuffer1[13])
- {
- CheckCode=0x100-temp;
- CleanBuffer(40);//清除 串口接收緩沖區前30 個字節數據
- break;
- }
- }
- }
- }
- //配置 106 kbps type A (ISO/IEC14443 Type A),
- //00 00 FF 04 FC D4 4A 01 00 E1 00
- void nfc_InListPassiveTarget(void)
- {
- u8 data[11];
- u8 i;
- u8 CheckCode=0; //數據校驗碼
- u8 temp=0;
- while(1)
- {
- flag_rev_finish=0;
- data[0]=0x00;
- data[1]=0x00;
- data[2]=0xFF;
- data[3]=0x04; //包 長度
- data[4]=0xFC; //包 長度 校驗 0x100-data[3]
- data[5]=0xD4; //命令標識碼
- data[6]=0x4A; //命令標識碼
- data[7]=0x01;
- data[8]=0x00;
- data[9]=0xE1; //數據 校驗 0x100-
- data[10]=0x00;
-
- SendData(data,11);//往USART1,發送 length長度的數據data
- delay_ms(180);
-
- temp=0;
- if(flag_rev_finish)
- {
- flag_rev_finish=0;
- for(i=11;i<23;i++)
- {
- temp+=RxBuffer1[i];
- }
- CheckCode=0x100-temp;
- if(CheckCode==RxBuffer1[23])
- {
- UID[0]=RxBuffer1[19];
- UID[1]=RxBuffer1[20];
- UID[2]=RxBuffer1[21];
- UID[3]=RxBuffer1[22];
-
- CleanBuffer(40);//清除 串口接收緩沖區前30 個字節數據
- break;
- }
- }
- }
- }
- // 密碼授權,驗證KeyA
- //00 00 FF 0F F1 D4 40 01 60 03 FF FF FF FF FF FF UID1 UID2 UID3 UID4 2A 00
- //00 00 FF 0F F1 D4 40 01 60 03 FF FF FF FF FF FF 94 8A 3B 0B 2A 00
- void nfc_PsdVerifyKeyA(void)
- {
- u8 data[22];
- u8 temp=0;
- u8 i;
- u8 CheckCode=0; //數據校驗碼
- flag_rev_finish=0;
- data[0]=0x00;
- data[1]=0x00;
- data[2]=0xFF;
-
- data[3]=0x0F; //包 長度
- data[4]=0xF1; //包 長度 校驗 0x100-data[3]
-
- data[5]=0xD4; //命令標識碼
- data[6]=0x40; //命令標識碼
-
- data[7]=0x01;
- data[8]=0x60;
- data[9]=0x03;
-
- data[10]=0xFF; //KEY A 密碼 FF FF FF FF FF FF
- data[11]=0xFF;
- data[12]=0xFF;
- data[13]=0xFF;
- data[14]=0xFF;
- data[15]=0xFF;
-
- data[16]=UID[0];
- data[17]=UID[1];
- data[18]=UID[2];
- data[19]=UID[3];
-
- for(i=5;i<20;i++)
- {
- temp+=data[i];
- }
- data[20]=0x100-temp; //數據 校驗 0x100-
-
- data[21]=0x00;
-
- SendData(data,22);//往USART1,發送 length長度的數據data
-
-
-
- delay_ms(180);
-
- // while(!flag_rev_finish)
- // ;
- // flag_rev_finish=0;
-
- temp=0;
- for(i=11;i<14;i++)
- {
- temp+=RxBuffer1[i];
- }
- CheckCode=0x100-temp;
- if(CheckCode==RxBuffer1[14])
- {
- if(RxBuffer1[13]==0x00)
- {
- CleanBuffer(40);//清除 串口接收緩沖區前40 個字節數據
-
- if(flag_nfc_status==0)
- {
- nfc_read();
- }
- else if(flag_nfc_status==1)
- {
- nfc_write(0x55);
- }
- else if(flag_nfc_status==2)
- {
- nfc_write(0xAA);
- }
- }
- }
- }
- //默認 讀 02區的16個字節
- //00 00 FF 05 FB D4 40 01 30 02 B9 00
- void nfc_read()
- {
- u8 data[12];
- u8 temp=0;
- u8 i;
- u8 CheckCode=0; //數據校驗碼
- flag_rev_finish=0;
- data[0]=0x00;
- data[1]=0x00;
- data[2]=0xFF;
-
- data[3]=0x05; //包 長度
- data[4]=0xFB; //包 長度 校驗 0x100-data[3]
-
- data[5]=0xD4; //命令標識碼
- data[6]=0x40; //命令標識碼
-
- data[7]=0x01;
- data[8]=0x30;
- data[9]=0x02; //讀第二塊的16字節數據
-
- data[10]=0xB9; //數據校驗
- data[11]=0x00;
- SendData(data,12);//往USART1,發送 length長度的數據data
-
- delay_ms(180);
- //while(!flag_rev_finish)
- // ;
- // flag_rev_finish=0;
-
- temp=0;
- for(i=11;i<30;i++)
- {
- temp+=RxBuffer1[i];
- }
- CheckCode=0x100-temp;
- if(CheckCode==RxBuffer1[30])
- {
- if(RxBuffer1[14]==0xAA)
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_4);//點亮 D4
- }
- else if(RxBuffer1[14]==0x55)
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_4);//熄滅 D4
- }
-
- if((UID_backup[0]!=UID[0])|(UID_backup[1]!=UID[1])|(UID_backup[2]!=UID[2])|(UID_backup[3]!=UID[3]))
- {
- GPIO_ResetBits(GPIOD,GPIO_Pin_3);//蜂鳴器 叫
- delay_ms(50);
- GPIO_SetBits(GPIOD, GPIO_Pin_3);//蜂鳴器 不叫
- }
- UID_backup[0]=UID[0];
- UID_backup[1]=UID[1];
- UID_backup[2]=UID[2];
- UID_backup[3]=UID[3];
-
- CleanBuffer(40);//清除 串口接收緩沖區前40 個字節數據
- }
- }
- //默認往 02區寫 16個字節的第一個字節
- //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
- void nfc_write(u8 LedData)
- {
- u8 data[28];
- u8 temp=0;
- u8 i;
- u8 CheckCode=0;
-
- data[0]=0x00;
- data[1]=0x00;
- data[2]=0xFF;
-
- data[3]=0x15; //包 長度
- data[4]=0xEB; //包 長度 校驗 0x100-data[3]
-
- data[5]=0xD4; //命令標識碼
- data[6]=0x40; //命令標識碼
-
- data[7]=0x01; //讀寫大于6字節 就置1,看手冊
- data[8]=0xA0; //寫
- data[9]=0x02; //寫第二塊的16字節數據
-
- data[10]=LedData; //第 1 字節 數據
- data[11]=0x00;
- data[12]=0x00; //第 3 字節 數據
- data[13]=0x00;
- data[14]=0x00; //第 5 字節 數據
- data[15]=0x00;
- data[16]=0x00; //第 7 字節 數據
- data[17]=0x00;
- data[18]=0x00; //第 9 字節 數據
- data[19]=0x00;
- data[20]=0x00; //第 11 字節 數據
- data[21]=0x00;
- data[22]=0x00; //第 13 字節 數據
- data[23]=0x00;
- data[24]=0x00; //第 15 字節 數據
- data[25]=0x00;
-
- for(i=5;i<26;i++)
- {
- temp+=data[i];
- }
- data[26]=0x100-temp; //數據 校驗碼
- data[27]=0x00;
- SendData(data,28);//往USART1,發送 length長度的數據data
-
-
- delay_ms(180);
- //while(!flag_rev_finish)
- // ;
- // flag_rev_finish=0;
- //00 00 FF 00 FF 00 00 00 FF 03 FD D5 41 00 EA 00
- temp=0;
- for(i=11;i<14;i++)
- {
- temp+=RxBuffer1[i];
- }
- CheckCode=0x100-temp;
- if(CheckCode==RxBuffer1[14])
- {
- CleanBuffer(40);//清除 串口接收緩沖區前40 個字節數據
-
- if((UID_backup[0]!=UID[0])|(UID_backup[1]!=UID[1])|(UID_backup[2]!=UID[2])|(UID_backup[3]!=UID[3]))
- {
- GPIO_ResetBits(GPIOD,GPIO_Pin_3);//蜂鳴器 叫
- delay_ms(50);
- GPIO_SetBits(GPIOD, GPIO_Pin_3);//蜂鳴器 不叫
- }
- UID_backup[0]=UID[0];
- UID_backup[1]=UID[1];
- UID_backup[2]=UID[2];
- UID_backup[3]=UID[3];
- }
- }
- //往USART1,發送 length長度的數據data
- void SendData(u8 *data,u8 length)
- {
- u8 i;
- for(i=0;i<length;i++)
- {
- USART_SendData(USART2, data[i]);
- while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)//等得發送完成
- {
- }
- }
- }
- void CleanBuffer(u16 num)//清零 前 多少個字節的數據
- {
- u16 i=0;
-
- for(i=0;i<num;i++)
- RxBuffer1[i]=0x00;
- }
復制代碼
所有資料51hei提供下載:
NFC標簽讀寫.zip
(290.49 KB, 下載次數: 44)
2020-3-17 09:07 上傳
點擊文件名下載附件
|