基於MSP430與RC522的RFID簡單應用(1)

1.

在學習了MSP430與RFID相關知識後,使用MSP430集成板與RC522識別模塊製作門禁系統和公交卡充值扣費系統
實驗器材:MSP430集成板,12864液晶顯示屏,RCC522識別模塊,M1卡一張,藍色識別牌牌一個。
在這裏插入圖片描述
將 RFID 模塊與 MSP430F149 最小系統板採用杜邦線連接;
RC522 接口 MSP430F149 接口
SDA(數據接口) P2.7
SCK(時鐘接口) P2.6
MOSI(SPI 接口主出從入) P2.5
MISO(SPI 接口主入從出) P2.1
NC(懸空)
GND(地) GND
RST(復位信號) P2.3
3.3V(電源) 3.3V

注意:下載程序時候
(此時跳線帽連接方式爲:
TCK and RTS RESET and DTR
P11 and RXD P22 and TXD)
串口通信時候
(此時跳線帽連接方式爲:
TXD0 and RXD RXD0 and TXD)

(如果 MSPFET 提示以下錯誤對應解決方法爲:
Init failed. Could not open port.——————檢查是否打開單片機的開關、USB
接口是否連接鬆動和 COM 口是否設置正確。
Erase failed. Synchronization error. ——————檢查跳線帽是否連接正確、跳
線帽是否鬆動,最後選擇更換跳線帽,可能跳線帽損壞 )

掌握IAR開發軟件的操作與使用
在這裏插入圖片描述
簡單的識別卡及串口通信功能實現
程序源碼
main.c文件
尋卡—防衝撞—選擇卡片—密碼認證—讀卡”這一函數調用過程。

//===========================================================================//

#include "msp430x14x.h"
#include "PIN_DEF.H"
#include "RC522.H"
#include "UART0_Func.c"
#include "ctype.h" 
#include "BoardConfig.h"
#include "Config.h"

unsigned char writeData[16]={1, 2, 3, 4, 0};
unsigned char str[16];
unsigned char UID[4],Temp[4]                                       ;
unsigned char RF_Buffer[18]                                        ;
unsigned char Password_Buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}   ; // Mifare One 缺省密碼

char          MBRX[30]                                             ;
char          MBKeyTP[30]                                          ;
char          Event                                                ;
unsigned char DISP_MODE,i                                            ; // 編輯控件顯示模式
unsigned char des_on       = 0                                     ; // DES加密標誌
void Key_TP_Task(void)                                             ;

void Port_Init()
{
  LED8DIR = 0xff;                  //設置IO口方向爲輸出
  LED8 = 0x00;                     //初始設置爲00
}
//***************************************************************************//
//                                                                           //
//                 初始化主時鐘: MCLK = XT1×(FLL_FACTOR+1)                  //
//                                                                           //
//***************************************************************************//
void Init_CLK(void)
{
  unsigned int qq;
  WDTCTL     = WDTPW + WDTHOLD                                     ; // 關看門狗
  BCSCTL1 &= ~XT2OFF;           //打開XT2高速晶體振盪器  
  do
  {
    IFG1 &= ~OFIFG;           //Clear oscFault flag清除振盪器失效標誌
    for(qq=0xff;qq>0;qq--);
  }while((IFG1&OFIFG));       //oscFault flag still set
  
  BCSCTL2 |= SELM_2;          //MCLK=XT2
  //BCSCTL2 |= DIVM_0;        //控制MCLK不分頻,默認
  
  BCSCTL2 |= SELS;            //SMCLK=XT2
  //BCSCTL2 |= DIVS_0;        //控制SMCLK不分頻,默認
}

void Delay(unsigned int time)
{
  unsigned int i,k                             ;
  for(i=0;i<255;i++)
    for(k=0;k<time;k++)
      _NOP()                                   ;	  
}

void Auto_Reader(void)
{
  while(1)
  {
    if(PcdRequest(0x52,Temp)==MI_OK)//MI_OK=0  尋卡  0x52 = 尋感應區內所有符合14443A標準的卡  Temp返回卡片的類型
    {
      if(Temp[0]==0x04&&Temp[1]==0x00)  
          PutString("MFOne-S50");//卡片的類型爲MFOne-S50   目前手上買的爲此型號
        else if(Temp[0]==0x02&&Temp[1]==0x00)
          PutString("MFOne-S70");
        else if(Temp[0]==0x44&&Temp[1]==0x00)
          PutString("MF-UltraLight");
        else if(Temp[0]==0x08&&Temp[1]==0x00)
          PutString("MF-Pro");
        else if(Temp[0]==0x44&&Temp[1]==0x03)
          PutString("MF Desire");
        else
          PutString("Unknown");
      if(PcdAnticoll(UID)==MI_OK)//獲得卡片序列號UID
      { 
        PutString0("Card Id is:");
        tochar(UID[0]);
        tochar(UID[1]);
        tochar(UID[2]);
        tochar(UID[3]);
        while (!(IFG1 & UTXIFG0));
        TXBUF0 = '\n';                              //發送換行指令
                        
        RED_LED_ON                                            ;
        Delay(200)                                           ;
        RED_LED_OFF                                           ;
        Delay(200)                                           ;
      }
    }
  else GRE_LED_OFF                                            ;
  } 
}

void Find_Card(void)
{
    if(PcdRequest(0x52,Temp)==MI_OK)
    {
      if(Temp[0]==0x04&&Temp[1]==0x00)  
          PutString("MFOne-S50");
        else if(Temp[0]==0x02&&Temp[1]==0x00)
          PutString("MFOne-S70");
        else if(Temp[0]==0x44&&Temp[1]==0x00)
          PutString("MF-UltraLight");
        else if(Temp[0]==0x08&&Temp[1]==0x00)
          PutString("MF-Pro");
        else if(Temp[0]==0x44&&Temp[1]==0x03)
          PutString("MF Desire");
        else
          PutString("Unknown");
        PutString("SUCCESS!");
    }
    else PutString("Faile!");                                             
}

void Init_Port(void)
{
  P4DIR   =   RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT                     ;
  P2DIR |= BIT0+RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT;
  P1DIR   =   RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT                     ;
}
/*******************************************
函數名稱:HandleConfigMenu
功    能:處理PC的配置函數
參    數:inputvalue--接收到的來自PC機的字符
返回值  :無
********************************************/
void HandleConfigMenu(uchar inputvalue)
{
    switch(toupper(inputvalue)) 
    {
    case 'A':
              Auto_Reader();
              break;
    case 'F':
              Find_Card();
              break;
    default:
              DisplayConfigMenu();  
    }
}


void main( void )
{
  WDTCTL     = WDTPW + WDTHOLD                                     ; // 關看門狗
  int i;
  unsigned char status2;
  BoardConfig(0xf0);
  Init_Port();
  InitUART();
  _EINT()                                            ;
  PcdReset();//復位RC522
  PcdAntennaOn();//開啓天線發射 
  WDT_Init();
  Clock_Init();                       //時鐘初始化
  Port_Init(); 
    //DisplayConfigMenu();
  while(1)
  {

   
    status2=PcdRequest(0x52,Temp);////尋卡,輸出爲卡類型
    if(status2==MI_OK) 
      status2 = PcdAnticoll(UID);  //防衝撞處理,輸出卡片序列號,4字節 
    if(status2==MI_OK) 
    {
        PutString0("Card Id is:");
        tochar(UID[0]);
        tochar(UID[1]);
        tochar(UID[2]);
        tochar(UID[3]);    //串口輸出卡號
    }
    status2 = PcdSelect(UID);    //選擇卡片,輸入卡片序列號,4字節 
    if(status2==MI_OK)   
      status2 = PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);//在進行讀寫操作之前需要先進行認證
    if(status2==MI_OK)
    {
    LED8=0x00;                        //點亮LED
    delay_ms(5000);
    LED8=0xff;                        //熄滅LED
    delay_ms(500);
      
    }

    }
  }

``
在串口發送區,輸入 A 點擊發送,爲自動尋卡模式;若輸入
F 點擊發送則爲單次尋卡模式;
將卡片放到讀卡模塊上,則可以看到讀出卡的 ID 號。
在這裏插入圖片描述
完成以上測試後即可修改程序實現門禁效果
具體的LED和12864屏幕顯示程序再次不再羅列
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

門禁卡功能實現
實驗目的

  1. 在 RC522 芯片刷 M1 卡之後,能夠實現控制 LED 燈亮。(燈亮方式不限)
  2. 在 RC522 芯片刷 M1 卡之後,能夠實現控制 12864LCD 液晶屏顯示文字。
    在這裏插入圖片描述
    想要實現門禁卡的刷卡功能,只要按順序滿足“尋卡—防衝突—選擇卡片—驗證
    卡片密碼—控制燈亮”,不需要對卡片進行讀或者寫的操作。 還需要附加使用的兩個功能:控制 LED 燈亮和控制 LCD 屏幕輸出文字的函數。這兩個函數的書寫都可以在前面提及的“/msp430/1.軟件平臺安裝”文件夾下
    “DM430-L 測試示例源程序”中找到可以仿寫的程序。這裏仿寫的是 led 程序
    是流水燈程序,lcd 程序是 12864 的顯示程序。
    main.c文件
//===========================================================================//
/********************************************************************
//MSP430F149單片機 + RC522 +M1 
//實現門禁卡功能
//小組郭嘉慶
********************************************************************/
#include "msp430x14x.h"
#include "PIN_DEF.H"
#include "RC522.H"
#include "UART0_Func.c"
#include "ctype.h" 
#include "BoardConfig.h"
#include "lcd.h"
#include "led8run.h"

unsigned char UID[5],Temp[4]                                       ;
unsigned char RF_Buffer[18]                                        ;
unsigned char Password_Buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}   ; // Mifare One 缺省密碼
char          MBRX[30]                                             ;
char          MBKeyTP[30]                                          ;
char          Event                                                ;
unsigned char DISP_MODE,i                                            ; // 編輯控件顯示模式
unsigned char des_on       = 0                                     ; // DES加密標誌
void Key_TP_Task(void)                                             ;

//***************************************************************************//
//                                                                           //
//                 初始化主時鐘: MCLK = XT1×(FLL_FACTOR+1)                  //
//                                                                           //
//***************************************************************************//
void Init_CLK(void)
{
  unsigned int qq;
  WDTCTL     = WDTPW + WDTHOLD                                     ; // 關看門狗
  BCSCTL1 &= ~XT2OFF;           //打開XT2高速晶體振盪器  
  do
  {
    IFG1 &= ~OFIFG;           //Clear oscFault flag清除振盪器失效標誌
    for(qq=0xff;qq>0;qq--);
  }while((IFG1&OFIFG));       //oscFault flag still set
  
  BCSCTL2 |= SELM_2;          //MCLK=XT2
  //BCSCTL2 |= DIVM_0;        //控制MCLK不分頻,默認
  
  BCSCTL2 |= SELS;            //SMCLK=XT2
  //BCSCTL2 |= DIVS_0;        //控制SMCLK不分頻,默認
}

void Delay(unsigned int time)
{
  unsigned int i,k                             ;
  for(i=0;i<255;i++)
    for(k=0;k<time;k++)
      _NOP()                                   ;	  
}

void Init_Port(void)
{
  P4DIR   =   RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT                     ;
  P2DIR |= BIT0+RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT;
  P1DIR   =   RF_LPCTL + RF_SS   + RF_SCLK  + RF_DATA_OUT                     ;
}

void main( void )
{
  unsigned char status;
  WDTCTL     = WDTPW + WDTHOLD                                     ; // 關看門狗
  BoardConfig(0xf0);
  Init_Port();
  InitUART();
  _EINT()                                            ;
loop:lcd_welcome();
  PcdReset();//復位RC522
  PcdAntennaOn();//開啓天線發射 
  while(1)
  {
    status = PcdRequest(PICC_REQALL, Temp); ////尋卡,輸出爲卡類型
    if (status == MI_OK)
      status = PcdAnticoll(UID); //防衝撞處理,輸出卡片序列號,4字節
    if (status == MI_OK)
      status = PcdSelect(UID); //選擇卡片,輸入卡片序列號,4字節
    if (status == MI_OK)
      status = PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID); //在進行讀寫操作之前需要先進行認
    if (status == MI_OK)
    {
      led_run();
      lcd_success();
      Delay(3000);
      goto loop;
    }
 
  }
  }

lcd.h文件

/********************************************************************
//DM430-L型系統板控制帶字庫型12864液晶模塊顯示測試程序,顯示漢字字符
//顯示模式爲漢字模式,直接將12864插入12864接口即可,朝外,液晶接口位於主板上方
//請注意安裝位置,左邊有字符說明,爲靠近1602接口的1X20座子
//注意選擇液晶的電源,位於電位器附近,可選5V或3.3V,根據液晶電壓進行選擇,默認5V
//調試環境:IAR + MSP430F149 +RC522
********************************************************************/
#include <msp430x14x.h>
#include "Config.h"

//*************************************************************************
//			初始化IO口子程序
//*************************************************************************
void Port_Init_lcd()
{
  P4SEL = 0x00;
  P4DIR = 0xFF;
  P5SEL = 0x00;
  P5DIR|= BIT0 + BIT1 + BIT5 + BIT6 + BIT7;
  PSB_SET;		  //液晶並口方式
  RST_SET;		  //復位腳RST置高
}

//***********************************************************************
//	顯示屏命令寫入函數
//***********************************************************************
void LCD_write_com(unsigned char com) 
{	
  RS_CLR;
  RW_CLR;
  EN_SET;
  DataPort = com;
  delay_ms(5);
  EN_CLR;
}

//***********************************************************************
//	顯示屏數據寫入函數
//***********************************************************************
void LCD_write_data(unsigned char data) 
{
  RS_SET;
  RW_CLR;
  EN_SET;
  DataPort = data;
  delay_ms(5);
  EN_CLR;
}

//***********************************************************************
//	顯示屏清空顯示
//***********************************************************************

void LCD_clear(void) 
{
  LCD_write_com(0x01);
  delay_ms(5);
}

//***********************************************************************
//函數名稱:DisplayCgrom(uchar hz)顯示CGROM裏的漢字
//***********************************************************************
void DisplayCgrom(uchar addr,uchar *hz)
{
  LCD_write_com(addr);
  delay_ms(5);
  while(*hz != '\0')  
  {
    LCD_write_data(*hz);
    hz++;
    delay_ms(5);
  }

} 
//****************************************************************
//函數名稱:Display_welcome()顯示測試結果
//****************************************************************
void  Display_welcome(void)
{
  DisplayCgrom(0x80,"門禁系統");
  DisplayCgrom(0x88,"郭嘉慶小組");
  DisplayCgrom(0x90,"請刷卡  ");
  DisplayCgrom(0x98,"*********");
}
//****************************************************************
//函數名稱:Display_success()顯示測試結果
//****************************************************************
void  Display_success(void)
{
  DisplayCgrom(0x80,"----恭喜你----");
  DisplayCgrom(0x88,"----刷卡成功----");
  DisplayCgrom(0x90,"----門已打開----");
  DisplayCgrom(0x98,"********");
}

//***********************************************************************
//	顯示屏初始化函數
//***********************************************************************
void LCD_init(void) 
{
  LCD_write_com(FUN_MODE);			//顯示模式設置
  delay_ms(5);
  LCD_write_com(FUN_MODE);			//顯示模式設置
  delay_ms(5);
  LCD_write_com(DISPLAY_ON);			//顯示開
  delay_ms(5);
  LCD_write_com(CLEAR_SCREEN);			//清屏
  delay_ms(5);
}

//***********************************************************************
//      歡迎程序
//***********************************************************************
void lcd_welcome(void)
{
  WDT_Init();                                   //看門狗設置
  Clock_Init();                                 //系統時鐘設置
  Port_Init_lcd();                                  //系統初始化,設置IO口屬性
  delay_ms(100);                                //延時100ms
  LCD_init();                                   //液晶參數初始化設置
  LCD_clear();                                  //清屏
  Display_welcome();                                  //顯示漢字
}

//***********************************************************************
//      刷卡成功程序
//***********************************************************************
void lcd_success(void)
{
  WDT_Init();                                   //看門狗設置
  Clock_Init();                                 //系統時鐘設置
  Port_Init_lcd();                                  //系統初始化,設置IO口屬性
  delay_ms(100);                                //延時100ms
  LCD_init();                                   //液晶參數初始化設置
  LCD_clear();                                  //清屏
  Display_success();                                  //顯示漢字
}

led8run.h文件

********************************************************************
//DM430-L型最小系統板控制8個發光二極管流水顯示測試程序
//發光二極管分別接入P60~P67,灌電流方式,延時函數使用IAR軟件自帶函數
//調試環境:IAR + MSP430F149 +RC522

********************************************************************/

//***********************************************************************
//               MSP430IO口初始化
//***********************************************************************
void Port_Init()
{
  LED8DIR = 0xff;                    //設置IO口方向爲輸出
  LED8 = 0xFF;                       //初始設置爲00
}

/********************************************************************
		 LED流水顯示函數
********************************************************************/
void LED_Runing(unsigned char LED_NUM)
{
	switch(LED_NUM)
	{
        case 0:
          LED8 &= ~(1<<0);  //點亮D1燈
          break;
        case 1:
          LED8 &= ~(1<<1);  //點亮D2燈
          break;
        case 2:
          LED8 &= ~(1<<2);  //點亮D3燈
          break;
        case 3:
          LED8 &= ~(1<<3);  //點亮D4燈
          break; 
        case 4:
          LED8 &= ~(1<<4);  //點亮D5燈
          break;
        case 5:
          LED8 &= ~(1<<5);  //點亮D6燈
          break;
        case 6:
          LED8 &= ~(1<<6);  //點亮D7燈
          break;
        case 7:
          LED8 &= ~(1<<7);  //點亮D8燈
          break;				
        default:
          LED8 = 0x00;     //點亮所有的LED燈
          break;
	}
}

//***********************************************************************
//                  燈亮主程序
//***********************************************************************
void led_run(void)
{ 
  unsigned char count=0;
  WDT_Init();                             //看門狗初始化
  Clock_Init();                       //時鐘初始化
  Port_Init();                          //端口初始化,用於控制IO口輸入或輸出
  for(count=0;count<=7;count++)
  {
    LED8 = 0xFF; 
    LED_Runing(count%8);	//點亮一個LED燈		
    delay_ms(200);
  }
}

運行效果:
在這裏插入圖片描述
在這裏插入圖片描述
公交卡充值/扣款功能實現
實驗目的

  1. 最基礎實現刷卡後顯示充值/扣款說明
  2. 實現芯片內部寄存器的讀寫,實現可記憶性

這一步需要仔細閱讀IC卡的內部功能
待續。。。

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