基於51單片機的RFID智能門禁系統

1.概述
(1)本設計採用STC89C52作爲主控芯片,專用讀卡器模塊用來讀射頻卡的信息,當有卡進入到讀卡器讀卡的範圍內時就會讀取到相應的卡序列號,並根據得到的卡序列號做出相應的操作。若正確則開門,若不正確則報警並顯示錯誤信息。
(2)本設計實現了自動、準確的識別卡序列號,對門禁系統起着重要的作用EEPROM採用AT24C04芯片,掉電後可以存儲密碼,從而保證了系統的安全性。人機交互通道部分採用了4×4矩陣鍵盤輸入以及LCD12864標準字符型液晶顯示。針對於用按鍵輸入密碼,根據密碼的正確與否來進行相應的操作,管理員可以自行設定和修改密碼;輸出系統部分包括驅動開鎖電路和報警電路;其中,在本系統設計中,驅動開鎖電路用發光二極管表示,而報警電路則使用蜂鳴器。

2.硬件設計
本次設計的硬件電路是由STC89C52 單片機爲控制核心,射頻卡信息由MFRC522模塊讀出,通過MCU在LCD12864上顯示,通過按鍵完成密碼驗證和修改密碼的功能,並根據輸入密碼的對錯,執行相應繼電器的動作和蜂鳴器的狀態,整個門禁系統框圖如圖3-1所示。
在這裏插入圖片描述
(1) RFID射頻模塊電路
a.射頻識別識別系統原理
典型RFID系統由應答器(Tag)、讀寫器(Read and Write Device)以及計算機系統等組成。

  1. 讀寫器由無線收發模塊、天線、控制模塊及接口電路等組成
  2. 應答器也稱電子標籤,它具有可存儲讀寫信息及對信息進行加密的能力,是射頻識別系統主要的核心
  3. 計算機系統是以單片機或微處理器爲數據處理核心,主要是對讀取到電子標籤進行相關的信息管理。

在閱讀器的感應範圍之外,電子標籤無源無法工作,只有在閱讀器感應範圍之內,電子標籤纔是有源的。應答器工作所需的能量,是通過讀寫器的耦合單元傳輸給應答器的。應答器如果是無源系統,即應答器內不含電池,則應答器工作的能量是由讀寫器發出的射頻脈衝提供[8]。應答器如果是有源系統,即應答器內含有電池,則應答器工作能量和工作壽命有電池決定。RFID射頻系統結構圖如圖:
在這裏插入圖片描述

實用RFID系統爲無源系統,即射頻卡能量由讀寫器發出的射頻脈衝信號提供。無源系統的通信優劣取決於讀寫器發出的脈衝信號能否被射頻卡完整接受。當射頻卡進入讀卡器接受範圍後,如果接收到讀卡器發出的射頻信號,就能憑藉產生的感應電流所獲得的能量發送出存儲在卡片中的信息,通過讀卡器的處理,將信息送至信息管理系統進行有關數據處理。

b.MFRC522射頻模塊
MFRC522是應用於13.56MHz 非接觸式通信中高集成度讀寫卡系列芯片中的一員,是NXP公司推出的一款非接觸式讀寫卡芯片。MFRC522利用了先進的調製和解調的技術,完全集成了在13.56MHz下所有類型的通信協議,支持多種工作在13.56MHz下的射頻卡讀寫操作 。其內部發送器部分可驅動讀寫器天線與射頻卡和應答機的通信,無需其它的電路。模塊的控制接口採用了標準SPI通訊接口,由於MFRC522射頻模塊採用3.3V供電電源,所以需利用LDO穩壓電路將5V轉換爲3.3V,模塊電路連接圖如圖:
在這裏插入圖片描述
(2)LCD12864顯示屏電路
LCD12864顯示屏電路主要採用了數據並行的控制方式(PSB接地爲串行模式,PSB接電源爲並行模式),同時使用了可調電位器實現顯示屏背光的調節,電路如圖:
在這裏插入圖片描述
(3)EEPROM存儲電路
爲了實現用戶密碼和RFID卡信息的存儲,本設計採用EEPROM存儲芯片AT24C02,其內部集成了256個8位字節共2K bit的儲存空間,並採用了IIC總線接口進行操作,具有一個專門的寫保護功能。電路如圖:
在這裏插入圖片描述
由於其他電路相對簡單,在此不做介紹了。

(4)總體硬件電路圖
在這裏插入圖片描述
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原理圖 下載:關注公衆號,首頁回覆“智能門禁系統”獲取資料
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章