⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 f330与mfrc522 通信 构成读卡器 上传源码和原理图。
💻 C
字号:
//////////////////  RF522 读卡器程序   ///////////////////
//     MCU型号:		C8051F330                //
//     读卡芯片型号:   RF522
////////////////////////////////////////////////////////////////////
#include "main.h"
#include "Uart0.h"
#include "MFRC522.h"
#include "Timer2.h"
#include "Adc.h" 
//#include "F330_FlashP.h"
//***************************************************************
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
unsigned char code data1[16] = {0x12,0x34,0x56,0x78,  //4字节金额(低字节在前)
                                0xED,0xCB,0xA9,0x87,  //4字节金额取反
								0x12,0x34,0x56,0x78,  //4字节金额
								0x01,0xFE,0x01,0xFE}; //块地址1B+地址反1B+块地址1B+块地址1B 
//
UCHAR   code data2[4]      = {0x12,0,0,0};          
UCHAR   code DefaultKey[6] = {0x4A, 0x59, 0x30, 0x31, 0x30, 0x35};  //密钥
UCHAR   xdata g_ucTempbuf[20];
                           //jd    buad  格式
UCHAR   code DefaulSet[4] = {0x0, 0x00, 0x6C, 0x7D};  //读卡器默认设置信息
UCHAR   data SetxxBuf [4] = {0x00, 0x00, 0x0, 0x0};


extern  UCHAR  xdata  ComTBuf[];
extern  UCHAR  data   Sio_Lth;     //
extern  UCHAR  idata  ComTBufHead;
extern  UCHAR  data   CardId;      //节点ID号
extern  UCHAR  data   SioBurd;
extern  UCHAR  bdata  DataFormat;  //读卡器数据输出格式
extern  UCHAR  data   CardCs1;     //读卡器参数1
extern  UCHAR  code   Set_xx[4];   //读卡器默认设置信息
//------------------------------------------
UINT  volatile event_word;
//------------------------------------------
void main()
{
    EA =0;    
	F330_Init();	 //F330系统初始化
	Setxx_Ini();     
	EA=1;
    //
	VDM0CN = 0x80;   //使能VDD监视器  
    PcdReset();      //复位RC522
	RSTSRC = 0x02;   //使能VDD监视器作为复位源
    //
    PcdAntennaOff(); //关闭天线
	BEEP  = 1;       //蜂鸣
	Delay1ms(200);       
    BEEP  = 0;       //关蜂鸣器
    PcdAntennaOn();  //开启天线 
    //
	EIE1 |= 0X80;    //ET3=1

	while(1)

	  {  
        do_event();    //状态事件处理	  
 	  }
	
}

//***********************************************
//事件处理程序
//------------------------------------------------
void do_event (void)

   {
     UCHAR event_word_copy;

     event_word_copy = event_word;   //

	    if (event_word_copy&EVENT_CARD)  //200毫秒定时寻卡
           {
	         EA = 0;
             event_word &= ~EVENT_CARD;
             EA = 1;
             Card_request ();   //寻卡
	       }

   }
//***********************************************
//F330初始化
//------------------------------------------------
void F330_Init (void)
{
    //时钟初始化
	OSCXCN  = 0x00;		//关闭外时钟
    OSCICL += 0;        //校正值=0,24.5MHZ
	                    //内部振荡使能,12MHZ
    OSCICN  = 0XC2;  	//IOSCEN,IFRDY,/,/,/,/,IFCN1,IFCN2 

	//看门狗初始化      //CIDL,WDTE,WDCK, ,CPS2,CPS1,CPS0,ECF
    PCA0MD &=0xb1 ;     //禁止看门狗,CPS2-0=000,PCA时钟=SYSCLK/12	   
	                 
    PCA0CPL2 =0xff;	    //超时间隔=256×PCA0CPL2+(256-PCA0L)
                        //SYSCLK=24.5M/2时约隔约64MS
    PCA0MD &=0xE0;		//使能看门狗,CIDL=1,CPU等待时PCA停止工作

	//IO口初始化

	P0MDIN  |= 0xff;	//P0.n全部数字输入
	                    // -,  NSS,RX,TX,   ,MOSI,MISO,SCK
	P0MDOUT |= 0x55;	// 0    1   0  1  0    1   0    1 
                        //
	P1MDIN   = 0xff;	//P1.1模拟输入,余全部数字输入
                        //--,--,  --, --, RST, --, BEEP, RW 
	P1MDOUT  = 0x0b;	// 0  0   0    0   1    0    1   1   
	                    //SPIO和串口使能
	XBR0    = 0X01;		//-,-,CP0AE,CP0E,SYSCKE,SMB0E,SPIOE,UART0E
	                    //弱上拉,交叉开关使能,CEX0,CEX1
	XBR1    = 0x40;		//WEAK,XBARE,T1E,T0E,ECIE,,PCA0ME1,0

    BP      = 0;        //关蜂鸣器
	RW485   = 0;        //读卡器接收模式
    
	
	//初始初始化中断源,优先级

    IT01CF  = 01;       //INT0,INT1
	IT0     = 1;
    EIE1    = 0x0;      //ET3, ,ECP0,EPCA0,EADC0,EWADC0, , ESMB   
    EIP1    = 0X0;    
	IP      = 0x10;     //-,PSPIO,PT2,PS0,PT1,PX1,PT0,PX0
                        //串口最高级
	//              
	Init_Com0();        //串口初始化,波特率=57600
	Timer0_Init();      //定时器0初始化
	Timer3_Init();		//定时器3初始化 用做与读卡器通讯的时钟控制	
//	Adc0_Init();	   
}
//***********************************************
//RF522 寻卡程序
//------------------------------------------------
void Card_request (void)
{    
     if(!BEEP)      //BEEP=0,1次有效读卡结束
    
     Read_Card ();
                      	 
 }
//***********************************************
//RF522 读卡程序
//------------------------------------------------
void Read_Card (void)
{    
     unsigned char status;
	 //寻天线区内未进入休眠状态
     status = PcdRequest(PICC_REQIDL, g_ucTempbuf);

     if (status != MI_OK)          return;
 
	//	  BEEP = 1;   //蜂鸣

          status = PcdAnticoll(g_ucTempbuf);  //防冲突 

           if (status != MI_OK)    return;   
   
          status = PcdSelect(g_ucTempbuf);   //选卡 

           if (status != MI_OK)    return;
                                             //验证密钥
          status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);
                 
		   if (status != MI_OK)    return;

          status = PcdRead(1, g_ucTempbuf);  //读块2数据
		  //块2数据={00,34,56,78,ff,CB,A9,87,00,34,56,78,01,FE,01,FE}
		  if (status != MI_OK)    return;

		  PcdHalt();               
          BEEP = 1;   //蜂鸣
		  Delay1ms(200);

          Card_Data_Send();
 
 }

//===============================================
//卡数据填串口缓冲区并启动发送
//===============================================
void Card_Data_Send(void)
    {
      UCHAR  i,j = 16;
	    
	  ComTBuf[0] = 0xAA;     //包头
	  ComTBuf[1] = 0x08;     //读卡器设备号
      ComTBuf[2] = 0x11;     //数据长度
	  ComTBuf[3] = 0x00;     //读卡器返回状态:00=OK
      //16字节卡块数据送发送缓冲区
      for (i=0;i<j;i++)

	  { ComTBuf[i+4] = g_ucTempbuf[i];}

	  ComTBuf[0x14] = 0x55;  //包校验和
	  ComTBuf[0x15] = 0XBB;  //包尾
	  //
	  RW485 = 1;
	  ComTBufHead=1;
	  Sio_Lth = 22;  
	  SBUF0   = ComTBuf[0];	 //启动串口发送  
	}
//===============================================
//读卡器设置参数初始化
//===============================================
void Setxx_Ini(void)
    {
      UCHAR  kjdh;
      //从FLASH读设置信息
	  FLASH_Read (SetxxBuf, FLASH_TEMP, 4);

	  kjdh = SetxxBuf[0];  

	  if (kjdh != 0xff)

	    { //FLASH设置信息有效
		  CardId     = SetxxBuf[0]; 
		  SioBurd    = SetxxBuf[1];
          DataFormat = SetxxBuf[2];
		  CardCs1    = SetxxBuf[3];  
		}
       else 
	    { //FLASH设置信息为空(ff)		  
		  CardId      = DefaulSet[0]; 
		  SioBurd     = DefaulSet[1];
          DataFormat  = DefaulSet[2];
          CardCs1     = DefaulSet[3];
          //
          SetxxBuf[0] = DefaulSet[0]; 
		  SetxxBuf[1] = DefaulSet[1];
          SetxxBuf[2] = DefaulSet[2];
          SetxxBuf[3] = DefaulSet[3];
		  //默认设置写FLASH
          FLASH_Write (FLASH_TEMP, SetxxBuf, 4);
		  		   
		} 
	    
	}

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -