硬件:
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)
RFID文档资料.rar
(822.92 KB, 下载次数: 110)
|