|
基于51的射頻卡讀寫,可實現讀卡,寫卡操作,利用串口寫如AT指令,可利用在小區門禁系統,食堂消費刷卡
下面是部分的程序,因為分模塊寫,完整程序見附加文件
- /* 包含文件 -------------------------------------------------------------------*/
- #include"Card.h"
- #include"UART.h"
- /* 宏定義 ---------------------------------------------------------------------*/
- /* 本文件使用的變量 -----------------------------------------------------------*/
- xdata CARD Card;
- /* 本文件使用的函數聲明 -------------------------------------------------------*/
- unsigned char CheckSum(unsigned char *dat, unsigned char num);
- /* 本文件函數體 ---------------------------------------------------------------*/
- /*******************************************************************************
- * 函數名 : ReadCard
- * 描述 : 讀卡號
- * 輸入 : 無
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- void ReadCard(void)
- {
- unsigned char len = 3;
-
- Cmd.SendBuffer[0] = len;
- Cmd.SendBuffer[1] = 0;
- Cmd.SendBuffer[2] = 0x10;
- Cmd.SendBuffer[3] = CheckSum(Cmd.SendBuffer, len);
- UartSendCommand(Cmd.SendBuffer, len);
- }
- /*******************************************************************************
- * 函數名 : ReadBlock
- * 描述 : 讀塊數據
- * 輸入 : block: 將要操作的塊地址。
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- void ReadBlock(unsigned char block)
- {
- unsigned char len = 4;
-
- Cmd.SendBuffer[0] = len;
- Cmd.SendBuffer[1] = 0;
- Cmd.SendBuffer[2] = 0x11;
- Cmd.SendBuffer[3] = block;
- Cmd.SendBuffer[4] = CheckSum(Cmd.SendBuffer, len);
- UartSendCommand(Cmd.SendBuffer, len);
- }
- /*******************************************************************************
- * 函數名 : WriteBlock
- * 描述 : 寫塊數據
- * 輸入 : block: 將要操作的塊地址。
- blockData: 將要寫入的數據。
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- void WriteBlock(unsigned char block, unsigned char *blockData)
- {
- unsigned char i;
- unsigned char len = 20;
-
- Cmd.SendBuffer[0] = len;
- Cmd.SendBuffer[1] = 0;
- Cmd.SendBuffer[2] = 0x12;
- Cmd.SendBuffer[3] = block;
- for(i = 0; i < 16; i ++)
- {
- Cmd.SendBuffer[4 + i] = blockData[i];
- }
- Cmd.SendBuffer[20] = CheckSum(Cmd.SendBuffer, len);
- UartSendCommand(Cmd.SendBuffer, len);
- }
- /*******************************************************************************
- * 函數名 : MakeCard
- * 描述 : 辦卡。
- * 輸入 : block: 將要操作的塊地址。
- value: 將要操作的值。
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- void MakeCard(unsigned char block, unsigned long value)
- {
- unsigned char len = 9;
-
- Cmd.SendBuffer[0] = len;
- Cmd.SendBuffer[1] = 0;
- Cmd.SendBuffer[2] = 0x13;
- Cmd.SendBuffer[3] = block;
- Cmd.SendBuffer[4] = 0; //固定為0
- Cmd.SendBuffer[5] = (unsigned char)(value >> 24);
- Cmd.SendBuffer[6] = (unsigned char)(value >> 16);
- Cmd.SendBuffer[7] = (unsigned char)(value >> 8);
- Cmd.SendBuffer[8] = (unsigned char)(value);
-
- Cmd.SendBuffer[9] = CheckSum(Cmd.SendBuffer, len);
- UartSendCommand(Cmd.SendBuffer, len);
- }
- /*******************************************************************************
- * 函數名 : Inc
- * 描述 : 充值。
- * 輸入 : block: 將要操作的塊地址。
- value: 將要操作的值。
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- void Inc(unsigned char block, unsigned long value)
- {
- unsigned char len = 8;
-
- Cmd.SendBuffer[0] = len;
- Cmd.SendBuffer[1] = 0;
- Cmd.SendBuffer[2] = 0x15;
- Cmd.SendBuffer[3] = block;
- Cmd.SendBuffer[4] = (unsigned char)(value >> 24);
- Cmd.SendBuffer[5] = (unsigned char)(value >> 16);
- Cmd.SendBuffer[6] = (unsigned char)(value >> 8);
- Cmd.SendBuffer[7] = (unsigned char)(value);
-
- Cmd.SendBuffer[8] = CheckSum(Cmd.SendBuffer, len);
- UartSendCommand(Cmd.SendBuffer, len);
- }
- /*******************************************************************************
- * 函數名 : Dec
- * 描述 : 扣款。
- * 輸入 : block: 將要操作的塊地址。
- value: 將要操作的值。
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- void Dec(unsigned char block, unsigned long value)
- {
- unsigned char len = 8;
-
- Cmd.SendBuffer[0] = len;
- Cmd.SendBuffer[1] = 0;
- Cmd.SendBuffer[2] = 0x16;
- Cmd.SendBuffer[3] = block;
- Cmd.SendBuffer[4] = (unsigned char)(value >> 24);
- Cmd.SendBuffer[5] = (unsigned char)(value >> 16);
- Cmd.SendBuffer[6] = (unsigned char)(value >> 8);
- Cmd.SendBuffer[7] = (unsigned char)(value);
-
- Cmd.SendBuffer[8] = CheckSum(Cmd.SendBuffer, len);
- UartSendCommand(Cmd.SendBuffer, len);
- }
- /*******************************************************************************
- * 函數名 : ClearCard
- * 描述 : 清除卡
- * 輸入 : block: 將要操作的塊地址。
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- void ClearCard(unsigned char block)
- {
- unsigned char len = 7;
- Cmd.SendBuffer[0] = len;
- Cmd.SendBuffer[1] = 0;
- Cmd.SendBuffer[2] = 0x14;
- Cmd.SendBuffer[3] = block;
- Cmd.SendBuffer[4] = 0x38;
- Cmd.SendBuffer[5] = 0x52;
- Cmd.SendBuffer[6] = 0x7A;
-
- Cmd.SendBuffer[7] = CheckSum(Cmd.SendBuffer, len);
- UartSendCommand(Cmd.SendBuffer, len);
- }
- /*******************************************************************************
- * 函數名 : CommandProcess
- * 描述 : 命令處理。
- * 輸入 : 無
- * 輸出 : 無
- * 返回 : 執行結果。
- -0 : 正確。
- -0xFF: 無卡。
- -0xFE: 卡操作錯誤。
- -0xFD: 沒有收到命令。
- -0xFC: 余額不足。
- -0xFB: 校驗錯誤。
- *******************************************************************************/
- unsigned char CommandProcess(void)
- {
- unsigned char i, status, bTemp;
-
- //接收到命令
- bTemp = UartReceiveCommand();
- if(bTemp == 1)
- {
- //校驗命令
- if(Cmd.ReceiveBuffer[Cmd.ReceiveBuffer[0]] == CheckSum(Cmd.ReceiveBuffer, Cmd.ReceiveBuffer[0]))
- {
- //獲取卡號,經過UartReceiveCommnad處理過后,有以下規律
- //Cmd.ReceiveBuffer[0] -> 命令長度
- //Cmd.ReceiveBuffer[1] -> 模塊地址
- //Cmd.ReceiveBuffer[2] -> 命令碼
- //Cmd.ReceiveBuffer[3] -> 狀態碼
- //Cmd.ReceiveBuffer[4~5] -> 卡類型
- //Cmd.ReceiveBuffer[6~9] -> 卡號
- Card.UID = Cmd.ReceiveBuffer[9]; Card.UID <<= 8;
- Card.UID |= Cmd.ReceiveBuffer[8]; Card.UID <<= 8;
- Card.UID |= Cmd.ReceiveBuffer[7]; Card.UID <<= 8;
- Card.UID |= Cmd.ReceiveBuffer[6];
- Cmd.Code = Cmd.ReceiveBuffer[2];
- switch(Cmd.Code)
- {
- //讀卡號,這里不能刪除
- case 0x90:break;
- //讀塊數據
- //Cmd.ReceiveBuffer[10~25] -> 數據
- case 0x91:
- for(i = 0; i < 16; i++){Card.BlockData[i] = Cmd.ReceiveBuffer[10 + i];}
- break;
- //寫塊數據,這里不能刪除
- case 0x92: break;
- //辦卡,這里不能刪除
- case 0x93: break;
- //恢復卡,這里不能刪除
- case 0x94: break;
- //充值
- case 0x95:
- Card.Value = Cmd.ReceiveBuffer[10];
- Card.Value <<= 8;
- Card.Value |= Cmd.ReceiveBuffer[11];
- Card.Value <<= 8;
- Card.Value |= Cmd.ReceiveBuffer[12];
- Card.Value <<= 8;
- Card.Value |= Cmd.ReceiveBuffer[13];
- break;
- //扣款
- case 0x96:
- Card.Value = Cmd.ReceiveBuffer[10];
- Card.Value <<= 8;
- Card.Value |= Cmd.ReceiveBuffer[11];
- Card.Value <<= 8;
- Card.Value |= Cmd.ReceiveBuffer[12];
- Card.Value <<= 8;
- Card.Value |= Cmd.ReceiveBuffer[13];
- break;
- //身份證, 這里不能刪除
- case 0xA0: break;
- default: status = 0xFB; break;
- }
- status = Cmd.ReceiveBuffer[3];
- }
- else {status = 0xFB;}
- }
- else{status = 0xFD;}
- return status;
- }
- /*******************************************************************************
- * 函數名 : CheckSum
- * 描述 : 命令校驗。
- * 輸入 : dat : 要校驗的數組。
- num : 校驗的字節數。
- * 輸出 : 無
- * 返回 : 校驗值。
- *******************************************************************************/
- unsigned char CheckSum(unsigned char *dat, unsigned char num)
- {
- unsigned char bTemp = 0, i;
- for(i = 0; i < num; i ++){bTemp ^= dat[i];}
- return bTemp;
- }
復制代碼
|
|