硬件:
1、MCU(該程序使用STM32F103開發板)
2、RFID RC522讀寫器(會送兩張MI卡)
軟件:
1、串口調試助手
2、KEIl5開發工具
參考資料:
1、MCU(該程序使用STM32F103開發板)
2、stm32中文參考手冊(V10)
3、Mifare1 S50IC卡中文說明書
實驗說明:本程序可在51等單片機上運行,只需SPI接口,電源,注意RFID的電源范圍,一塊開發板,看懂程序后容易移植
實驗程序內容:程序在網上下載案例,只實現讀卡功能(網上大部分的資源大多是這種情況),于是對程序修改后進行編寫,主要增加了STORE文件,
還可進行拓展。
程序實現功能:
最主要的功能是進行管理員認證后執行相應操作
1、管理員權限卡(具有全部權限)
2、用戶卡(只能獲取本卡信息,用戶卡消費,需先獲取管理員權限),認證管理員卡后可進行等操作
實驗步驟:
1、按key0鍵進行管理員認證
2、按key1鍵進行密碼修改,密碼內容沒有做輸入,暫時沒做界面(需管理員認證,實際是無需管理員認證的,只是偷懶了以下)
3、按key2鍵進行(需管理員認證)
調試錯誤:
1、SPi的時鐘極性和時鐘相位沒有設置正確,調試發現發送命令字后返回的結果不一致
2、RC522復位時間和啟動時間間隔太短,導致讀卡不靈敏
3、將扇區控制塊的內容寫錯(格式錯誤,存儲控制的數據和反碼不一致,粗心導致),導致不能讀寫這個
錢包數據格式:
示例1:01 ff ff ff f7 0 0 0 01 ff ff ff 28 D7 28 D7 //數據存放在0x28
示例2:3 0 0 0 fc ff ff ff 3 0 0 0 8 f7 8 f7 //數據存放在0x08
前4字節:金額
4-7 :反碼
8-11 :備份金額
12-15 :地址 地址反碼 地址 地址反碼
管理員卡:扇區使用0x18-0x1B
1B:秘鑰A:888888 控制字:f0 f0 f0 69 秘鑰B:654321
18:塊數據 FF BB E0 A8 C9 56 FE AC C4 D2 B6 7B 55 6B 3F 19
0f:秘鑰A:123321 控制字:ff 07 80 69 秘鑰B:010101
控制字說明:
塊 0: C10 C20 C30 101 秘鑰B認證后可讀不可寫
塊 1: C11 C21 C31 101 秘鑰B認證后可讀不可寫
塊 2: C12 C22 C32 101 秘鑰B認證后可讀不可寫
塊 3: C13 C23 C33 101 秘鑰A、B不可讀寫,驗證秘鑰B可改寫控制字
用戶卡:扇區使用0x0C-0x0F
0X0F:秘鑰A:初始值:123456(用戶可更改) 控制字:80 ff 87 69 秘鑰B:960917
0X0C作為錢包存儲
塊 0: C10 C20 C30 110 秘鑰A可讀,可減,秘鑰B:可讀可寫可增可減
塊 1: C11 C21 C31 110 秘鑰B認證后可讀不可寫
塊 2: C12 C22 C32 110 秘鑰B認證后可讀不可寫
塊 3: C13 C23 C33 101 秘鑰A、B不可讀寫,驗證秘鑰B可改寫控制字
單片機源程序如下:
- #include "output.h"
- #include "delay.h"
- #include "sys.h"
- #include "rc522.h"
- #include "lcd.h" //顯示模塊
- #include "key.h" //
- #include "usart.h"
- #include "string.h"
- #include "led.h"
- #include "store.h"
- /*******************************
- *連線說明:
- *1--SS <----->PF0
- *2--SCK <----->PB13
- *3--MOSI<----->PB15
- *4--MISO<----->PB14
- *5--懸空
- *6--GND <----->GND
- *7--RST <----->PF1
- *8--VCC <----->VCC
- ************************************/
- int main(void)
- {
- unsigned char status;
- u8 key=0;
- u8 i=0;
- u8 RETRY=0x10; //最多十次驗證管理員用戶卡
- u8 flag=1;
- Stm32_Clock_Init(9);
- MY_NVIC_PriorityGroupConfig(2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- delay_init(72); //延時函數初始化
- OUTPUT_Init(); //輸出模塊初始化
- uart_init(72,115200);
- LCD_Init();
- KEY_Init();
- LED_Init();
- InitRc522(); //初始化射頻卡模塊
- POINT_COLOR=RED;
- LCD_ShowString(40,80,240,24,24,(u8*)"open the ");
- LCD_ShowString(20,110,240,24,24,(u8*)"serial assistant.");
- LCD_ShowString(0,140,240,16,16,(u8*)"KEY0:administrator operation");
- LCD_ShowString(0,160,240,16,16,(u8*)"KEY1:change password");
- LCD_ShowString(0,180,240,16,16,(u8*)"KEY2:rechargeable card");
- printf("***************************操作說明***************************************\r\n");
- printf("先按key0進入管理員驗證,需先初始化管理員卡,用戶卡,再按key1或key2進行用戶卡操作\r\n");
- printf("**************************************************************************\r\n");
- while(1)
- {
- key=KEY_Scan(0);
- if(key==1)
- {
- RETRY=0x10;
- do
- {
- status=store(addrAdmin,KEYB_1B,0); //管理員認證
- if(status==MI_OK){
- break;
- }
- RETRY--;
- }while(RETRY!=0);
- if(RETRY!=0&&IsManager==1){ //驗證管理身份成功
- while(flag)
- {
- key=KEY_Scan(0);
- if(key==3) //金額可在STORE.c文件中修改
- {
- status=userRecharge(addrUserDat,USERKEYINITB,Recharge,0); //金額
- if(status==MI_OK)
- {
- printf(":%d :%d 現:%d\r\n",prevMoney,Recharge,laterMoney);
- }
- }
- if(key==2) //改密
- {
- status=changeUserPwd(addrUserDat,addrUserCon,USERKEYINITB,(u8*)"123456",(u8*)"123321",0);
- if(status==MI_OK)
- {
- printf("密碼修改成功\r\n");
- }
- }
- }
- }
- else{
- printf("請檢查你放置的管理員卡是否正確\r\n");
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
RFID射頻.rar
(168.91 KB, 下載次數: 241)
2018-5-17 18:43 上傳
點擊文件名下載附件
RFID文檔資料.rar
(822.92 KB, 下載次數: 110)
2018-5-17 16:31 上傳
點擊文件名下載附件
|