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

📄 maina.c

📁 f330与mfrc522 通信 构成读卡器 上传源码和原理图。
💻 C
字号:
//////////////////  RF522 读卡器程序   ///////////////////
//     MCU型号:		C8051F330                //
//     读卡芯片型号:   RF522
////////////////////////////////////////////////////////////////////
#include "main.h"
#include "Uart0.h"
#include "MFRC522.h"
#include "Timer2.h"
#include "Adc.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] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};  //密钥
UCHAR   idata  g_ucTempbuf[20]; 
//------------------------------------------
UINT  volatile event_word;
//------------------------------------------
void main()
{
    EA =0;    
	F330_Init();	//F330系统初始化
	EA=1;

    PcdReset();

    PcdAntennaOff(); 

    PcdAntennaOn();
	//  
	BEEP  = 1;      //蜂鸣
	Delay1ms(100);       
    BEEP  = 0;      //关蜂鸣器
	//
	ET2 = 1;        //

	while(1)
	{  
      do_event();    //状态事件处理
	  
//      Pack_Exec();   //上位机数据包解析 

	}
	
}

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

   {
     UCHAR event_word_copy;

     event_word_copy = event_word;
	if (event_word_copy&EVENT_CARD)
      {
	    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,NSS,MOSI,MISO,SCK
	P0MDOUT |= 0x55;	// 0    1   0  1  0    1   0    1 
                        //CE,CSN,JDQ,LED1,LED0,BEEP,STS3,STS1
	P1MDIN   = 0xff;	//P1.1模拟输入,余全部数字输入
                        //--,--,  --, --, RST, --, BEEP, RW 
	P1MDOUT  = 0x0b;	// 0  0   0    0   1    0    1   1   
	                    //SPIO和串口使能
	XBR0    = 0X03;		//-,-,CP0AE,CP0E,SYSCKE,SMB0E,SPIOE,UART0E
	                    //弱上拉,交叉开关使能,CEX0,CEX1
	XBR1    = 0x40;		//WEAK,XBARE,T1E,T0E,ECIE,,PCA0ME1,0

    BEEP    = 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初始化
	Timer2_Init();		//定时器2初始化 用做与读卡器通讯的时钟控制
	Init_Spi();		
	Adc0_Init();	   
}
//***********************************************//初始化SPI//-----------------------------------------------void Init_Spi(void){                    //BSY,MEN,CKPH,CKPL,SLV,NSS,SRMT,RXBMT   SPI0CFG = 0x70;  // 0  1(主)0   0    0   0    0    0                    //SPIF,WCOL,MODF,ROVER,NSS1,NSS0,TBMT,SPIEN   SPI0CN  = 0x01;  //  0    0    0    0    0     0    0    1   SPI0CKR = SYSCLK/2/200000-1;  //1MHz SPI时钟}
//***********************************************
//RF522 寻卡程序
//------------------------------------------------
void Card_request (void)
{    
    
     Read_Card ();

     BEEP = 0;
                      
	 PcdHalt();
 }
//***********************************************
//RF522 读卡程序
//------------------------------------------------
void Read_Card (void)
{    
     unsigned char status;
	 //
     status = PcdRequest(PICC_REQALL, 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 = PcdWrite(1, data1);       //写数据到块1
          
		   if (status != MI_OK)    return;
          
		  status = PcdValue(PICC_DECREMENT,1,data2);   //扣款

           if (status != MI_OK)    return;
 
          status = PcdBakValue(1, 2);        //备份钱包   
           
		   if (status != MI_OK)    return;

          status = PcdRead(2, g_ucTempbuf);  //读块2数据
	           
 }
//*****************************************************

⌨️ 快捷键说明

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