基于51单片机的RFID智能门禁系统

1.概述
(1)本设计采用STC89C52作为主控芯片,专用读卡器模块用来读射频卡的信息,当有卡进入到读卡器读卡的范围内时就会读取到相应的卡序列号,并根据得到的卡序列号做出相应的操作。若正确则开门,若不正确则报警并显示错误信息。
(2)本设计实现了自动、准确的识别卡序列号,对门禁系统起着重要的作用EEPROM采用AT24C04芯片,掉电后可以存储密码,从而保证了系统的安全性。人机交互通道部分采用了4×4矩阵键盘输入以及LCD12864标准字符型液晶显示。针对于用按键输入密码,根据密码的正确与否来进行相应的操作,管理员可以自行设定和修改密码;输出系统部分包括驱动开锁电路和报警电路;其中,在本系统设计中,驱动开锁电路用发光二极管表示,而报警电路则使用蜂鸣器。

2.硬件设计
本次设计的硬件电路是由STC89C52 单片机为控制核心,射频卡信息由MFRC522模块读出,通过MCU在LCD12864上显示,通过按键完成密码验证和修改密码的功能,并根据输入密码的对错,执行相应继电器的动作和蜂鸣器的状态,整个门禁系统框图如图3-1所示。
基于51单片机的RFID智能门禁系统_第1张图片
(1) RFID射频模块电路
a.射频识别识别系统原理
典型RFID系统由应答器(Tag)、读写器(Read and Write Device)以及计算机系统等组成。

  1. 读写器由无线收发模块、天线、控制模块及接口电路等组成
  2. 应答器也称电子标签,它具有可存储读写信息及对信息进行加密的能力,是射频识别系统主要的核心
  3. 计算机系统是以单片机或微处理器为数据处理核心,主要是对读取到电子标签进行相关的信息管理。

在阅读器的感应范围之外,电子标签无源无法工作,只有在阅读器感应范围之内,电子标签才是有源的。应答器工作所需的能量,是通过读写器的耦合单元传输给应答器的。应答器如果是无源系统,即应答器内不含电池,则应答器工作的能量是由读写器发出的射频脉冲提供[8]。应答器如果是有源系统,即应答器内含有电池,则应答器工作能量和工作寿命有电池决定。RFID射频系统结构图如图:
基于51单片机的RFID智能门禁系统_第2张图片

实用RFID系统为无源系统,即射频卡能量由读写器发出的射频脉冲信号提供。无源系统的通信优劣取决于读写器发出的脉冲信号能否被射频卡完整接受。当射频卡进入读卡器接受范围后,如果接收到读卡器发出的射频信号,就能凭借产生的感应电流所获得的能量发送出存储在卡片中的信息,通过读卡器的处理,将信息送至信息管理系统进行有关数据处理。

b.MFRC522射频模块
MFRC522是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员,是NXP公司推出的一款非接触式读写卡芯片。MFRC522利用了先进的调制和解调的技术,完全集成了在13.56MHz下所有类型的通信协议,支持多种工作在13.56MHz下的射频卡读写操作 。其内部发送器部分可驱动读写器天线与射频卡和应答机的通信,无需其它的电路。模块的控制接口采用了标准SPI通讯接口,由于MFRC522射频模块采用3.3V供电电源,所以需利用LDO稳压电路将5V转换为3.3V,模块电路连接图如图:
基于51单片机的RFID智能门禁系统_第3张图片
(2)LCD12864显示屏电路
LCD12864显示屏电路主要采用了数据并行的控制方式(PSB接地为串行模式,PSB接电源为并行模式),同时使用了可调电位器实现显示屏背光的调节,电路如图:
基于51单片机的RFID智能门禁系统_第4张图片
(3)EEPROM存储电路
为了实现用户密码和RFID卡信息的存储,本设计采用EEPROM存储芯片AT24C02,其内部集成了256个8位字节共2K bit的储存空间,并采用了IIC总线接口进行操作,具有一个专门的写保护功能。电路如图:
基于51单片机的RFID智能门禁系统_第5张图片
由于其他电路相对简单,在此不做介绍了。

(4)总体硬件电路图
基于51单片机的RFID智能门禁系统_第6张图片
3.软件设计
本设计的软件主要采用状态机的原理对整体功能实现进行编程,主要实现四个操作:

  1. 按键输入功能获取
  2. 显示屏操作刷新及切换
  3. RFID标签信息获取及处理
  4. 用户密码输入及对比

(1)主函数

void main(void)	  //主函数
{	
	INT8U key;

    Delay_ms(50); //让硬件稳定
	init_all();	   //执行初始化函数
	relay_OFF();   //关继电器
	LED_BLINK_1(); //led test
	beep1();	   //beep test 	
    display(0,0,0);	 //显示初始化

	while(1)
	{
	   key=key_scan(); //按键操作
	   if(key==12)  
			 if(states>0) 
				 states--;
	     else 
				 states=0;	//上一功能
	   if(key==13) 
			 if(++states>3) 
				 states=3;	//下一功能
	   ctrl_process(); //进入RC522操作
	}
}

(2)状态机处理程序

void ctrl_process( void )
{		  
   INT8U i,key_count,key_value=16,table[8]="--------",statesbuf;	
	
	if(states!=statesbuf)  //状态改变,清屏
	{
	  	display_clear_line(2);
	    display_clear_line(3);
		statesbuf=states;
	}
    switch(states)
	{
       case 0:	          //IC卡读卡输入
		  	  display(1,0,1); 
		      if(IC_READ()) 
			  {
			   
                if ((Card_SN[0]==Card_SN_BUF[0])
			      &&(Card_SN[1]==Card_SN_BUF[1])
				  &&(Card_SN[2]==Card_SN_BUF[2])
				  &&(Card_SN[3]==Card_SN_BUF[3]))
				  {
					relay_ON();//灯开关
					display(2,0,5);
				
			      }
				  else 	 display(2,0,6);
				    relay_OFF();
			   }
			
			  break;

        case 1:		
		       display(1,0,2);    //密码输入
			   display2(3,0,table,8);
			   key_count=0;
               while(1)
			   {  
			      key_value=key_scan();	  
				  if(key_value==12) 
				   { 
				     states--;
	                 return;
					}

				  if(key_value==13)
				  {
				   states++;
				   return;
				  }				 
				  if(key_value>=0 && key_value <=9)//有按键输入
				  {		  				    				    
					table[key_count++]=key_value+'0';
					display2(3,0,table,8);			
				  }
				  
				  if(key_value==11)//退格
				  {								    
					table[--key_count]='-';
					display2(3,0,table,8); 				
				  }

				  if(key_count==8)
				  {
				     if( table[0]==KEY_BUF[0] &&
					     table[1]==KEY_BUF[1] &&
					 	 table[2]==KEY_BUF[2] &&
						 table[3]==KEY_BUF[3] &&
						 table[4]==KEY_BUF[4] &&
						 table[5]==KEY_BUF[5] &&
						 table[6]==KEY_BUF[6] &&
						 table[7]==KEY_BUF[7] )	  //密吗正确 
				
				     { 
					   bPass=1;
					   relay_ON();//灯开关
                       display(2,0,5);
					   relay_OFF();
					   break;				  
					
					 }
					  else 	 //密码错误
					  {	
					    relay_OFF();
						beep1()	 ;
						bWarn=1;
					    display(2,0,6);
						 break;
					 }	  				
				  }

			   }
		       break ;
		  
		 case 2:		
		       display(1,0,3);      //IC卡登记
	           if(IC_READ())  
			   {
					 
			    for(i=0;i<4;i++)
			    Card_SN_BUF[i] = Card_SN[i];

				EEPROM_WRITE(0,Card_SN,4);//写入EEPROM
			   }
		       break ;

		 case 3:		
		       display(1,0,4);      //密码设置
			   display2(3,0,table,8);
			   key_count=0;
			   while(1)
			   {  
			      key_value=key_scan();	  
				  if(key_value==12) 
				   { 
				     states--;
	                 return;
					}
			 
			      if(key_value>=0 && key_value <=9)//有按键输入
				  {		  				    				    
					table[key_count++]=key_value+'0';
					display2(3,0,table,8);			
				  }
				  
				  if(key_value==11)//退格
				  {								    
					table[--key_count]='-';
					display2(3,0,table,8); 				
				  }

				   if(key_count==8 && key_value == 15) //按下确定键
				  
				  { 
				  
				    for(i=0;i<8;i++)
				     KEY_BUF[i]=table[i];	
				   	 EEPROM_WRITE(7,KEY_BUF,8);//写入EEPROM
				 
				   break;
				   }
                } 			 
				
		       break ;

		default : break;

	 }	  		

	if( bPass )		 //处理成功
	{
		bPass = 0;
		pass();	
	
	}

	if( bWarn )	     //处理失败
	{
		bWarn = 0;
		warn();
	}

}

源码+AD原理图 下载:关注公众号,首页回复“智能门禁系统”获取资料
在这里插入图片描述

你可能感兴趣的:(单片机应用)