STC最新的STC系列單片機可以實現RFID的讀卡,寫卡,擦除卡的操作,有源碼和上位機
單片機源程序如下:
- /****************************************Copyright (c)****************************************************
- **
- **
- **
- **--------------File Info---------------------------------------------------------------------------------
- ** File name: main.c
- ** Last modified Date:
- ** Last Version:
- ** Descriptions:
- **--------------------------------------------------------------------------------------------------------
- ** Created by: FiYu
- ** Created date: 2018-2-1
- ** Version: 1.0
- ** Descriptions: 無源RFID MFRC522實驗
- **--------------------------------------------------------------------------------------------------------
- ** Modified by:
- ** Modified date:
- ** Version:
- ** Descriptions:
- ** Rechecked by:
- **********************************************************************************************************/
- #include <string.h>
- #include "uart.h"
- #include "rc522.h"
- #include "UartComm.h"
- #define READ_CARD 0x10
- #define WRITE_CARD 0x11
- #define MODIFY_PASSWORD 0x12
- #define RECE_CMD FrameReceInfo.buf[1] //命令
- #define BLOCK_NUM FrameReceInfo.buf[2] //塊號
- /**********************
- 引腳別名定義
- ***********************/
- sbit LED_B=P0^7; //RGB藍色LED用IO口P07
- xdata uint8 uartReceBuf[20];
- xdata uint8 WriteDat[16];
- //M1卡的某一塊寫為如下格式,則該塊為錢包,可接收扣款和充值命令
- //4字節金額(低字節在前)+4字節金額取反+4字節金額+1字節塊地址+1字節塊地址取反+1字節塊地址+1字節塊地址取反
- //uint8_t code data2[4] = {0,0,0,0x01};
- uint8 CardKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
- uint8 NewKey[16];
- uint8 xdata g_ucTempbuf[20];
- void RC522_Init(void)
- {
- RC522_Reset();
- PcdAntennaOff();
- //PcdAntennaOn();
- M500PcdConfigISOType( 'A' );
- }
- uint8 CardHanding(void)
- {
- uint8 status,i;
-
- status = RC522_Request(PICC_REQIDL, g_ucTempbuf);//尋卡,返回卡的類型:2個字節
- if(status != MI_OK) return 0;
- if(RECE_CMD == READ_CARD)for(i=0;i<2;i++)U1SendData(g_ucTempbuf[i]); //發送卡類型,2個字節 只有接收到讀卡命令才發送
- status = RC522_Anticoll(g_ucTempbuf);//防沖撞,返回卡的序列號:4字節
- if(status != MI_OK) return 0;
- if(RECE_CMD == READ_CARD)for(i=0;i<4;i++)U1SendData(g_ucTempbuf[i]); //發送卡號,4個字節 只有接收到讀卡命令才發送
- status = PcdSelect(g_ucTempbuf);//選定卡片
- if(status != MI_OK) return 0;
-
- switch(RECE_CMD) //解析命令
- {
- case READ_CARD: // 讀卡
- memcpy(CardKey,&FrameReceInfo.buf[3],6); //拷貝密碼
- status = PcdAuthState(PICC_AUTHENT1A, BLOCK_NUM, CardKey, g_ucTempbuf);//驗證卡片密碼
- if(status != MI_OK) return 0;
- status = PcdRead(BLOCK_NUM, g_ucTempbuf);//讀塊
- if(status != MI_OK) return 0;
- for(i=0;i<16;i++)U1SendData(g_ucTempbuf[i]); //發送讀出的內容,16個字節
- PcdHalt();
- break;
-
- case WRITE_CARD: //寫卡
- memcpy(CardKey,&FrameReceInfo.buf[3],6); //拷貝密碼
- memcpy(WriteDat,&FrameReceInfo.buf[9],16); //拷貝待寫入的數據
- status = PcdAuthState(PICC_AUTHENT1A, BLOCK_NUM, CardKey, g_ucTempbuf);//驗證卡片密碼
- if(status != MI_OK) return 0;
- status = PcdWrite(BLOCK_NUM, WriteDat); //寫塊
- if(status != MI_OK) return 0;
- PcdHalt();
- break;
-
- case MODIFY_PASSWORD: //修改密碼
- memcpy(CardKey,&FrameReceInfo.buf[3],6); //拷貝待寫入的數據
- for(i=0;i<6;i++)NewKey[i] = FrameReceInfo.buf[9+i];//拷貝新密碼
- for(i=0;i<6;i++)NewKey[i+10] = FrameReceInfo.buf[9+i];
- NewKey[6] = 0xFF;
- NewKey[7] = 0x07;
- NewKey[8] = 0x80;
- NewKey[9] = 0x69;
- status=PcdAuthState(PICC_AUTHENT1A,BLOCK_NUM,CardKey,g_ucTempbuf);
- if(status!=MI_OK) return 0;
- status=PcdWrite(BLOCK_NUM,&NewKey[0]);
- if(status!=MI_OK)
- return 0;
- PcdHalt();
- break;
- }
- return 0;
- }
- /***************************************************************************
- * 描 述 : 主函數
- * 入 參 : 無
- * 返回值 : 無
- **************************************************************************/
- int main()
- {
- P3M1 &= 0xFE; P3M0 &= 0xFE; //設置P3.0為準雙向口
- P3M1 &= 0xFD; P3M0 |= 0x02; //設置P3.1為推挽輸出
-
- Uart1_Init();
- RC522_Init();
- EA = 1;
- while(1)
- {
- if(UartReceFrame() == UART_FRAME_AVAIL)//串口接收到數據?
- {
- CardHanding();
- LED_B = ~LED_B;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
無源RFID RC522實驗.7z
(7.61 MB, 下載次數: 197)
2019-9-21 16:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|