基于单片机的商品RFID射频安全防盗报警系统设计

系统简介

随着现代化经济建设和管理的发展,人民的生活水平不断提高,商场能够为我们提供我们所需要的生活用品,使我们的生活十分便利。现如今,大部分商场都是可以自由购买的,但是由于人员流动比较频繁,工作人员不能百分之百的保证商品的安全性[1],
为了探索商品防盗的最佳方案,降低制作成本,解决现如今商品的安全性的问题。本文设计了一个基于单片机的商品RFID射频安全防盗报警系统,选用STC89C52单片机作为设计核心,主要包括电源模块、单片机控制模块、按键模块、蜂鸣器报警模块、LCD1602液晶显示模块、RFID射频识别模块。将有效卡信息写入单片机中,RFID只会识别有效卡的信息。电源通电后,如果按下按键,即可以将有效卡设置成设防状态。通过RFID射频模块识别有效卡,如果有人携带未结账的物品出入商场时,RFID能够识别,并且蜂鸣器会发生报警,这样能有效的保证商品的安全性,同时也可以将商品的基础信息以及设防状态信息显示在LCD1602液晶显示屏上。
本设计制造成本低、结构简单、性能优良。通过软件与硬件方面的调试并进行仿真实验,结果表明本设计在技术上完全可行,预期功能可以全部实现,是用于保障商品安全的理想系统,它能够解决商品防盗的问题,在保证安全的同时又能方便工作人员工作。对于商品安全的保护势必成为每一个人都要思考的问题,在这样的背景下,本设计将会在未来的发展中得到良好推广。

关键词:单片机; 射频识别技术; 液晶显示; 蜂鸣器报警

1 系统方案设计

1.1 总体设计要求
(1)采用一个低功耗、高性能的核心控制器为基础,录入有效卡信息,包括商品的名称价格信息,对采集感应到的RFID射频模块信息以及按键信息的数据进行处理;
(2)需要一个液晶显示屏,采用液晶显示技术来显示商品的名称信息、价格信息以及对设防状态的显示;
(3)需要一个按键,通过按键可以设置RFID的设防状态,从而控制蜂鸣器是否报警;
(4)需要一个RFID射频模块,通过RFID可以识别有效卡并且判断是否是设防状态并且对有效卡信息进行设置处理;
(5)需要一个蜂鸣器,RFID识别到设防状态的有效卡能够进行报警,来提示工作人员有情况发生。
1.2 总体设计方案选择
随着人民生活质量的提高,越来越多的商品出现在人们的视野当中,与传统的销售方式相比,自由选购能带来更好的经济效益,但是也随之出现商品安全性的问题,一款具有防盗的RFID商品标签[5]可以有效的保证商品的安全性,基于以上的分 析,做出了以下两种设计方案进行对比。
(1)方案一
顾客可以自由选购商品,特定的射频识别防盗卡将会被固定在商品上,前台结账时,工作人员取下特定的防盗卡。顾客就可以结账正常出门,一旦有人携带未结账的商品带离商场时,RFID射频模块检测到,蜂鸣器会发生报警,提醒工作人员有情况发生。
(2)方案二
顾客可以自由选购商品,商品上会固定一个特定的RFID防盗卡,在前台结账时工作人员会将特定的防盗卡取下,顾客就可以结账正常出门,一旦有人携带未结账的商品带离商场时,RFID射频模块检测到,蜂鸣器会发生报警,提醒工作人员有情况发生。增加了一个查看商品基本信息的功能,在顾客到前台结账,前台工作人员取下RFID标签卡的同时也可以通过RFID标签查看商品基本信息,包括商品名称以及价格,方便了工作人员的工作。
方案一中可以自由选购商品,方便了顾客消费,同时也方便了在安全岗位的工作人员。而方案二中集合了方案一中的所有功能,同时增加了一个功能,前台工作人员能够通过RFID标签查看商品的基本信息,方便了查找商品信息以及结账操作,给前台工作人员减轻负担,实用性功能更加齐全。
对比之下,方案二更具有易操作性、维护性、安全性和实用性,更符合我们的实际需求。因此,本设计的总体设计方案选择方案二。
1.3 总体控制方案选择
本设计适合应用在各种各样的大型商场,所以用到的接口以及编程算法会比较多,实现单片机进行控制。目前符合要求并常用的解决方案有以下几种。
(1)方案一
采用CPLD作为本设计的主控制器,它可以完成各种复杂的功能,是大型集成电路的一部分,具有高密度、低体积、高稳定性等优点,具有丰富的I/O资源,同时也在扩展功能方面有很大的优势。比较适合做大规模的控制系统的核心,因为其运用的是并行的输入输出方式,系统进行处理的速度得到大幅度提升。但本设计功能的实现并不是十分复杂,但是它的成本要求比较高,所以放弃了方案一。
(2)方案二
采用单片机STC89C52作为主控芯片。本设计可选取的单片机STC89C51与STC89C52两种,结合设计要求需要该单片机具有数据处理功能的CPU、随机存储器RAM、只读存储器ROM、多个I/O口和中断系统、定时器/计数器等功能,STC89C52与STC89C51相比,更具有优势。而且STC89C52多了一个定时器2,在串行通信中可以设置更高的波特率[6]。可以说STC89C52是STC89C51的增强型,综合考虑本设计的实际需求,由此可以选择STC89C52作为主控芯片。
(3)方案三
采用MSP430单片机进行控制。从美国市场推出之后,这才被慢慢应用。它是一个16位寄存器,相当于一个信号处理器,它可以通过将模拟电路、数字电路集成在一个芯片来解决混合信号处理的问题,而且还有其他优点,比如它的可靠性比较高,功率的损耗比较低,扩展多样灵活等等优势,但是其价格比较昂贵,成本比较高[7],所以舍弃了这一方案。
综上所述进行对比,采用STC89C52单片机作为主控制器,它不仅是一种可靠并且耗能较低的单片机芯片,同时成本也比其它方案更低,所以最后选择方案二。
1.4 系统总体设计
通过对总体设计中方案二的进一步研究,确定本设计具备以下功能:
(1)商品在实际出售的时候会给商品佩戴RFID防盗标签,此项目是通过两个RFID钥匙扣来进行实验[8];
(2)顾客结账时,前台扫描RFID来获取商品的价格信息,将信息显示在LCD1602液晶显示屏上,然后将信号传输到单片机,与写入单片机的有效卡进行比对,第一行显示商品的名称信息,第二行显示商品的价格信息;
(3)如果顾客没有结账就将商品带出商场,若匹配到处于设防状态的有效卡则蜂鸣器报警,说明安全出口有未进行结账的物品,保证了商品的安全性;
(4)只有写入单片机系统的卡才有效,其他卡单片机系统不会识别。
为了实现上述功能,设定本设计共由六部分组成,分别为电源电路、STC89C52单片机核心电路、RFID射频模块电路、LCD1602液晶显示电路、蜂鸣器报警电路和按键电路。
(1)STC89 C52单片机核心电路:通过程序的编写实现有效卡的设置,设防状态的设置、液晶显示屏对商品信息和设防状态的显示以及RFID对有效卡的识别。
(2)电源电路:用5V电压供给用电设备提供电力供应;
(3)RFID射频模块电路:进行读取操作,识别有效卡,读取对应商品信息以及状态;
(4) LCD1602液晶显示电路:当RFID卡刷到有效卡时,会在液晶显示屏上显示对应的商品名称以及价格信息;
(5)蜂鸣器报警电路:当有顾客将未结账的商品带离商场时起到报警提示作用;
(6)按键 电路:当按键按下,液晶显示屏出现“SF”字样时,代表开启设防模式,否则反之。
本系统结构框图如图1.1所示。

图1.1系统结构框图
电源通电后,STC89C52单片机通过采集感应到的RFID射频模块信息以及按键信息的数据进行处理,经转换后输出给LCD1602液晶显示电路和蜂鸣器报警电路,从而完成该系统的运行[9]。

2 项目硬件设计

2.1 单片机控制设计
2.1.1 主控芯片
本设计使用STC89C52单片机作为主控芯片,该单片机的CPU处理器十分的高效,随机存储器RAM、只读存储器ROM容量大,而且具有多个I/O口供使用,同时内部包含了中断系统、定时器/计数器等功能[10]。主要参数表2.1所示。
表2.1 STC89C52单片机主要参数表

参数名称 参数说明
工作电压 5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机)
工作频率 0~40MHz,实际工作 频率可达48MHz
工作温度 -40~+85℃(工业级)/0~75℃(商业级)
定时器/计数器 共3个16 位,即定时器T0、T1、T2
应用程序空间 8K字节
数据存储空间 512 字节RAM
EEPROM存储空间 内带4K字节
STC89C52单片机外部有32个I/O端口可供用户使用,在本设计当中使用了11个引脚来连接LCD1602液晶显示屏模块,需要1个引脚来连接蜂鸣器模块,需要1个引脚来连接按键模块,需要5个引脚来连接RFID模块。单片机引脚如图2.1所示。

图2.1 STC89C52单片机引脚图

2.2.4 单片机控制电路整体设计
STC89C52单片机最小系统由STC89C52芯片、时钟晶振电路、复位电路组成。这三部分电路缺一不可,只有都具备单片机才可以正常工作[12]。单片机最小系统原理图如图2.4所示。

图2.4 单片机最小系统原理图

原理图

3 项目软件设计

3.1 软件开发环境
本设计中单片机开发环境是Keil4,它能够处理单片机的编译、调试等其他集成环境。它的优点有很多,它的内置环境对数据的处理编译机制十分的高效,所以这样不仅节省了开发的时间,还提高了开发效率。Keil4的开发界面也是十分的简洁,很容易上手,选择的编程语言是C语言,而且C语言开发效率很高,这样对于使用C语言来编程开发的使用者都是十分友好的[19]。
Keil4软件开发流程:首先需要建立一个新的项目,选择使用的单片机类型,可以编写一个新的文件,当工程建立完毕后,可以往里面添加.c文件,点击Add就可以将该文件添加到项目当中了,接下来就可以编译程序了。编写完程序后进行编译,编译就是检测程序是否有错误和警告,警告不会影响程序的运行。在编译程序之后,生成.HEX文件。将十六进制文件刻录并写入到单片机当中。具体开发流程如图3.1所示。

图3.1 Keil4软件开发流程图
3.2 系统总体工作流程
首先,要先考虑识别的RFID卡是无效卡还是有效卡,无效卡RFID不会识别,而有效卡是写入单片机系统的卡,只有有效卡才能做接下来的一系列操作。
当检测到有效卡之后如果想要设置设防状态,按下按键,LCD1602液晶显示屏上出现“SF”字样时,说明开启设防模式,LCD1602液晶显示屏同时显示商品的名称以及价格信息,蜂鸣器报警。如果未设置设防状态,那么LCD1602液晶显示屏只显示商品的名称以及价格信息。系统程序总体流程图如图3.2所示。

图3.2 系统程序总体流程图
3.3 射频识别系统子程序工作流程
本系统选择MFRC522射频模块进行刷卡操作。将有效卡信息写入单片机内,当按下按键时,将卡设置成设防状态,RFID识别到有效卡,蜂鸣器会发生报警,说明设防成功,并且与此同时液晶显示屏显示商品的名称以及价格信息,如果识别到无效卡,则什么也不发生。射频识别系统子程序流程图如图3.3所示。

图3.3 射频识别系统子程序总体流程图
3.4 显示系统子程序工作流程
本设计通过LCD1602液晶显示屏来显示信息,输入信息和数据通过LCD1602型号的液晶装置显示出来。它主要显示对商品查看设防状态以及商品的基本信息的显示。当RFID识别到有效卡,LCD1602液晶会显示对应的信息以及设防状态。显示系统子程序流程图如图3.4所示。

图3.4 显示系统子程序总体流程图














**源程序代码**

(1)main.c文件:
#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <stdio.h>
#include <intrins.h>
#include "delay.h"
#include "rc522.h"
#include "1602.h"

sbit buzzer =P1^0;	//引脚定义
sbit key = P1^1;

/********************/
unsigned char code cardTab[4]={0x07,0xF5,0x60,0x27};	 //此处修改有效卡ID号
/********************/

unsigned char UID[5];	 //暂存卡号
unsigned char Temp[4] ;   //中间变量

unsigned long time_20ms = 0xaaaaaaaa;   //定时计数
char dis0[16];			   //显示数组变量
bit disFlag;			   //显示更新标志
bit rekey = 0;//按键防止重复按下标志
bit setSfFlag = 0;//设防状态
bit buzzerFlag = 0;//触发报警标志
void  Init_Timer0(void);
void  uartSendStr(unsigned char *s,unsigned char length);
void  UART_Init(void);
void  uartSendByte(unsigned char dat);

void  main (void)
{     
	Init_Timer0();        //定时器0初始化
	UART_Init();

	buzzer = 0; //报警	 开
	LCD_Init();           //初始化液晶
	DelayMs(100);          //延时有助于稳定
	LCD_Clear(); 
	buzzer = 1; //报警	 关
	LCD_Write_String(0,0,"My Designer !");//显示第一行

	uartSendStr("ready ok!",9);
	PcdReset();//复位RC522
	PcdAntennaOn();//开启天线发射 
				
	LCD_Write_String(0,0,"WP:xxxxxxx   ");//显示
	LCD_Write_String(0,1,"DJ:xxx       ");//显示
	LCD_Write_Char(6,1,0x5c);//显示
		
	while (1)         //主循环
	{
	 	if(PcdRequest(0x52,Temp)==MI_OK)
	    {
	      if(PcdAnticoll(UID)==MI_OK)
	      { 
		        	uartSendByte(0x00);
			        uartSendStr(UID,4);//上报卡号	
			        uartSendByte(0x00);
			          if((UID[0]==cardTab[0])&&(UID[1]==cardTab[1])&&(UID[2]==cardTab[2])) //确定卡 通过
							            {
				              LCD_Write_String(0,0,"WP:PingGuo   ");//显示
				              LCD_Write_String(0,1,"DJ:5.3    ");//显示				
				              LCD_Write_Char(6,1,0x5c);//显示
				              if(setSfFlag == 1)//设防状态下
				                {buzzerFlag = 1;}  //触发标志
			              }   
	            }
	         }

		         if(key==0) //检测到按键按下
		         {
		 	           if(rekey == 0)//防止重复按下
			              {
				                 	DelayMs(20); 
				                 if(key==0)//确认按键按下
				                 {
					                   rekey =1;
					                   setSfFlag = !setSfFlag;//设防状态
				                 }			
			              }
		          }
		          else
		          {rekey =0 ;}	//防止重复按下

		         if(disFlag == 1)	 //定时更新显示
		         {
			            disFlag = 0;   //清除标志
			            if(setSfFlag == 1)//设防情况下
			              {
			                 	LCD_Write_String(10,1," SF");//显示 
			              }
			              else
			              {
				                 LCD_Write_String(10,1,"   ");//显示
			              }
			              if(buzzerFlag == 1)//触发报警标志
			              {
				                 buzzer = !buzzer; //报警
			              }
		         }
	      }
}

void  Init_Timer0(void)
{
	   TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	   TH0=(65536-20000)/256;		  //重新赋值 20ms
	   TL0=(65536-20000)%256;
	   EA=1;            //总中断打开
	   ET0=1;           //定时器中断打开
	   TR0=1;           //定时器开关打开
}

void  Timer0_isr(void) interrupt 1 
{
	   TH0=(65536-20000)/256;		  //重新赋值 20ms
	   TL0=(65536-20000)%256;	
	   time_20ms++;
	   if(time_20ms%10==0)		   //定时显示
	   {disFlag =1;}
}

void  UART_Init(void)
{
   SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
   TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
   TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
	   TL1 = TH1;  
   TR1   = 1;                  // TR1:  timer 1 打开                         
   EA    = 1;                  //打开总中断
   ES    = 1;                  //打开串口中断
}

void  uartSendByte(unsigned char dat)
{
unsigned char time_out;
	   time_out=0x00;
	   SBUF = dat;			  //将数据放入SBUF中
	   while((!TI)&&(time_out<100))  //检测是否发送出去
	   {time_out++;DelayUs2x(10);}	//未发送出去 进行短暂延时
	   TI = 0;						//清除ti标志
}

void  uartSendStr(unsigned char *s,unsigned char length)
{
	   unsigned char NUM;
	   NUM=0x00;
	   while(NUM<length)	//发送长度对比
	   {
		      uartSendByte(*s);  //放松单字节数据
		      s++;		  //指针++
		      NUM++;		  //下一个++
  	 }
}

void  UART_SER (void) interrupt 4 	//串行中断服务程序
{
	   if(RI)                        //判断是接收中断产生
	   {
		      RI=0;                      //标志位清零
	   }
	   if(TI)  //如果是发送标志位,清零
	   TI=0;
} 

4 项目焊接与调试

4.1 电路焊接
本次设计使用原始的焊接方法,焊接的成功是项目成功的关键因素之一。如果焊接本质上出现问题,则会影响到整个控制系统,所以在焊接的过程中一定要十分的小心。焊接的步骤如下:
(1)检查元器件:元器件不能有一点损坏,不然会影响整个项目进度,所以在开始焊接之前一定要对所有元器件进行仔细的检查,在检查好每个元器件无损坏后才能够进行安装和焊接,以防出现在焊接完成后因某个元件有损坏而使系统无法正常运行。
(2)放置、焊接各元件:检查好元器件没有任何损坏之后,要根据原理图排好各元器件的位置,元器件的放置顺序高低也是很有讲究,首先放置那些焊接位置比较低的元器件,然后是那些焊接位置比较高的元器件,再就是特别注意的一点就是,要最后再焊接那种易损的元器件。焊接后实物图如图4.1所示。

图4.1 焊接实物图
需要注意的是,补焊锡一定要适量,因为在焊接的过程中总会遇到焊锡不足的问题,焊锡过多可能会导致将两个本不应该相连的两个引脚连在一起。如果真的不小心补过多的焊锡,那也是有办法可以解决的,在工具不是十分齐全的情况下,可以选择用电烙铁带走多余的焊锡,如果工具准备的充分,则可以使用吸锡器除掉多余的焊锡。
4.2 系统调试
在整个系统通电之前,观察焊接是否存在问题。如出现明显断裂,正负极连接、器件连接、焊接不实等问题,可以通过重新焊接或者更换元器件来解决。接着用万用表检测电源正负电压,是否出现严重的电源问题,如短路等。最后确认并保证系统没有问题。
在进行程序调试之前,要配置调试环境以及平台,都准备充分之后,要对系统功能进行检测,检测过程中也会遇到很多问题,可能是环境或者平台配置出现问题,那么可能需要重新进行配置。一般情况下,需要反复进行测试,直到没有问题为止。

当出现“0 Error(s)”说明程序成功,确保没有任何问题之后,就可以将程序代码烧录到单片机当中。同样也需要继续调试,调试到没有问题为止。但在实际调试过程中,会遇到很多问题。常见的错误有定义多个无效的变量、函数未作宣告或未作外部宣告导致不能被其他函数调用、元器件没有正确设置高低电平等等[20]。
4.2.2 硬件调试
焊接好的电路板在上电之前必须得经过调试,以免发生短路烧毁元器件或者因为断路导致的元器件无法工作的情况。
(1)单片机电路调试
单片机是整个系统核心部件。在最初的调试中,出现了调节按键失灵,经过多次调试实验后发现是由于单片机的P1.1引脚脱焊导致的,经过再次焊接后故障问题便消除了。
(2)系统电源供电路调试
在供电接口VCC与GND两端接上电源后,闭合开关,发现系统无供电,用万用表检测USB供电口的引脚发现无电压。将引脚重新焊接后再检测发现电压正常,可以为系统可以正常供电。
(3)LCD1602液晶显示模块电路的调试
在调试上电后发现LCD1602液晶屏幕虽然亮起来,但是发现没有显示出任何字符,后来用螺丝刀调节电位器,发现电位器旋钮位于最左端,此时灰度值最低因此无法显示字符,经过调试向右旋转后发现屏幕可以清晰地显示出字符来。
4.3 实物测试
根据本设计需求,对实物功能进行逐一测试:
(1)打开电源后,电源指示灯长亮,初始化商品信息;
(2)共计有两个测试卡,一个是写入的单片机的有效卡,一个是没有写入单片机的无效卡,进行刷卡测试;
(3)如果RFID刷到有效卡,会在LCD1602液晶显示屏上显示商品的名称以及价格信息,如果刷到无效卡,则LCD1602液晶显示屏不会显示商品信息;
(4)按下设防按键,开启设防模式,测试设防模式的效果;
(5)当LCD1602液晶显示屏显示了“SF”字样时,代表设防模式已开启,否则反之;
(6)如果RFID识别到的是设防状态的有效卡,则蜂鸣器会报警。
所有预设功能均以实现,实物展示图如图4.3所示。

图4.3 实物展示图

结 论

本系统使用STC89C52单片机作为主控制器,采用射频识别技术,通过MFRC522射频识别模块对RFID卡进行识别,与预存卡号进行对比,判断是否是有效卡,只有有效卡才会识别对应的数据信息,通过对有效卡的设防状态的设置,进而控制蜂鸣器报警,同时采用液晶显示技术,通过该技术将所需的信息显示在液晶显示屏上。
本设计由电源电路、STC89C52单片机核心电路、RFID射频模块电路、LCD1602液晶显示电路、蜂鸣器报警电路和按键电路组成。本文对商品防盗系统做出了详细的报告,其中包括硬件部分与软件部分两大模块,而且对其中各个重要子模块都增加了详细的说明。
本设计的主要实现功能是:本设计共计有两种卡,一种是无效卡,一种是有效卡,有效卡是录入单片机系统内的卡,RFID只会识别有效卡。当RFID识别到无效卡,不会有任何的反应,如果匹配到有效卡,当按下设防按键时,开启了设防模式,单片机接收设置信息,在设防的同时还增加一个显示商品基本信息的功能,在检测商品是否设防状态时,前台工作人员也可以通过有效卡识别商品对应的名称以及价格信息并将其在显示屏上显示出来。液晶屏第一行开头字段“WP”对应显示商品的名称信息,第二行开头字段“DJ”后边对应显示识别到的商品的价格信息。如果没有按下按键,那么说明没有设置设防状态,则LCD1602液晶显示屏只显示商品的名称以及价格信息,蜂鸣器也不会报警。本设计完美的实现了预期的功能,在节约能源的同时大幅度提升了商品的安全性,也减少了工作人员的工作量,提高了商场人员的工作效率。
经实验表明,本系统工作可靠、稳定、实用性强。本设计的系统可以更好的为商品的安全提供可靠的保障,相信在不久的将来,一定会广泛应用于越来越多的社会环境中,因此有着广阔的应用前景。

作者:qq_1039692211

物联沃分享整理
物联沃-IOTWORD物联网 » 基于单片机的商品RFID射频安全防盗报警系统设计

发表回复