📄 m500auc.c
字号:
TL1 = 0xFD;
//TH1 = 0xF3; // 波特率设为2400
//TL1 = 0xF3;
TR1 = TRUE; // 波特率发生器
SM2 = 1;
//TH0 = 0x60;
//TL0 = 0x60;
TH0 = 0xB1;
TL0 = 0xE0;
TR0 = TRUE;
SPEAKER = 0;
RLED = FALSE;
GLED = FALSE;
ET0=1;
ET1=0;
EA=1;
EX0=1;
IT0 = 1;
TR2=0;
ES = TRUE;
CmdValid=0;
RECEIVE = 0;
isSelect = FALSE;
haveRead = TRUE;
//RLED=0;
//delay_10ms(30);
//RLED=1;
//delay_10ms(30);
//RLED=0;
MfConfig();
SM2 = 1;
}
///////////////////////////////////////////////////////////////////////
// IC卡处理函数
///////////////////////////////////////////////////////////////////////
void cmd_execution(void)
{
//unsigned char cmd;
unsigned char checksum = 0;
unsigned char status;
switch(cmd)
{
case 1: // 读卡信息
if(!haveRead && cardtype == mifare1) // 正确读取卡号
{
SerBuffer[0] = SLAVEADDR; // 从机地址
SerBuffer[1] = 6; // 返回字节数
SerBuffer[2] = 1;
memcpy(&SerBuffer[3], &CardInfoBuffer[2], 4); // 卡序列号
checksum = checksum ^ SerBuffer[0];
checksum = checksum ^ SerBuffer[1];
checksum = checksum ^ SerBuffer[2];
checksum = checksum ^ SerBuffer[3];
checksum = checksum ^ SerBuffer[4];
checksum = checksum ^ SerBuffer[5];
checksum = checksum ^ SerBuffer[6];
SerBuffer[7] = checksum; // 异或校验和
RLED = FALSE;
haveRead = TRUE;
}
else // 没有卡号或者卡类型不正确
{
SerBuffer[0] = SLAVEADDR;
SerBuffer[1] = 3;
SerBuffer[2] = 1;
SerBuffer[3] = 0;
checksum = checksum ^ SerBuffer[0];
checksum = checksum ^ SerBuffer[1];
checksum = checksum ^ SerBuffer[2];
checksum = checksum ^ SerBuffer[3];
SerBuffer[4] = checksum;
}
break;
case 2: // 蜂鸣器
SerBuffer[0] = SLAVEADDR;
SerBuffer[1] = 3;
SerBuffer[2] = 2;
SerBuffer[3] = 1;
checksum = checksum ^ SerBuffer[0];
checksum = checksum ^ SerBuffer[1];
checksum = checksum ^ SerBuffer[2];
checksum = checksum ^ SerBuffer[3];
SerBuffer[4] = checksum;
break;
case 3: // 绿灯开、关
if( RevBuffer[1] == 0)
{
GLED = FALSE;
SerBuffer[0] = SLAVEADDR;
SerBuffer[1] = 3;
SerBuffer[2] = 3;
SerBuffer[3] = 1;
checksum = checksum ^ SerBuffer[0];
checksum = checksum ^ SerBuffer[1];
checksum = checksum ^ SerBuffer[2];
checksum = checksum ^ SerBuffer[3];
SerBuffer[4] = checksum;
}
else if( RevBuffer[1] == 1)
{
GLED = TRUE;
SerBuffer[0] = SLAVEADDR;
SerBuffer[1] = 3;
SerBuffer[2] = 3;
SerBuffer[3] = 1;
checksum = checksum ^ SerBuffer[0];
checksum = checksum ^ SerBuffer[1];
checksum = checksum ^ SerBuffer[2];
checksum = checksum ^ SerBuffer[3];
SerBuffer[4] = checksum;
}
else
{
SerBuffer[0] = SLAVEADDR;
SerBuffer[1] = 3;
SerBuffer[2] = 3;
SerBuffer[3] = 0;
checksum = checksum ^ SerBuffer[0];
checksum = checksum ^ SerBuffer[1];
checksum = checksum ^ SerBuffer[2];
checksum = checksum ^ SerBuffer[3];
SerBuffer[4] = checksum;
}
break;
case 4: // 灯闪烁
SerBuffer[0] = SLAVEADDR;
SerBuffer[1] = 3;
SerBuffer[2] = 4;
SerBuffer[3] = 1;
checksum = checksum ^ SerBuffer[0];
checksum = checksum ^ SerBuffer[1];
checksum = checksum ^ SerBuffer[2];
checksum = checksum ^ SerBuffer[3];
SerBuffer[4] = checksum;
break;
case 5: // 重启状态
SerBuffer[0] = SLAVEADDR;
SerBuffer[1] = 3;
SerBuffer[2] = 5;
SerBuffer[3] = 1;
checksum = checksum ^ SerBuffer[0];
checksum = checksum ^ SerBuffer[1];
checksum = checksum ^ SerBuffer[2];
checksum = checksum ^ SerBuffer[3];
SerBuffer[4] = checksum;
break;
default:
break;
}
CALL_isr_UART();
}
///////////////////////////////////////////////////////////////////////
// 接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
unsigned char i = 0;
unsigned int j = 0;
unsigned char cmdlen;
unsigned char senlen;
unsigned char addr;
unsigned char checksum;
if(RI)
{
if( isSelect == TRUE ) // Receive the data
{
cmdlen = SBUF;
RI=0;
for(i=0; i<cmdlen; i++)
{
while(!RI)
{
j++;
if(j > 1000)
{
break;
}
}
if(j < 1000)
{
RevBuffer[i] = SBUF;
RI = 0;
j = 0;
}
else
{
break;
}
}
if(cmdlen == i)
{
// LedOn(1);
checksum = SLAVEADDR;
checksum = cmdlen ^ checksum;
for(i=0; i<cmdlen-1; i++)
{
checksum = checksum ^ RevBuffer[i];
}
if( checksum == RevBuffer[cmdlen-1])
{
isSelect = FALSE;
CmdValid = TRUE;
cmd = RevBuffer[0];
cmd_execution(); // 进入IC卡处理程序
}
}
SM2 = 1;
isSelect = FALSE;
}
else // Receive the address
{
addr = SBUF;
RI = 0;
if(addr != SLAVEADDR)
{
isSelect = FALSE;
ES = 1;
}
else
{
SM2 = 0;
isSelect = TRUE;
ES = 1;
}
}
}
else if(!RI & TI)
{
SM2 = 0;
RECEIVE = 1;
TI=0;
delay_1ms(10); // by Fxx 2005-2-22
senlen = SerBuffer[1];
for(i=0; i<=senlen+1; i++)
{
//delay_50us(1);
SBUF = SerBuffer[i];
while(!TI);
TI = 0;
}
RECEIVE = 0;
SM2 = 1;
}
}
/////////////////////////////////////////////////////////////////////
// 定时器0中断服务程序
/////////////////////////////////////////////////////////////////////
void isr_TIMER0(void) interrupt 1 using 2
{
switch(cmd)
{
case 2:
SPEAKER = 1;
while(RevBuffer[1] > 0)
{
delay(30);
RevBuffer[1] --;
}
SPEAKER = 0;
break;
case 4:
LedOn(RevBuffer[1]);
break;
case 5:
init();
break;
default:
break;
}
cmd = 0;
TH0 = 0xB1;
TL0 = 0xE0;
TR0 = TRUE;
}
/////////////////////////////////////////////////////////////////////
// led function
/////////////////////////////////////////////////////////////////////
void LedOn( unsigned char rpt)
{
unsigned char i;
unsigned int j=0;
i = rpt;
while(i>0)
{
delay_1ms(100);
GLED = TRUE;
delay_1ms(100);
GLED = FALSE;
i--;
}
}
/////////////////////////////////////////////////////////////////////
// delay function
/////////////////////////////////////////////////////////////////////
void delay(unsigned char time)
{
unsigned int i;
while(time>0)
{
time--;
i = 100;
while(i>0)
{
i--;
}
}
}
///////////////////////////////////////////////////////////////////////
// 取得本机地址
///////////////////////////////////////////////////////////////////////
void GetAddr(void)
{
unsigned char i;
LOAD = 0;
delay_50us(1);
LOAD = 1;
DCLK = 0;
delay_50us(1);
for(i=0; i<8; i++)
{
SLAVEADDR = SLAVEADDR << 1;
if(DIN)
{
SLAVEADDR = SLAVEADDR | 0X01;
}
DCLK = 1;
delay_50us(1);
DCLK = 0;
DIN = 1;
delay_50us(1);
}
}
///////////////////////////////////////////////////////////////////////
// 主函数
///////////////////////////////////////////////////////////////////////
void main(void)
{
unsigned char i;
unsigned char j;
unsigned char status;
init();
GetAddr();
SM2 = 1;
while(1)
{
while(haveRead)
{
//1.寻卡
status=M500PiccCommonRequest(0x52,&CardInfoBuffer[1]); // Request ALl
//status=M500PiccCommonRequest(0x26,&RevBuffer[2]); // Request Std
if(status!=MI_OK)
{
status=M500PiccCommonRequest(0x52,&CardInfoBuffer[1]); // Request All
//status=M500PiccCommonRequest(0x26,&RevBuffer[2]); // Request Std
if(status!=MI_OK)
{
// RLED = FALSE;
continue;
}
}
if(CardInfoBuffer[1]==2)
cardtype=mifarepro; // Mifare Pro 卡
else if(CardInfoBuffer[1]==4)
cardtype=mifare1; // Mifare One 卡
else if(CardInfoBuffer[1]==16)
cardtype=mifarelight; // Mifare Light 卡
else
cardtype=unknowncard;
CardInfoBuffer[0] = status;
RLED = TRUE; // 灯亮
SPEAKER = TRUE; // 蜂鸣器响
delay(200);
SPEAKER = FALSE;
haveRead = FALSE;
//寻卡操作完毕
//2.防冲突,读取卡的序列号
status = M500PiccCascAnticoll(0,&CardInfoBuffer[2]);
if(status!=MI_OK)
{
continue;
}
memcpy(MLastSelectedSnr,&CardInfoBuffer[2],4);
//防冲突完毕
//3.选择卡 Select Card
status=M500PiccCascSelect(MLastSelectedSnr,TempBuffer);
if(status!=MI_OK)
{
continue;
}
//选择卡完毕
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -