📄 ic_card.c
字号:
//用C8051F410读写器读写M1射频卡,读卡模块用WM-11T6
#include <C8051F410.h>
#include <stdio.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// typedef
//-----------------------------------------------------------------------------
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef signed char s8;
typedef signed int s16;
typedef signed long s32;
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
//////////////以下为卡密码/////////////////////////
/*
#define key1 0xff
#define key2 0xff
#define key3 0xff
#define key4 0xff
#define key5 0xff
#define key6 0xff
//*/
#define SYSCLK 24500000 // SYSCLK frequency in Hz
#define BAUDRATE 9600 // Baud rate of UART in bps
#define T0_RELOAD_H 0xF0 // Reload value for Timer0 high byte //to calc
#define T0_RELOAD_L 0x00 // Reload value for Timer0 low byte
#define BUFSIZE_UREC 26 //接收缓冲区最大长度
//-----------------------------------------------------------------------------
//定义全局变量
//-----------------------------------------------------------------------------
u8 indexUartRec = 0; //接收指针
u8 Numrxdi = 0; //接收到的数据字节数
u8 srxdbuff[24];//发送缓冲区
u8 rxdbuff[21]; //接收缓冲区
u8 CardData[16];//读卡数据缓冲区
u8 CardNO1[4];//卡号
u8 WriteCardData[16];
bit rx_complete = 0;//发送完成标志位
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void Init_SYSCLK (void)
{
OSCICN = 0x87; // configure internal oscillator for
// 24.5MHz
RSTSRC = 0x04; // enable missing clock detector
}
void Init_T0(void)
{
TH0 = T0_RELOAD_H; // Init Timer0 High register
TL0 = T0_RELOAD_L ; // Init Timer0 Low register
TMOD = 0x01; // Timer0 in 16-bit mode
CKCON = 0x02; // Timer0 uses a 1:48 prescaler
ET0 = 1; // Timer0 interrupt enabled
TR0 = 0; // Timer0 OFF //
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void Init_PORT (void)
{
P0MDIN = 0xFF; //所有端口数字
P0MDOUT = 0x10; // Enable UTX as push-pull output
// P0SKIP = 0x0C; //INT0: P0.2: & INT1: P0.3
XBR0 = 0x01; // Enable UART on P0.4(TX) and P0.5(RX)
XBR1 = 0x40; // Enable crossbar and weak pull-ups
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//-----------------------------------------------------------------------------
void Init_UART0 (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON |= 0x08; // T1M = 1; SCA1:0 = xx
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x01;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else if (SYSCLK/BAUDRATE/2/256 < 48) {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
} else {
while (1); // Error. Unsupported baud rate
}
TL1 = TH1; // init Timer1
// TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
ES0 = 1; // enable uart0 interrupt
}
u8 XORCheck(u8 *psData,u8 length)
{
u8 i;
u8 XORData=0;
for(i = 0; i < length; i++)
{
XORData ^= psData[i];
}
return XORData;
}
void Delay_10ms(void)//10ms
{
u8 i;
for(i = 0; i < 150; i++)//
{
}
}
//-----------------------------------------------------------------------------
// 通过UART0发送数据
//-----------------------------------------------------------------------------
void Uart0_Send (void *ptr, u8 num)
{
TI0 = 0; // 可删除
REN0=0;//禁止接受
EA = 0;
while(num!= 0)
{
SBUF0 = *((char *)ptr)++;
while(!TI0); //wait for sending
TI0 = 0;
num--;
}
REN0=1;//允许接受,
EA = 1;
}
//寻卡
//下传命令:3C 04 01 70 00(寻卡模式00(IDLE)或01(ALL)) 00 BCC 0D
//成功返回:3C 05 四字节卡号 00 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D
//11T6读卡模块无论卡在不在感应区内都返回寻卡成功,飞利浦的设计
u8 CardReady() //成功则返回0,否则返回失败原因
{
u8 j;
u16 n;
CardReadyERR:
Delay_10ms(); //保证每条指令之间延时20ms
Delay_10ms();
TR0=0;
srxdbuff[0]=0x3c;
srxdbuff[1]=0x04;
srxdbuff[2]=0x01;
srxdbuff[3]=0x70;
srxdbuff[4]=0x01;//寻卡模式
srxdbuff[5]=0x00;
srxdbuff[6]=XORCheck(srxdbuff,6);
srxdbuff[7]=0x0d;
Uart0_Send(srxdbuff,8);
n=20000;
while(n)
{
if(rx_complete)//接收完成
{
rx_complete = 0;
// n = 0;
break;
}
Delay_10ms();
n--;
}
if(n==0)
return 1;//超时返回
if(rxdbuff[1] == 0x01)
{
return 2; //错误返回
}
else if(rxdbuff[1] == 0x05)
{
if((XORCheck(rxdbuff,7)==rxdbuff[7])&&(rxdbuff[8])==0x0d)
{
for(j=0;j<4;j++)
{
CardNO1[j]=rxdbuff[2+j];
}
return 0;//寻卡成功返回
}
else
{
return 3;//校验错误返回
}
}
else goto CardReadyERR;
}
//密码验证
//下传命令:3C 0E 01 6C 六字节密码 认证模式(00-A/01-B) 绝对块号 四字节卡号 校验位 0D
//成功返回:3C 02 00 00 BCC 0D
//错误返回:3C 01 FF(错误代码) BCC 0D
//注:根据原先的设置,一般都用B密码
u8 KeyPass(u8 BlockNum)//成功则返回0,否则返回失败原因
{
u16 n;
Delay_10ms(); //保证每条指令之间延时20ms
Delay_10ms();
TR0=0;
srxdbuff[0]=0x3c;
srxdbuff[1]=0x0e;
srxdbuff[2]=0x01;
srxdbuff[3]=0x6c;
srxdbuff[4]=key1;//六字节密码
srxdbuff[5]=key2;
srxdbuff[6]=key3;
srxdbuff[7]=key4;
srxdbuff[8]=key5;
srxdbuff[9]=key6;
srxdbuff[10]=0x00;//采用A密码
srxdbuff[11]=BlockNum;
srxdbuff[12]=CardNO1[0];
srxdbuff[13]=CardNO1[1];
srxdbuff[14]=CardNO1[2];
srxdbuff[15]=CardNO1[3];
srxdbuff[16]=XORCheck(srxdbuff,16);
srxdbuff[17]=0x0d;
Uart0_Send(srxdbuff,18);
n=20000;
while(n)
{
if(rx_complete)//接收完成
{
rx_complete = 0;
// n = 0;
break;
}
Delay_10ms();
n--;
}
if(n==0)
return 1;//超时返回
if(rxdbuff[1] == 0x01)
{
return 2; //错误返回
}
else if(rxdbuff[1] == 0x02)
{
if((XORCheck(rxdbuff,4)==rxdbuff[4])&&((rxdbuff[5])==0x0d))
{
return 0;//寻卡成功返回
}
else
{
return 3;//校验错误返回
}
}
else return 4;//其它错误返回
}
//读卡
//下传命令:3C 04 01 66 00(绝对块号) 00 BCC 0D
//成功返回:3C 12 00 DATA0~DATA15 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D
u8 CardRead_step(u8 BlockNum)//成功则返回0,否则返回失败原因
{
u8 j;
u16 n;
Delay_10ms(); //保证每条指令之间延时20ms
Delay_10ms();
TR0=0;
srxdbuff[0]=0x3c;
srxdbuff[1]=0x04;
srxdbuff[2]=0x01;
srxdbuff[3]=0x66;
srxdbuff[4]=BlockNum;
srxdbuff[5]=0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -