基于单片机的RFID消费管理系统设计与实现

目 录

摘 要 I
Abstract II
引 言 1
1 系统方案设计 4
1.1 方案论证与选择 4
1.2 设计要求 4
1.3 功能设计 5
2 硬件电路设计 7
2.1 单片机电路设计 7
2.2 显示模块电路设计 9
2.3 读卡器设计 10
2.4 RFID射频卡设计 11
2.5 数据存储芯片设计 11
2.6 按键电路设计 12
3 系统软件设计 13
3.1 软件程序设计 13
3.2 Keil软件开发 13
3.3 系统程序流程图 14
4 系统调试 16
4.1 软件调试 16
4.2 软件调试中遇到的问题 16
4.3 焊接中遇到的问题 16
4.4 实物调试 17
结 论 19
参考文献 20
附录1 原理图 22
附录2 源程序清单 23
致 谢 33

摘 要

为了解决小面值传统货币流通频繁对人体健康带来的隐患,又不能同时满足小额交易消费时间短而安全的要求,且需要办理业务充值的手机用户总体又趋于饱和状态的问题。
利用单片机STC89C52为核心控制器,本文设计了一款基于单片机的RFID消费管理系统。采用无线射频识别方式对IC卡进行数据采集,通过无线射频方式进行非接触双向数据通信。其中,MF RC522射频识别模块对IC射频卡进行卡内数据信息识别,4×4矩阵键盘调控LCD12864液晶器显示IC卡的卡号、消费金额、卡内实时余额和管理系统界面,并将卡内数据信息实时存储到AT24C02存储芯片中。其中0~9数字按键用于输入充值金额、消费金额及密码,功能按键分别为管理键、上下菜单切换键、确认键、返回上一级菜单键以及退格清除键。
结果表明,本设计制造成本低、结构简单且性能优良。通过软件与硬件方面的调试,预期功能可以全部实现,在技术上完全可行。它能够同时满足小额消费货币流动频繁,消费次数大的特色以及消费时间短且安全的特点。本设计可以大量节省小面额的交易时间,并且能够杜绝传统货币流通对人体健康带来的隐患。

关键词:RFID技术;单片机;IC卡;电子数据;液晶显示屏

Abstract

In order to solve the hidden danger brought by the frequent circulation of traditional currency of small denomination to human health, traditional currency cannot meet the requirements of short and safe consumption of small amount of money at the same time, and mobile phone users who need to handle business recharge tend to be saturated on the whole.
Using STC89C52 as the core controller, this paper designs a RFID consumption management system based on MCU. The IC card is collected by means of radio frequency identification, and the non-contact two-way data communication is carried out by means of radio frequency identification. Among them, MF RC522 module carries out data identification on IC card. 4×4 matrix keyboard regulates the card number, consumption amount, real-time balance and management system interface of LCD12864 IC card, and stores real-time data in the card to AT24C02 memory chip. Among them, 0~9 digital keys are used for entering recharge amount, consumption amount and password modification. The function keys are to enter the management system, switch, confirm, return to the upper menu and backspace respectively.
The results show that the design has the advantages of low cost, simple structure and excellent performance. Through the debugging of software and hardware and the simulation experiment, it is feasible in technology. The expected functions can be fully realized, which can simultaneously meet the characteristics of frequent flow of small consumption money, large consumption times and the requirement of consumption time as short as possible and safe. This design can save a lot of small denomination trading time, and can put an end to the traditional currency circulation to human health.

Keywords: RFID technology; single chip; IC card; electronic data; LCD

引 言

近几年随着国内手机用户的高速增长,国内三大电信运营商的竞争日渐激烈。目前国内手机用户总体趋于饱和状态,联通公司需要办理业务充值的用户也越来越多。小额消费有货币流动频繁、消费次数大的特色并要求消费时间短且安全,传统的货币在小额消费中明显难于很好满足这些要求。为了解决这一问题,设计了一款基于单片机的RFID消费管理系统。
RFID技术相较于其他的感知技术具备无需接触、无需可视、可完全自动识别化等优势。在工作环境、信息采集距离、读取速度,可读写性方面的限制相对较低[1]。本设计以电子数据代替传统的货币进行快速的小额消费,可以节省大量的交易时间,杜绝小面值实体货币流通对人体健康带来的隐患。
它与现有的识别系统相比,RFID射频识别可以通过无线通信反复阅读和记录,保密性好、环境适应性高、寿命长。无线射频卡进入读卡器射频范围内,天线的感应电流通过电压上升成为芯片的电源,感应电流和信息被数字信号逻辑控制,通过无线传送,覆盖了射频电路,信息处理电路和信息通过存储装置发送。无源IC卡通过天线获得了足够的能量,才能在读卡器天线产生的磁场中启动。国内RFID技术的领先地位在全球范围内得到了广泛的应用,推出了一系列的RFID产品,但这些产品差异微小、性能基本相同,结构都是读卡器芯片加单片机[2]。
我国已经推出了一批读写功能可以达到发达国家同等水平的RFID读写器,目前正在开发高性能的读写模块以及读写系统。我国目前的RFID技术在各个领域上都有了广泛应用,在未来国内越来越多的RFID企业将在超高频领域上深入研究,并且会和世界领先的企业竞争市场占比率[3]。虽然在超高频RFID领域,我国与世界领先的企业暂时有很大的距离,但随着许多领域持续地推广和不断地高速发展,我国未来RFID领域的关键突破口将取决于超高频RFID技术[4]。
国外RFID技术发展历史悠久,且发展速度也日渐提升。目前RFID技术广泛应用于美国的交通、车辆管理、身份证、生产线自动化控制等领域。美国有很多RFID企业将技术投入到不同的生活领域中,日本也一直在探索电子标签领域,2004年3月,日本发表了一份关于RFID的报告,无源和有源电子标签将继续得到支持。电子标签的体积将更小,成本也将越来越低。其次,识别距离会更长,无源的RFID标签也可达到数十米[5]。目前RFID系统制造成本不断降低,高频技术不断完善,RFID高频系统的应用会越来越广泛,RFID高频系统将成为产业发展的重心[6]。
在我国,目前RFID系统在中国的各个领域广泛应用,随着金卡的建设深入,得到了初步的社会效果。政府的管理和支持力度持续地加强,技术发展水平不断地提高,国内品牌将快速发展并限制国外品牌的市场占有率。未来几年,RFID卡系统在我国的应用将进入深入发展的阶段,RFID技术将向世界领先的RFID企业靠近,实现快速赶超,且市场结构也将越来越成熟[7]。但其识别功能技术和制造技术的落后大大限制了我国RFID无线射频卡产业的发展。特别是在保密性和安全性方面,对金融业提出了更高的要求,对我国金卡项目的实施和发展有一定的局限性,特别是技术高端的CPU卡和非接触式RFID智能射频卡的普及应用推广,具有重要意义[8]。
本设计将重点解决系统的硬件设计,选择合适的单片机、液晶显示屏、读卡器、矩阵键盘等;系统能够通过MF RC522射频识别模块对IC射频卡进行卡内数据识别;4×4矩阵键盘能够调控LCD12864液晶显示IC卡的卡号、消费金额、卡内实时余额和管理系统界面,并将卡内数据实时存储到AT24C02存储芯片中。其中0~9数字按键用于输入充值金额、消费金额及修改密码,功能按键分别为管理键、上下菜单切换键、确认键、返回上一级菜单键,退格清除键。
本篇文章共分为四个章节,主要内容如下。
第一章重点说明了系统的方案设计,主要阐述了系统的功能和设计要求,并根据设计目的选择合适的数据识别方式,做出了系统的总体方案设计框图。
第二章介绍了基于单片机的RFID消费管理系统设计的硬件设计,其中包含各个模块的设计原理,并根据系统的设计要求选择最适合本设计的主控模块和硬件模块,本章重点介绍了各个模块的电路设计。
第三章讲述了系统的软件设计,简要介绍了系统的开发环境和系统流程图。
第四章是基于单片机的RFID消费管理系统设计的调试部分,囊括了系统的硬件测试以及软件测试,并就本设计出现的问题,做了简单的论述以及解决办法。

1 系统方案设计

1.1 方案论证与选择
方案一:选用条形码识别方式。条形码技术的应用范围十分广泛,条形码可以印刷在物品表面,生产非常方便,成本极低。但是条形码所包含的信息有一定的局限性,扫描仪要想准确阅读必须正对着条形码中心,并且不能有障碍,条形码阅读器在一段时间内只能读取一个标签,无法快速识别数据,并且当条形码被弄脏或弯曲后很难读取。
方案二:选用RFID射频识别方式。RFID可以在指定范围内读取标签,不需要接触标签。通过射频信号自动识别目标并获取数据,在各种恶劣条件下都可以正常工作,且不需要人工参与。RFID技术可以识别高速运行的目标和多个标签。操作简单快捷、扫描、读写速度快。RFID标签可以将信息储存在其中,转变为数字信号,从而避免了常规的非暴力的破坏,且RFID识别卡片可以重复利用、重复读写[9]。
首先确定RFID系统的工作频率,选择相应的电子标签和读写芯片,选择适合单片机的芯片,一般RFID应用系统由读卡器、天线和RFID卡组成。其中,读卡器通常是用电脑终端进行RFID数据读取并保存卡片数据。天线决定了RFID卡和读卡器之间的通信媒介及方式。
方案三:选用磁卡识别方式。磁卡外部有金属触点,该触点直接接触磁卡适配器插座,该插座与磁卡中的集成电路进行信息处理和交互。磁卡通过本身的磁性载体记录信息,磁卡的材料分为高强度的耐高温塑料和纸质包装塑料两种。此外,磁卡具有防潮和耐磨性、使用方便、价格低廉以及用途广泛。磁卡在线圈中产生感应电动势,传输被记录的信号。磁卡通过磁条进行数据存储,只有与读卡器接触时,才能读取卡内信息[10]。
与传统的接触IC卡、磁卡相比,射频卡具有非接触、操作方便、读写频率高、使用寿命长和安全防冲撞等优点。因此,本设计选用方案二,选用RFID射频识别方式。
1.2 设计要求
(1)采用一个不需要复杂运算的核心控制器为基础;
(2)采用能够准确快速检测IC射频卡、并进行卡内数据采集的读卡器;
(3)采用液晶显示屏显示卡号、充值和扣费金额及管理系统界面,刷卡能实时显示卡号和卡内余额;
(4)需要16个按键,其中包含0~9数字按键、管理、上下菜单切换、返回上一级菜单、确认和退格6个功能按键;
(5)需要简单操作的存储芯片,能够实时存储卡内数据信息。
1.3 功能设计
(1)4×4矩阵键盘能够调控LCD12864液晶显示IC卡的卡号、扣费金额、卡内实时余额和管理系统界面;
(2)将卡靠近读卡器,液晶显示屏显示该卡卡号、卡内余额;
(3)刷卡输入相应的消费金额,实时显示消费后的余额,若是余额不足会提示并显示余额;
(4)进入注册界面,刷卡可以直接注册,会提示注册成功并显示该卡卡号;如果该卡已经注册过,则会提示该卡已是会员卡;
(5)进入注销界面,刷卡可以直接注销,会提示注销成功并显示该卡卡号;若该卡不是会员卡,则会提示不是会员卡;
(6)进入充值界面,刷卡并输入相应的充值金额,即可成功充值并实时显示充值后的余额;
(7)进入修改密码界面,修改密码之前需要输入旧密码,并且需要输入两次新密码,防止输入错误;
(8)卡内的数据信息实时存储在AT24C02芯片中。
实现以上功能,本设计要由电源、单片机、RFID射频卡、读卡器、液晶显示屏、按键、存储芯片七部分组成。
单片机主控模块驱动MF RC522读卡器,将IC卡初始化,并对卡号进行数据采集,当MF RC522读卡器检测到有卡靠近,读取IC卡数据信息送至单片机,等待单片机处理。当扫描到有按键按下时,通过LCD显示模块显示卡内数据信息及管理系统界面,并通过AT24C02存储模块对卡内数据信息进行实时存储。其中矩阵键盘包括0~9数字按键及管理键、上下切换菜单、确认、返回上一级菜单、退格6个功能键。
系统总体设计框图如图1.1所示。

图1.1 系统总体设计框图
总电源通电后,单片机通过驱动MF RC522读卡器读取IC卡数据信息扫描按键,对数据进行处理,经转换后输出给液晶显示电路,并将IC卡数据信息存储在AT24C02芯片中,从而完成该系统的运行。

2 硬件电路设计

2.1 单片机电路设计
2.1.1 单片机型号选择
方案一:采用STC89C52单片机作为主控芯片。STC89C52是一款高性能八位CMOS微处理器、低功耗、片内具有8k在线编程Flash存储器[11]。
采用的是MCS-51内核,指令完全兼容MCS-51,STC89C52比STC89C51多了一个定时器,在串行通信中可以设置更高的波特率,可以说STC89C52是STC89C51的增强型,STC89C52单片机具有的开发简单、可在线编程下载、成本低,是非常不错的选择。
方案二:采用MSP430单片机作为主控芯片。MSP430系列单片机具有16位能量消耗超低和精简指令集。一般来说,需要使用电池供电的设备仪表使用该系列的单片机。但是开发难度相对比较大、价格昂贵。
由于STC89C52具有8K内存,开发简单、可在线编程下载、成本低,可以充分满足设计要求,因此,选择方案一,采用STC89C52单片机作为主控芯片。
STC89C52单片机实物图如图2.1所示。

图2.1 STC89C52单片机实物图
STC89C52单片机主要参数:
(1)工作电压:3.3V~5.5V;
(2)工作频率范围:0~40MHz;
(3)内部ROM存储器:8K;集成512字节RAM。
2.1.2 单片机电路
单片机电路原理图如图2.2所示。

图2.2 单片机电路原理图
2.1.3 单片机的引脚说明
在本设计中,采用的封装形式为直插式的PDIP40,STC89C52一共具有40只引脚,其中可以对32只引脚进行控制。
单片机P3口第二功能如表2.1所示。
表2.1 单片机P3口第二功能表

I/O引脚名称 第二功能引脚名称 第二功能
P3.0 RXD 串行通信接收
P3.1 TXD 串行通信发送
P3.2 INT0 外部中断0
P3.3 INT1 外部中断1
P3.4 T0 定时/计数器0
P3.5 T1 定时/计数器1
P3.6 WR 外部写选通信号
P3.7 RD 外部读选通信号
2.1.4 单片机的最小系统
最小系统一般包括:电源电路、晶振电路、复位电路。
由于本设计中52单片机的工作电压为5V,所以电源部分采用了USB电源线,可以连接手机充电器插头或者5V的移动电源给系统进行供电。
在晶振电路中有两个独立的反相放大器,可以作为单片机的内部振荡器,图2.3采用的是内部时钟模式。与其连接的两个电容C1和C3会对振动频率起微小作用,进而起到调节频率的效果。
晶振电路原理图如图2.3所示。

图2.3 晶振电路原理图
复位电路分为上电自动复位、手动按键复位。电容C2两端的电压在上电时不会快速变化。此时,电容的负端连接到RST,并且电压全部施加到电阻R1,RST输入高电平,芯片复位。由于之后5V直流电源对电容供电,导致电阻两端电压不断降低,直到变为0的时候芯片开始照常工作[12]。
复位电路原理图如图2.4所示。

图2.4 复位电路原理图
2.2 显示模块电路设计
方案一:采用LED数码管动态扫描显示。LED数码管集中显示数字,使用动态扫描法与单片机连接时,使用的I/O线较少、电路简单、但适合数字或简单的文字显示,本设计需要显示的数据较多,采用数码管无法完全实现显示功能。
方案二:采用LCD12864液晶显示屏。LCD12864液晶显示屏中的汉字库是由16×16点阵组成,字符集是由16×8点阵组成。与传统的LED数码管显示器相比,LCD显示模块具有电压低、功耗低、显示内容丰富等优点,而且无需外加驱动电。需要5V的电压工作,通过单片机输出数字信号,设置的字符通过液晶显示屏显示,可以采用并行数据传输也可以采用串行数据传输[13]。
根据本设计显示内容较大,LCD12864分辨率为128×64,且低功耗低电压。因此,选择方案二,采用LCD12864液晶作为本设计的显示屏。另外在本电路中,设置了电位器,其功能为调节液晶显示器的对比度,即亮度。
LCD12864电路原理图如图2.5所示。

图2.5 LCD12864电路原理图
2.3 读卡器设计
MF RC522是非接触式、低电压、低成本以及体积小的13.56MHz读写卡芯片。MF RC522读卡器能够很好的与STC89C52单片机融合。MF RC522是一种高度集成的射频模块,它的识别过程包括识别、由防冲撞检测循环读取卡号、激活IC卡、对指定的区域进行认证(通常为3次)、能够对卡进行读写操作、对数据的加减值操作、将模块中的数据传至数据寄存器中储存、将数据寄存器中的数据转至模块中,让模块进入休眠状态或工作进入暂停状态等[14]。
MF RC522具有低电压、低成本、体积小以及非接触的优点,符合设计方案的实际需求,因此采用MF RC522读卡器作为射频识别系统的读写模块。
MF RC522读卡器电路原理图如图2.6所示。

图2.6 MF RC522读卡器电路原理图
2.4 RFID射频卡设计
接触式射频卡在七八年前使用较多,接触式射频卡的芯片通常都在表面,所以很容易损坏。而非接触式射频卡,则是将芯片和线圈封装在卡内,不容易损坏,所以在当今颇受欢迎,且可靠性高。
方案一:选用ID射频卡。ID卡只可读不可修改,芯片内的数据是预先写入的唯一序列编号,且不可修改。因此使用ID卡识别数据只是读取ID卡内的序列编号进行身份识别,其使用原理和磁条卡的差异不大。
方案二:选用MIFARE S50型IC射频卡。IC卡可以搭载复杂的信息精准的传送识别。可根据用户需求设置权限,卡内记录内容可反复修改擦写。每张卡内都有唯一的32位序列号,能保证卡内数据信息的安全性,抗干扰能力强并可以防止多张卡片同时识别[15]。
考虑到安全问题,由于IC卡数据内容可以通过密码进行保护,使其内容不易被伪造和篡改。因此,本设计选用方案二,选用可靠性高,成本低的非接触式S50型IC射频卡。
MIFARE S50型IC卡主要参数:
(1)工作频率:13.56MHZ;
(2)通信速度:106KBPS;
(3)读写距离:10CM以内。
2.5 数据存储芯片设计
本设计的存储芯片采用的是型号为AT24C02的存储芯片。AT24C02是一个2K位串行CMOS EEPROM,芯片内部总容量为256个8位字节,采用CMOS技术,从而减少了元件的功耗。另外AT24C02具备16字节页缓冲器。该器件通过总线接口进行操作,有一个专门的保护功能[16]。
单片机内部的EEPROM,在数据存储的过程中不易操作,AT24C02是专门的数据存储芯片,并且有专门的保护功能。因此,采用AT24C02存储芯片。
AT24C02存储芯片主要参数:
(1)类型:可擦除只读存储器;
(2)次数:1000000次;数据保存:100年。
2.6 按键电路设计
在矩阵键盘每条行线和列线的交点加入一个按键,采用4条行线,4条列线,这样就有16个按键[17]。按键部分实现了对电路的控制,K5键为管理键,按下K5键直接进入管理系统界面,此时液晶显示屏第一列显示RFID管理系统;第二行显示注册、修改密码;第三行显示注销、退出管理、第四行显示充值。此时可以根据K9键和K13键切换菜单,分别为切换上一项、切换下一项;K16键为确定输入或确定菜单选项设置;K17键为退出键,按下后可以返回上一级菜单;K15、K2、K3、K4、K6、K7、K8、K11、K12分别为0~9数字按键,用于输入充值金额、扣费金额和修改密码;K14键为退格键,在输入数字过程中输错时,可以清除输入的最后一位。
本设计需要按键较多,矩阵键盘又能够减少I/O口的占用,因此采用矩阵键盘是非常合理的。
矩阵键盘电路原理图如图2.7所示。

图2.7 矩阵键盘电路原理图

3 系统软件设计

3.1 软件程序设计
在单片机的控制系统中,数据处理包括数据收集、数字处理、数据转换和显示处理;过程控制程序主要通过根据特定方法计算然后输出信号来控制生产。
在设计软件以执行上述任务时,整个过程分为几个部分,并将每个部分称为模块。所谓的“模块”本质上是一个执行特定功能的相对独立的程序段。
3.2 Keil软件开发
Keil uVision4,它同时支持WINXP和WIN7等多种操作系统,内含强大开发工具,可以进行编译、连接、调试以及仿真等所有研发过程Keil提供的开发解决方案具有很强的完整性、实用性,其中包括编译器、宏汇编、链接器、库管理和仿真器调试器[18]。
Keil uVision4软件开发流程图如图3.1所示。

图3.1 Keil uVision4软件开发流程图
3.3 系统程序流程图
系统程序流程图如图3.2所示。

图3.2 系统程序流程图
系统程序流程:上电初始化,RC522读卡器复位,读卡器读取IC卡,如果进行卡内扣费,按下矩阵键盘中的数字按键输入扣费金额进行扣费,卡内实时余额通过LCD12864液晶显示屏显示;若不进行卡内扣费,进入管理系统选择功能界面,按下矩阵键盘中的功能键并刷卡,可以完成注册、注销、充值、修改密码功能,成功操作后提示语将会通过LCD12864液晶显示屏显示,并将数据信息实时存储在AT24C02中,完成操作后等待IC卡离开读卡器,操作结束。
LCD显示流程图如图3.3所示。

图3.3 LCD显示流程图
LCD显示流程:上电初始化,设置显示位置,显示字符,将实时采集的数据显示在LCD12864液晶显示屏上。
MF RC522读卡器流程图如图3.4所示。

图3.4 MF RC522读卡器流程图
MF RC522读卡器读卡流程:系统初始化,读卡器初始化,读卡器检测IC卡然后进行防冲撞检测也就是防止两张卡一起检测,然后选定该IC卡,再进行该卡密码匹配,如果匹配成功进行读卡操作,如果匹配失败则返回。

4 系统调试

在整个系统通电之前,观察焊接是否存在问题。如有明显断裂,正负极连接、器件连接、焊接不实等,用万用表检测电源正负电压,是否出现严重的电源问题,如短路等。最后确认并保证系统没有问题。
在搭建调试平台后,需要对软件程序进行调试,如果检查程序没有语句错误,则要检测是否能够达到本设计的要求,如果有功能不能正常运行,需要继续对软件程序进行调试,反复进行测试验证,直到所有功能都能正常运行。
4.1 软件调试
(1)使用Keil 4软件创建项目:单击菜单栏上的“工程”,输入并保存新项目名称“基于单片机的RFID消费管理系统设计”,然后在“Atmel”目录下选择单片机的型号“STC89C52”。
(2)新建用户源文件:新建一个空白的文本,在空白文本上编写本设计相关的程序源代码,代码编写完成后,文件拓展名“main.c”,新文件创建完成。
(3)程序编译和调试:单击代码运行按钮,在下方有输出文本框,可以看到代码的编译信息,如果在最后一行error()内有数字,则需要按照提示找出错误的代码,并重新编写,直到没有错误为止[19]。
4.2 软件调试中遇到的问题
问题一:首次对程序进行编译时,有窗口弹出,显示有错误。
解决方法:检查程序中的标点书写格式,检查是否切换中英文角标;检查程序句末尾是否有遗漏的分号。
问题二:程序汇编时出现字母数字的混杂。
解决方法:输入字母“O”和数字“0”时,注意细节。
问题三:提示无asm文件。编译时候提示:F:…\XX.asm File has been changed outside the editor,reload?
解决方法:重新生成项目,产生examl1.asm即可。
4.3 焊接中遇到的问题
由于本设计布线较密,在焊接时需要根据电路图仔细对照,防止焊接位置出现错误。
问题一:在焊接过程中,焊锡不够、焊接点不圆润。
解决方法:这时需要给焊接处补焊锡,此时一定要注意焊锡量,不能补多,否则会容易连接到其它的引脚[20]。
问题二:在焊接过程中,遇到焊锡过多的问题。
解决方法:在焊接处用电烙铁来回滑动,用电烙铁将多余的焊锡带走,也可以使用吸锡器除焊锡。
实物焊接图如图4.1所示。

图4.1 实物焊接图
4.4 实物调试
在系统中,对于硬件电路的检测主要是看焊接时是否有毛刺、无光泽,电路是否有短路、开路、一些具有方向的元件是否方向弄错、电路设计错误等情况。
对于漏焊、元件方向弄错的检测方法是将手中的电路板对照着原理图,将导线一条一条的对照。如果发现没有导线连接错误或者对不上的情况下,需及时的检查有无漏焊的部位,确定漏焊的部位并进行及时的补焊。
检测短路、断路以及虚焊的时候,分别用两支红黑表笔在需要检测的元件或导线的两端连通,如果听到蜂鸣器发出响声,则代表线路正常,如果没有听到蜂鸣器发出响声,则代表着电路有问题[21]。
经过测试,实物电路板与原理图一致,所有元器件的插接、方向均正确,本系统最终实现了所有硬件功能。
本设计制作过程图如图4.2所示。

图4.2 制作过程图
本设计实物图如图4.3所示。

图4.3 实物图

结 论

通过以上分析,本设计经过了硬件以及软件的测试,各部分均达到预期功能。本次设计由STC89C52单片机主控电路、MF RC522读卡器电路、IC射频卡电路、LCD12864液晶显示电路、按键电路、AT24C02存储芯片电路、电源电路七个部分组成。
本篇论文针对近几年随着国内手机用户的高速增长,国内三大电信运营商的竞争日渐激烈,联通公司需要办理业务充值的用户也越来越多,传统货币又不能同时满足小额交易消费时间短且安全的问题,设计出了基于单片机的RFID消费管理系统。
本设计采用STC89C52单片机作为主控制器,通过MF RC522射频识别模块对IC射频卡进行卡内数据识别,并通过矩阵键盘调控LCD12864液晶显示IC卡的卡号、消费金额、卡内实时余额显示和管理系统界面,并将卡内数据实时存储到AT24C02存储芯片中。其中0~9数字按键输入充值金额、消费金额及修改密码,功能按键分别为管理键、上下菜单切换键、确认键、返回上一级菜单键、退格清除键。
结果表明,本设计达到了预期功能,采用RFID射频识别技术解决了传统货币进行小额消费时不能快速交易的问题。本设计以电子数据代替传统货币,达到了能够保证小额消费交易安全又能实现快速交易的目的。并在此基础上添加了管理系统设计,能够实现充值、注册、注销、修改密码的功能。

参考文献

[1] 赵帅锋, 胡绍海. 基于软件仿真的“RFID原理与应用”课程实践教学初探[J]. 工业和信息化教育, 2020(01) :75-80
[2] 孙永飞. 基于ARM的RFID读卡器设计[D]. 南京理工大学, 2007
[3] 赵大伟. 基于RFID无线射频技术的一卡通控制系统设计与实现[D]. 齐鲁工业大学, 2017
[4] 沈红卫. 基于单片机的智能系统设计与实现[M]. 北京: 电子工业出版社, 2006
[5] 许守成. UHF RFID读写器的设计与实现[D]. 东南大学,2019
[6] 段华伟. 无线射频识别技术(RFID)简述[J]. 智慧工厂,2019(01) :59-62
[7] 刘莹. 基于单片机控制的RFID读写器的设计与实现[J]. 电子技术与软件工程, 2014(03) :158-159
[8] 程冬冬. 基于RFID和图像处理身份识别采集终端的研究与实现[D]. 河北工程大学, 2011
[9] 陈明月. RFID无线射频识别技术在物联网的应用[J]. 信息与电脑(理论版),2019(13) :174-175
[10] 孙天泽, 袁文菊, 付晓江. JS500磁卡解码芯片在嵌入式Linux系统中的编程[J]. 仪器仪表用户, 2004(03) :33-34
[11] 付龙, 胡林林, 彭海涛. 基于STC89C52单片机和RFID的智能考勤系统的设计[J]. 仪表技术,2019(11) :31-33
[12] 韩勇鹏, 霍利锋. 基于MSP430F169的最小系统设计[J]. 山西农业大学学报, 2007(S2) :216-218
[13] 杨会宝. 基于51单片机的温度日期显示系统[J]. 信息化研究, 2009,(4) :61-63
[14] 单莹, 刘旭儒, 史仪凯. 非接触式13.56MHz读卡器的设计[J]. 工业仪表与自动化装置,2010(03) :27-29
[15] 陈保平, 王月波, 马伯元. 基于MFRC522的Mifare射频卡读写模块开发[J]. 微计算机信息,2007(32) :230-231
[16] 宋德杰. AT24C02在单片机中的应用[J]. 电子制作,2005(04) :17-19
[17] 陶有军. 矩阵键盘的一种简捷高效识别算法[J]. 单片机与嵌入式系统应用,2019,19(09) :43-45
[18] 邓力. 基于Keil时序逻辑和Proteus的电路仿真[J]. 实验室研究与探索,2017,36(01) :80-83
[19] 侯美. 基于keil4、Proteus和YL-236设备的单片机教学[J]. 数字通信世界,2020(04) :226
[20] Wang Miao, Yuan Ming, Wang Chaoming, Ma Ruiting. Abietic acid encapsulated Sn-57Bi alloy nanoparticles as oxidation resistant solder material[J]. Elsevier,2020,602(prepublish)
[21] 王彩霞, 谢兰清. 万用表实操能力强化在电子实训教学过程中的作用研究[J]. 无线互联科技,2020,17(06) :153-154

附录1 原理图

附录2 源程序清单

#include<reg52.h> //头文件
#include<LCD12864.h>
#include<AT24C02.h>
#include<KEY.h>
#include<MFRC522.h>
#include<INTERRUPT.h>

#define uchar unsigned char //宏定义
#define uint unsigned int
#define MAX 4//充值和刷卡最多4位数

uchar mode=0;//0正常扣费,1进入管理,2管理界面,3注册模式,4撤销模式,5充值模式,6修改密码
uchar mode_num=0;

uchar g_ucTempbuf[4];//存储读回的数据
uchar status; //存储操作是否成功,0表示成功
uchar IC_num; //总存储的卡片数量
uchar ID[2]; //存储卡号
uchar ii; //循环变量

uint price=0; //存储输入的金额
uchar n=0; //输入的位数
uchar TagType[2];//

函数名称:void display_ID()//函数作用:显示感应区的ID号
void display_ID()
{
if(ID[0]!=0&&ID[1]!=0)//检测到正确的卡号
{
LCD12864_display_char(3,2,ASCII[ID[0]/16]);//显示卡号
LCD12864_display_char(4,2,ASCII[ID[0]%16]);
LCD12864_display_char(5,2,ASCII[ID[1]/16]);
LCD12864_display_char(6,2,ASCII[ID[1]%16]);
}
}
函数名称:bit chaxun()//函数作用:查询本次刷的卡是否存储
参数说明:返回0表示没有,返回1表示有
bit chaxun()
{
uchar ID2[2]; //用于读取存储的卡号
for(ii=0;ii<IC_num;ii++)//循环检测存储所有的IC卡号
{
ID2[0]=AT24C02_read_date(ii4); //先读取第一位
if(ID2[0]==ID[0]) //如果第一位匹配成功
{
ID2[1]=AT24C02_read_date(ii
4+1);//读取第二位
if(ID2[1]==ID[1]) //如果匹配成功
return 1; //返回1
}
}
return 0; //没有完全匹配的返回0
}

函数名称:void cunchu()//函数作用:存储卡
void cunchu()
{
if(chaxun()) //先检测该卡是否存储
LCD12864_display_string(0,3,“该卡已经是会员卡”);
else //未存储
{
if(IC_num<50) //先判断目前卡是否存满
{
AT24C02_write_date(IC_num4,ID[0]); //存储卡号
AT24C02_write_date(IC_num
4+1,ID[1]);
AT24C02_write_date(IC_num4+2,0);
AT24C02_write_date(IC_num
4+3,0);
IC_num++; //卡数+1
AT24C02_write_date(210,IC_num);
LCD12864_display_string(0,4,“会员卡总数:”);
LCD12864_display_char(6,4,ASCII[IC_num/10]);
LCD12864_display_char(7,4,ASCII[IC_num%10]);
LCD12864_display_string(0,3," 会员注册成功 “);//以存储成功,提示操作成功
}
else
LCD12864_display_string(0,3,” 存储已满 ");//以存储满,提示操作失败
}
}
函数名称:void shanchu()//函数作用:删除卡
void shanchu()
{
uchar ID2[2];
if(chaxun()) //先检测该卡是否存储
{
for(;ii<IC_num-1;ii++) //将所有的卡往前存储
{
ID2[0]=AT24C02_read_date(4ii+4);
AT24C02_write_date(ii
4,ID2[0]);
ID2[1]=AT24C02_read_date(4ii+5);
AT24C02_write_date(ii
4+1,ID2[1]);
}
IC_num–; //总卡数-1
AT24C02_write_date(IC_num4,0);
AT24C02_write_date(IC_num
4+1,0);
AT24C02_write_date(IC_num4+2,0);
AT24C02_write_date(IC_num
4+3,0);

	AT24C02_write_date(210,IC_num);
	LCD12864_display_string(0,4,"会员卡总数:");
	LCD12864_display_char(6,4,ASCII[IC_num/10]);
	LCD12864_display_char(7,4,ASCII[IC_num%10]);
	LCD12864_display_string(0,3,"    注销成功    "); //删除成功,提示操作成功
}
else
	LCD12864_display_string(0,3,"  不是会员卡    ");//未存储过,提示操作失败							  		

}
函数名称:void yu(uint temp,uchar wei)//函数作用:显示一个五位数字
参数说明:temp:显示数字,wei:显示在第几行
void yu(uint temp,uchar wei)
{
uchar ss[]=" \0";
LCD12864_display_string(0,4,“余额:”);
if(temp>9999) //将数字转换成字符数组,方便显示
{
ss[0]=ASCII[temp/10000];
ss[1]=ASCII[temp%10000/1000];
ss[2]=ASCII[temp%1000/100];
ss[3]=ASCII[temp%100/10];
ss[4]=ASCII[temp%10];
}
else
if(temp>999)
{
ss[0]=ASCII[temp%10000/1000];
ss[1]=ASCII[temp%1000/100];
ss[2]=ASCII[temp%100/10];
ss[3]=ASCII[temp%10];
}
else
if(temp>99)
{
ss[0]=ASCII[temp%1000/100];
ss[1]=ASCII[temp%100/10];
ss[2]=ASCII[temp%10];
}
else
if(temp>9)
{
ss[0]=ASCII[temp%100/10];
ss[1]=ASCII[temp%10];
}
else
ss[0]=ASCII[temp%10];
LCD12864_display_string(3,wei,ss);
}
函数名称:void chongzhi()//函数作用:充值卡
void chongzhi()
{
uint temp;//零时存储余额
if(chaxun()) //先检测该卡是否存储
{
temp=AT24C02_read_date(ii4+2); //读取余额
temp=temp
256+AT24C02_read_date(ii*4+3);

	if(price+temp>50000)					//超额
		LCD12864_display_string(0,3,"    超出限额    ");	
	else
	{
		temp=price+temp;
		AT24C02_write_date(ii*4+2,temp/256);	
		AT24C02_write_date(ii*4+3,temp%256);	
		LCD12864_display_string(0,3,"    充值成功    ");						
	}
	price=0;
	n=0;
	yu(temp,4);
}
else
	LCD12864_display_string(0,3,"    非会员卡    "); //未存储过,提示操作失败							  	

}

函数名称:void xiaofei()//函数作用:消费
void xiaofei()
{
uint temp;//零时存储余额
if(chaxun()) //先检测该卡是否存储
{
temp=AT24C02_read_date(ii4+2);
temp=temp
256+AT24C02_read_date(ii*4+3);

	if(temp<price)
		LCD12864_display_string(0,3,"    余额不足    ");	
	else
	{
		temp=temp-price;
		AT24C02_write_date(ii*4+2,temp/256);	
		AT24C02_write_date(ii*4+3,temp%256);	
		LCD12864_display_string(0,3,"    扣费成功    ");						
	}
	price=0;
	n=0;
	yu(temp,4);
}
else
{
	LCD12864_display_string(0,3,"    非会员卡    "); //未存储过,提示操作失败							  
}		

}
函数名称:void moeny()//函数作用:显示余额
void moeny()
{
uint temp;//零时存储余额
if(chaxun()) //先检测该卡是否存储
{
temp=AT24C02_read_date(ii4+2);
temp=temp
256+AT24C02_read_date(ii*4+3);
yu(temp,4);
}
}
函数名称:void xunka()//函数作用:寻卡
void xunka()
{
while(1)
{
status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
if (status != MI_OK)
{ break; }

	status = PcdAnticoll(g_ucTempbuf);//防冲撞
	if (status != MI_OK)
	{    break;    }
	T1_num=0;
	TR1=1;			//开启定时器,12秒左右自动退出初始的界面
	ID[0]=g_ucTempbuf[0];				//记录卡号
	ID[1]=g_ucTempbuf[1];
	LCD12864_display_string(0,2,"卡号:");
	LCD12864_display_char(3,2,ASCII[ID[0]/16]);	//显示卡号
	LCD12864_display_char(4,2,ASCII[ID[0]%16]);
	LCD12864_display_char(5,2,ASCII[ID[1]/16]);
	LCD12864_display_char(6,2,ASCII[ID[1]%16]);
	
	status = PcdSelect(g_ucTempbuf);//选定卡片
	if (status != MI_OK)
	{    break;    }
}	

}
函数名称:void display_guanli()//函数作用:显示管理界面
void display_guanli()
{
LCD12864_display_string(0,1," RFID管理系统 “);
LCD12864_display_string(0,2,” 注册 修改密码");
LCD12864_display_string(0,3," 注销 退出管理");
LCD12864_display_string(0,4," 充值 “);
switch(mode_num)
{
case 0: LCD12864_display_string(0,2,”>>“); break;
case 1: LCD12864_display_string(0,3,”>>“); break;
case 2: LCD12864_display_string(0,4,”>>“); break;
case 3: LCD12864_display_string(3,2,”>>“); break;
case 4: LCD12864_display_string(3,3,”>>"); break;
default: break;
}
}
函数名称:void main()//函数作用:主函数
void main()
{
uchar i;
a=keycan();
if(a==1)
{
for(i=0;i<214;i++)
AT24C02_write_date(i,0);

	low_mima=0;	
}

LCD12864_init();	 	 //初始化LCD12864	
T0_init();
PcdReset();			//复位RC522
PcdAntennaOff(); 	//先关闭天线
PcdAntennaOn();		//然后打开天线
M500PcdConfigISOType( 'A' ); //配置RC522工作方式

low_mima=AT24C02_read_date(211);	
low_mima=low_mima*100+AT24C02_read_date(212);
low_mima=low_mima*100+AT24C02_read_date(213);

IC_num=AT24C02_read_date(210);		    //读取存储的总卡数
LCD12864_display_string(0,1,"  RFID消费系统  ");  //显示初始界面
LCD12864_display_string(0,2,"卡号:          ");	
LCD12864_display_string(0,3,"消费:        元");
LCD12864_display_string(0,4,"余额:        元");
while(1)
{
	a=keycan();		   //矩阵键盘检测
	chuli();		   //矩阵键盘处理
	if(mode==2)
		display_guanli();
	else
		if(mode==3)				   //注册卡
		{
			xunka();			   //寻找卡
			if(ID[0]!=0&&ID[1]!=0) //检测到正确的卡号
			{
				cunchu();		   //执行存储操作
				WaitCardOff();     //等待卡离开天线	
				PcdHalt();
				ID[0]=0;	       //清除卡号
				ID[1]=0;	
			}
			else
			{
				LCD12864_display_string(0,2,"                ");	
				LCD12864_display_string(0,3,"                ");
				LCD12864_display_string(0,4,"                ");
			}	
		}
		else
			if(mode==4)			  //注销卡
			{
				xunka();		  //寻找卡
				if(ID[0]!=0&&ID[1]!=0)//检测到正确的卡号
				{
					shanchu();	  //执行删除操作
					WaitCardOff();//等待卡离开天线	
					PcdHalt();
					ID[0]=0;	  //清除卡号
					ID[1]=0;	
				}
				else
				{
					LCD12864_display_string(0,2,"                ");	
					LCD12864_display_string(0,3,"                ");
					LCD12864_display_string(0,4,"                ");
				}
			}
			else
				if(mode==5)		  //充值
				{
					xunka();	  //寻找卡
					if(ID[0]!=0&&ID[1]!=0)//检测到正确的卡号
					{
						T1_num=0;
						TR1=1;
						moeny();
						status = PcdRequest(PICC_REQALL , TagType);
						if(status)//等待卡离开天线
						{	
							status = PcdRequest(PICC_REQALL , TagType);
							if(status)
							{
								status = PcdRequest(PICC_REQALL , TagType);
								if(status)
								{ 
					LCD12864_display_string(0,2,"卡号:          ");	
				   LCD12864_display_string(0,3,"充值:        元");
					LCD12864_display_string(0,4,"余额:        元");
									ID[0]=0;	  //清除卡号
									ID[1]=0;
									n=0;
									price=0;
									PcdHalt();
								}
							}
						}	
					}
				}
				else
					if(mode==0&&in_f==0)		  //消费
					{
						xunka();		  //寻找卡
						if(ID[0]!=0&&ID[1]!=0)//检测到正确的卡号
						{
							T1_num=0;
							TR1=1;
							moeny();
							status = PcdRequest(PICC_REQALL , TagType);
							if(status)//等待卡离开天线
							{	
								status = PcdRequest(PICC_REQALL , TagType);
								if(status)
								{
								status = PcdRequest(PICC_REQALL , TagType);
									if(status)
									{ 
						LCD12864_display_string(0,2,"卡号:          ");	
					   LCD12864_display_string(0,3,"消费:        元");
					   LCD12864_display_string(0,4,"余额:        元");
										ID[0]=0;	  //清除卡号
										ID[1]=0;
										n=0;
										price=0;

// price_f=1;
PcdHalt();
}
}
}
}
}
if(f==1)
{
f=0;
num=0; //清除所有标志、计数
in_f=0;
reset_f=0;
input_f=0;
reset_num=0;
reset_f=0;
TR1=0;
n=0;
write_com(0x01); //关闭定时
if(mode>=2)
mode=2;
else
{
mode=0;
LCD12864_display_string(0,1," RFID消费系统 "); //显示初始界面
LCD12864_display_string(0,2,"卡号: ");
LCD12864_display_string(0,3,“消费: 元”);
LCD12864_display_string(0,4,“余额: 元”);
display_ID();
}
}
}
}

致 谢

在这次毕业设计中,首先我要感谢我的指导老师谢莹和冯雅丽老师。在本文的撰写过程中,得幸遇谢莹老师和冯雅丽老师,从开题报告到初稿及多次修改的定稿,都离不开谢莹老师和冯雅丽老师的指导与帮助。
感谢这次疫情中最美的“逆行者”及所有疫情工作者,正是因为有你们,我才可以安心在家完成我的论文。感谢谢莹老师、冯雅丽老师在疫情期间仍一丝不苟逐字逐句审阅修改,并为本文给予了宝贵意见,本文才得以成型。
这是我在沈阳城市学院所写的最后一篇论文,行文至此最后落笔之处,也意味着四年本科生涯即将闭幕。始于2016初秋,终于2020盛夏,时间转瞬即逝,入学之时恍如昨日,回首四年,百感交集。在这四年曾有过困顿、有过低落、有过未来的迷茫,但也有过坚定、有过认可与关怀。留下的青春和沉甸甸的收获。即有万般不舍,但仍心怀感激。
经师易遇,人师难求。再次感谢四年来所有教导我的老师们,饮其流时思其源,成吾学时念吾师。谨此对自动化老师们一并表达谢意。
感谢我的同窗三位舍友,感谢四年来对我的帮助与陪伴,在学习上给予鼓励与支持,在生活上帮助和开导。愿有前程可奔赴,亦有岁月共回首。其次感谢四年来所有帮助过我同学,在临别之际,祝大家前程似锦,未来可期。
父母之爱子,则为之计深远。借此机会,特别感谢我的父母。二十余载求学之路,全乃父母默默付出。在对未来困惑时指点迷津并表示韶华不为少年留,支持继续深造学业。祝父母身体健康,再次感谢父母的无私付出与鼎力支持。
冬季的黑暗尽管漫长,但永远遮挡不住黎明的曙光。纵然山河有恙,不敌世间盛情。春已至,花已开,国家泰安,祥和人间。在此最后向此次逆行者们致以最崇高的敬意,幸得有你,山河无恙。在撰写本文期间,深感祖国之强大,为祖国为骄傲,祝愿祖国繁荣昌盛,国泰民安!

作者:Q_1928499906

物联沃分享整理
物联沃-IOTWORD物联网 » 基于单片机的RFID消费管理系统设计与实现

发表评论