标题: msp430f5529 RC522射频卡程序 [打印本页]

作者: wubaqian    时间: 2019-9-3 11:10
标题: msp430f5529 RC522射频卡程序
/*
波特率设置为9600
特别说明:
单片机与PC的通讯:
    PC与单片机的连接:需要一个usb转ttl调试器B,B的RXD接P4.5口,TXD接4.4口,VCC接5v电压,GND接地即可。
    PC端使用的串口调试助手是X—COM,将调试器B连接好单片机。单片机的数据线接到电脑上,编译好程序后,点击CCS上的开始调试。
然后将调试器插入电脑,在X-COM中 设置波特率为9600,停止位1,数据位8,串口选择调试器B的usb接口!(这步很重要)打开串口,即可开始串口调试。
此刻能实现的功能:
1.PC发送除A, F外的字符,单片机发送给电脑菜单信息。
单片机与RC522的通讯:
    SDA p2.2
    SCK P2.7
    MOSI P3.3
    MISO p3.4
    IRQ 不接
    RST p2.3
连接好上述引线后,能实现以下功能:
1.PC发送字符A,读出卡的型号和UID信息。
2.PC发送字符F,单次寻卡模式,接触一次显示一次卡的型号信息。
*/

#include "msp430.h"
#include "PIN_DEF.H"
#include "RC522.H"
#include "UART_Func.h"//串口已修改
#include "ctype.h"

unsigned char UID[5],Temp[4]; /*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)                                             ;
void function1(void)
{
    ;
}


//***************************************************************************//
//                                                                           //
//                 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1)                  //
//                  我自己打的时钟,能成功。
//                                                                           //
//***************************************************************************//
void Init_CLK(void)
{
  P5SEL |= BIT2 + BIT3;//P5.2和P5.3选择XT2晶振功能
  UCSCTL6 &= ~XT2OFF;//使能XT2
  UCSCTL3 |= SELREF_2;//FLL模块的参考时钟源选择REFO
  UCSCTL4 |= SELA_2;
  do
  {
      UCSCTL7 &= ~(XT2OFFG+XT1LFOFFG+DCOFFG);//清除XT2,XT1,DCO故障失效标志位
      SFRIFG1 &= ~OFIFG;//清除晶振故障失效中断标志位
  }while(SFRIFG1&OFIFG);//测试晶振故障失效中断标志位
  UCSCTL6 &= ~XT2DRIVE0;//减少XT2驱动能力,降低功耗
  UCSCTL4 |= SELS_5 + SELM_5;//SMCLK=MCLK=XT2
}

void Delay(unsigned int time)
{
    volatile 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)
        {
            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");
            if(PcdAnticoll(UID)==MI_OK)
            {
                PutString0("Card Id is:");
                tochar(UID[0]);
                tochar(UID[1]);
                tochar(UID[2]);
                tochar(UID[3]);
                while (!(UCA1IFG & UCTXIFG));//等待上一个字符发送完成
                UCA1TXBUF = '\n';                              //发送换行指令
                RED_LED_ON;
                Delay(200);
                RED_LED_OFF;
                Delay(200);//绿灯交替亮灭
            }
            function1();//可以在这里编写一下如何区别使用UID信息的函数。
         }
    else GRE_LED_OFF;
        Delay(100);//延时一端时间
    }
}

void Find_Card(void)
{
    while(1)
    {
        if(PcdRequest(0x52,Temp)==MI_OK)
        {
            RED_LED_OFF;//红灯熄灭
          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!");
            break;//如果满足条件,退出循环
        }
        else PutString("Faile!");
        GRE_LED_OFF;//绿灯熄灭
        Delay(1000);//延时一端时间
    }
}
/*************************
端口初始化
************************/
void Init_Port(void)
{
    P4DIR  |=  BIT7;//P4.7输出,控制led
    P3DIR  |=  BIT3;
    P3DIR  &= ~BIT4;//P3.4设为输入
    P2DIR  |=  BIT2+BIT3+BIT7;
    P1DIR  |=  BIT0;//控制led
}
/*******************************************
函数名称: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; // 关看门狗
  Init_Port();//这里是引脚的配置函数,想要知道怎么连,就看这里
  InitUART();//初始化串口通信
  _EINT();//使能全局中断
  PcdReset();//复位RC522
  PcdAntennaOn();//开启天线发射
  DisplayConfigMenu();//向PC发送菜单信息
  while(1)
  {
        Send1Char('>');
        Send1Char('\n');
        i=Get1Char();//i暂存电脑发来的数据,已验证
        HandleConfigMenu(i);//本函数用于数据分析
  }
}

在此只显示部分内容,更多内容请下载后查看

proj 5529 RC522.zip

180.88 KB, 下载次数: 16, 下载积分: 黑币 -5






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1