?? 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 + -