📄 maina.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 + -