RFID——充值消费系统


前言

       射频识别(RFID)是 Radio Frequency Identification 的缩写。
       其原理为阅读器与标签之间进行非接触式的数据通信,达到识别目标的目的。RFID 的应用非常广泛,典型应用有动物晶片、汽车晶片防盗器、门禁管制、停车场管制、生产线自动化、物料管理。


提示:以下是本篇文章正文内容,下面案例可供参考

一、编译环境

       本系统基于VC++6.0版本,如果没有安装此软件的读者,可以通过百度网盘下载该软件。
       链接:https://pan.baidu.com/s/1_pUq7swULst7plceOAQpSA
       提取码:l0x5

二、实现充值消费系统

1.创建工程

        打开软件->文件->新建,可看到下面的界面,依次按照提示操作即可完成创建工程!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.添加mwf32相关API文档

(1)将API文件夹下的三个文件mwrf32.*复制到你所创建的工程的文件夹中。
在这里插入图片描述
   相关文件已放入整个系统工程中!!!

(2)添加头文件
在这里插入图片描述
(3)工程->设置->连接->对象/库模块
在这里插入图片描述

3.常用函数介绍

    函数                                              说明
rf_usbinit()                         初始化USB通讯
rf_get_status()                        获取版本号
rf_load_key()                 向读写器下载授权密码
rf_beep()                                 蜂鸣器鸣叫
rf_card()                                        寻卡
rf_authentication()                         认证
rf_write()                                        写卡
rf_read()                                         读卡
rf_halt()                                     终止卡操作
rf_exit()                                       关闭串口

4.搭建界面

   通过控件选择静态文本,编辑框,按钮,列表框,搭建如下界面
在这里插入图片描述

5.设置变量

       右键->建立类向导->Member variables->Add Variable,选择变量名及变量类型
在这里插入图片描述

6.编写程序

       双击读卡,初始化信息,充值,消费即可直接编写程序。

(1)【定义全局变量】相应代码如下:

	HANDLE icdev;
	int st;
	int sector=1;

	CString str1;	//余额
	CString str2;	//充值金额
	CString str3;	//消费金额

(2)【读卡】相应代码如下:

	icdev=rf_usbinit();
	if (icdev>0) {list.AddString("设备连接成功!");}
	else {list.AddString("连接失败!");}

	unsigned long snr;
	st=rf_card(icdev,1,&snr);
	if(st!=0) {list.AddString("请放置卡片!!!");}

    st=rf_authentication(icdev,0,sector);
	if(st!=0) {list.AddString("认证失败!");}

	//UpdateData();

	unsigned char databuff[17];
	ZeroMemory(databuff,17); 
	st=rf_read(icdev,sector*4,databuff);
	if(st==0) {list.AddString((char*)databuff);xingming=databuff;}

	st=rf_read(icdev,sector*4+1,databuff);
	if(st==0) {list.AddString((char*)databuff);xuehao=databuff;}

	st=rf_read(icdev,sector*4+2,databuff);
	str1=databuff;	//类型转换
	if(st==0) {list.AddString((char*)databuff);yue=atof(str1);}

	UpdateData(false);

	st=rf_halt(icdev);
	st=rf_exit(icdev); 
	//if(st==0) {list.AddString("断开连接!");}

(3)【初始化信息】相应代码如下:

	icdev=rf_usbinit();
	if (icdev>0) {list.AddString("设备连接成功!");}
	else {list.AddString("连接失败!");}

	unsigned long snr;
	st=rf_card(icdev,1,&snr);
	if(st!=0) {list.AddString("请放置卡片!!!");}

    st=rf_authentication(icdev,0,sector);
	if(st!=0) 
	{
		list.AddString("认证失败!");
	}
	
	else
	{
		UpdateData();
		str1.Format(_T("%.2f"),yue);	//余额

		char* data1=xingming.GetBuffer(xingming.GetLength());	//姓名
		char* data2=xuehao.GetBuffer(xuehao.GetLength());	//学号
		char* data3=str1.GetBuffer(str1.GetLength());	//余额

		st=rf_write(icdev,sector*4,(unsigned char*)data1);
		if(st==0) {list.AddString("写姓名成功!");}
		else {list.AddString("写姓名失败!");}

		st=rf_write(icdev,sector*4+1,(unsigned char*)data2);
		if(st==0) {list.AddString("写学号成功!");}
		else {list.AddString("写学号失败!");}

		st=rf_write(icdev,sector*4+2,(unsigned char*)data3);
		if(st==0) {list.AddString("写余额成功!");}
		else {list.AddString("写余额失败!");}

		unsigned char databuff[17];
		ZeroMemory(databuff,17);
		st=rf_read(icdev,sector*4,databuff);
		if(st==0) {list.AddString((char*)databuff);}
		st=rf_read(icdev,sector*4+1,databuff);
		if(st==0) {list.AddString((char*)databuff);}
		st=rf_read(icdev,sector*4+2,databuff);
		if(st==0) {list.AddString((char*)databuff);}

		UpdateData(false);
	}

	st=rf_halt(icdev);
	st=rf_exit(icdev); 
	//if(st==0) {list.AddString("断开连接!");}

(4)【充值】相应代码如下:

	icdev=rf_usbinit();

	unsigned long snr;
	st=rf_card(icdev,1,&snr);
	if(st!=0) {list.AddString("请放置卡片!!!");}

    st=rf_authentication(icdev,0,sector);
	if(st!=0) {list.AddString("认证失败!");}

	else	//读卡才能进行操作
	{
		UpdateData();
		yue=yue+chongzhi;	//充值
		chongzhi=0;	//充值置零
		str1.Format(_T("%.2f"),yue);	//余额
		str2.Format(_T("%.2f"),chongzhi);  //充值置零

		char* data3=str1.GetBuffer(str1.GetLength());	//余额
		st=rf_write(icdev,sector*4+2,(unsigned char*)data3);
		if(st==0) {list.AddString("充值成功!");}
		else {list.AddString("充值失败!");}

		unsigned char databuff[17];
		ZeroMemory(databuff,17);
		st=rf_read(icdev,sector*4+2,databuff);
		if(st==0) {list.AddString((char*)databuff);}

		UpdateData(false);
    }
	st=rf_halt(icdev);
	st=rf_exit(icdev); 
	//if(st==0) {list.AddString("断开连接!");}

(5)【消费】相应代码如下:

	icdev=rf_usbinit();
	unsigned long snr;
	st=rf_card(icdev,1,&snr);
	if(st!=0) {list.AddString("请放置卡片!!!");}

    st=rf_authentication(icdev,0,sector);
	if(st!=0) {list.AddString("认证失败!");}

	else	//读卡才能操作
	{
		UpdateData();
		yue=yue-xiaofei;	//消费
		xiaofei=0;	//消费置零
		str1.Format(_T("%.2f"),yue);	//消费
		str3.Format(_T("%.2f"),xiaofei);	//消费置零

		char* data3=str1.GetBuffer(str1.GetLength());	//余额
		st=rf_write(icdev,sector*4+2,(unsigned char*)data3);
		if(st==0) {list.AddString("消费成功!");}
		else {list.AddString("消费失败!");}

		unsigned char databuff[17];
		ZeroMemory(databuff,17);
		st=rf_read(icdev,sector*4+2,databuff);
		if(st==0) {list.AddString((char*)databuff);}

		UpdateData(false);
	}
	st=rf_halt(icdev);
	st=rf_exit(icdev); 
	//if(st==0) {list.AddString("断开连接!");}

本系统工程文件,大家可以通过百度网盘进行下载。
       链接:https://pan.baidu.com/s/1de7lseleJFXQEJ2XosY0Pg
       提取码:4na5


总结

       首先,作为一名大三的学生,真的感觉大三好累,仿佛有干不完的事情。哈哈,真该好好吐槽一下!!!此充值消费系统作为我们RFID课程的一个小测试,感觉还是挺有意义的,让我们了解到了我们生活中的所谓“刷卡”的基本原理,真的是让我这个井底之蛙涨了见识。马上就要毕业了,就写了这篇博客来纪念即将逝去的RFID课程。也许真的是永别了~bye
在这里插入图片描述
未经本人许可,不得转载!!!

  • 34
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
硬件连接说明: *RC522 <----->MINISTM32 *1--SDA <----->B0 *2--SCK <----->B13 *3--MOSI<----->B15 *4--MISO<----->B14 *5--悬空 *6--GND <----->GND *7--RST <----->B1 *8--3.3V<----->3.3V *DS18B20与MINISTM32开发板的PA0要连接上 功能: (1)充值 充值的前提是要管理员先刷卡才能进入充值界面,本设计的程序中设定蓝色S50射频卡为管理员身份(如需要可设定多张管理员身份的卡),若不是管理员刷卡则进入不了充值界面,此前提限制了消费者不能随便进入充值模式,既方便了管理员对打卡机的管理,又增加了打卡机的安全性。进入了充值界面后,先由管理员输入相应的充值金额,再到消费者刷卡即可成功充值并显示充值后的余额。 (2)消费 进入消费界面后,管理员输入相应的消费金额,然后消费者刷卡消费系统先判断此卡是否已解锁,若是未解锁(已挂失)则消费失败返回菜单栏,若是已解锁(已解挂)则进入余额判断,若是余额足够便能成功消费并显示消费后的余额,若是余额不足则会消费失败并显示余额。 (3)查询 查询功能的作用是让消费者查询卡内的信息,包括:卡的身份、是否解锁(挂失)、姓名、学会、卡号、卡内余额。消费者拿到卡后需要记住自己的卡号,因为若是自己的卡不慎丢失了需要输入卡号和密码才能挂失和解挂。 (4)挂失/解挂 消费者进入挂失/解挂界面,输入卡号后按确定,再输入6位密码后按确定,接着选择挂失或者解挂,若是挂失,输入卡号和密码正确即可成功挂失,否则挂失失败;若是解挂,除了需要输入卡号和密码正确之外,还要再拿该卡刷卡进行卡号确认,就是说,消费者需要输入和刷卡的卡号一致并且密码正确才能解挂成功,否则解挂失败。已挂失的卡是不能进行消费操作的。 操作界面图 演示视频: TJDZ-RC522射频卡用户使用手册资料、MINISTM32 +RFID程序见附件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白正在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值