www.pudn.com > rfid.rar > main.c, change:2012-04-22,size:5303b


/******************************************************************************* 
 * 文件名称:main.c 
 * 功    能:125kHz RFID演示 
 * 作    者:Ronnie 
 * 公    司:湘潭斯凯电子科技有限公司 
 *           www.sikai-tech.com 
 * 日    期:2011-06-25 
 ******************************************************************************/ 
 
 
/* 包含头文件 */ 
/********************************************************************/ 
#include <MSP430x23x0.h>     	 
#include "lcd.h" 
#include "stdio.h" 
/********************************************************************/ 
 
 
/* 宏定义 */ 
/********************************************************************/ 
#define EnableInterrupts  _EINT()          // 使能全局中断 
#define STATUS_OUTPUT     P4IN & BIT7      // 卡片处于天线场区指示 
#define BEEP_DIR_OUT      P1DIR |= BIT5    // 控制蜂鸣器的引脚方向为输出 
#define BEEP_ON           P1OUT &= ~BIT5   // 打开蜂鸣器 
#define BEEP_OFF          P1OUT |= BIT5    // 关闭蜂鸣器 
/********************************************************************/ 
 
 
/* 定义全局变量 */ 
/********************************************************************/ 
/* 
  用来存储是否已经显示了Card ID的全局标记变量,初始化为还未显示Card ID 
*/ 
unsigned char ucCardFlag = 0; 
 
/* 
  用来记录检测到Card次数的全局变量 
*/ 
unsigned long ulDetectCount = 0; 
 
/* 
  用来统计UART0接收的字节数量 
*/ 
unsigned char ucUART0ReceiveBytesCount = 0; 
 
 
/* 
  UART0接收缓冲区 
*/ 
unsigned char ucUART0ReceiveBUF[5];  
/********************************************************************/ 
 
 
/********************************************************************* 
 * 函数名称:RXhandler 
 * 功    能:串口接收中断服务函数 
 * 入口参数:无 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
#pragma vector = USCIAB0RX_VECTOR 
__interrupt void RXhandler (void) 
{   
  if (IFG2 & UCA0RXIFG) 
  {	 
    ucUART0ReceiveBUF[ucUART0ReceiveBytesCount++] = UCA0RXBUF; 
  } 
} 
 
 
/********************************************************************* 
 * 函数名称:main 
 * 功    能:125kHz RFID演示 
 * 入口参数:无 
 * 出口参数:无 
 * 返 回 值:无 
 ********************************************************************/ 
void main(void)  
{ 
  /* 定义相关变量 */ 
  unsigned char i; 
  unsigned char ucTemp; 
  unsigned long ulCardID; 
  char CardIDStr[10]; 
  char DetectCountStr[10];  
   
  /* 关闭看门狗 */ 
  WDTCTL = WDTPW + WDTHOLD; 
  
  /* 使用内部DCO,16MHz */ 
  BCSCTL1 = CALBC1_16MHZ;    
  DCOCTL  = CALDCO_16MHZ;   
   
  /* 设置P3.4,P3.5为UART模式 */ 
  P3SEL |= BIT4 + BIT5; 
   
  /* 设置P3.4为输出 */ 
  P3DIR |= BIT4; 
   
  /* 禁止UART */ 
  UCA0CTL1 |= UCSWRST; 
  UCA0CTL0 = 0x00; 
   
  /* 选择使用SMCLK */ 
  UCA0CTL1 |= UCSSEL_2; 
   
  /* 波特率9600 */ 
  UCA0BR0 = 104; 
  UCA0BR1 = 0; 
  UCA0MCTL = 0X31; 
   
  /* 初始化USCI状态机 */ 
  UCA0CTL1 &= ~UCSWRST; 
   
  /* 使能USCI_AO RX中断 */ 
  IE2 |= UCA0RXIE; 
   
  /* 使能中断 */ 
  EnableInterrupts; 
   
  /* LCD初始化 */ 
  LCD_Init(); 
   
  /* LCD清屏 */ 
  LCD_Clear(); 
   
  /* 在LCD上显示相关信息 */ 
  LCD_WriteString(10,0,"RFID-125kHz-Demo");   
  LCD_WriteString(0,2,"Card ID:"); 
  LCD_WriteString(0,3,"Count:"); 
  LCD_WriteString(0,5,"Put card in the field"); 
  LCD_WriteString(0,6,"of antenna radiancy!"); 
   
  /* 设置P4.7为输入 */ 
  P4DIR &= ~BIT7; 
   
  /* 蜂鸣器控制初始化 */ 
  BEEP_OFF; 
  BEEP_DIR_OUT; 
   
  /* 永久循环 */   
  while(1) 
  { 
    /* 从串口接收到5字节 */ 
    if(ucUART0ReceiveBytesCount == 5) 
    { 
      ucUART0ReceiveBytesCount = 0; 
   
      /* 计算校验和 */ 
      ucTemp = ucUART0ReceiveBUF[0]; 
      for(i = 0; i < 5; i++) 
      { 
        ucTemp ^= ucUART0ReceiveBUF[i];            
      } 
     
      /* 若校验和正确 */ 
      if(ucTemp == 0) 
      { 
        /* 转换4字节Card ID数据为字符串,并进行相关显示 */ 
        ulCardID = ((unsigned long)ucUART0ReceiveBUF[0]) << 24 | 
                   ((unsigned long)ucUART0ReceiveBUF[1]) << 16 | 
                   ((unsigned long)ucUART0ReceiveBUF[2]) << 8  | 
                   ((unsigned long)ucUART0ReceiveBUF[3]) << 0; 
        sprintf(CardIDStr,"Card ID:%010ld",ulCardID); 
        LCD_WriteString(0,2,CardIDStr); 
        LCD_WriteString(0,5,"Detect Card Success!"); 
        LCD_WriteString(0,6,""); 
         
        /* 更新ucCardFlag为已经显示了Card ID */ 
        ucCardFlag = 1; 
            
        /* 累加检测到Card的次数 */ 
        ulDetectCount++; 
        sprintf(DetectCountStr,"Count:%010ld",ulDetectCount); 
        LCD_WriteString(0,3,DetectCountStr); 
         
        /* 打开蜂鸣器*/ 
        BEEP_ON; 
      } 
    } 
     
    /* 若已经显示了Card ID */ 
    if(ucCardFlag == 1)   
    { 
      /*  
         若RFID-125kHz-Reader板的STATUS_OUTPUT(PIN11)引脚输出1,表明其天线近场 
         区没有Card,则进行ucCardFlag变量的更新、相关字符串的清除和显示以及关闭 
         蜂鸣器 
      */ 
      if(STATUS_OUTPUT) 
      { 
        /* 更新ucCardFlag为还未显示Card ID */ 
        ucCardFlag = 0; 
         
        LCD_WriteString(0,2,"Card ID:"); 
        LCD_WriteString(0,4,"");   
        LCD_WriteString(0,5,"Put Card in the field"); 
        LCD_WriteString(0,6,"of antenna radiancy!"); 
         
        BEEP_OFF; 
      } 
    } 
  }   
}