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