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屏幕顯示程序再次不再羅列
門禁卡功能實現
實驗目的
- 在 RC522 芯片刷 M1 卡之後,能夠實現控制 LED 燈亮。(燈亮方式不限)
- 在 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);
}
}
運行效果:
公交卡充值/扣款功能實現
實驗目的
- 最基礎實現刷卡後顯示充值/扣款說明
- 實現芯片內部寄存器的讀寫,實現可記憶性
這一步需要仔細閱讀IC卡的內部功能
待續。。。