|
|
基于51的射頻卡讀寫,可實(shí)現(xiàn)讀卡,寫卡操作,利用串口寫如AT指令,可利用在小區(qū)門禁系統(tǒng),食堂消費(fèi)刷卡
下面是部分的程序,因?yàn)榉帜K寫,完整程序見附加文件
- /* 包含文件 -------------------------------------------------------------------*/
- #include"Card.h"
- #include"UART.h"
- /* 宏定義 ---------------------------------------------------------------------*/
- /* 本文件使用的變量 -----------------------------------------------------------*/
- xdata CARD Card;
- /* 本文件使用的函數(shù)聲明 -------------------------------------------------------*/
- unsigned char CheckSum(unsigned char *dat, unsigned char num);
- /* 本文件函數(shù)體 ---------------------------------------------------------------*/
- /*******************************************************************************
- * 函數(shù)名 : ReadCard
- * 描述 : 讀卡號(hào)
- * 輸入 : 無
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- * 函數(shù)名 : ReadBlock
- * 描述 : 讀塊數(shù)據(jù)
- * 輸入 : 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);
- }
- /*******************************************************************************
- * 函數(shù)名 : WriteBlock
- * 描述 : 寫塊數(shù)據(jù)
- * 輸入 : block: 將要操作的塊地址。
- blockData: 將要寫入的數(shù)據(jù)。
- * 輸出 : 無
- * 返回 : 無
- *******************************************************************************/
- 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);
- }
- /*******************************************************************************
- * 函數(shù)名 : 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);
- }
- /*******************************************************************************
- * 函數(shù)名 : 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);
- }
- /*******************************************************************************
- * 函數(shù)名 : 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);
- }
- /*******************************************************************************
- * 函數(shù)名 : 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);
- }
- /*******************************************************************************
- * 函數(shù)名 : CommandProcess
- * 描述 : 命令處理。
- * 輸入 : 無
- * 輸出 : 無
- * 返回 : 執(zhí)行結(jié)果。
- -0 : 正確。
- -0xFF: 無卡。
- -0xFE: 卡操作錯(cuò)誤。
- -0xFD: 沒有收到命令。
- -0xFC: 余額不足。
- -0xFB: 校驗(yàn)錯(cuò)誤。
- *******************************************************************************/
- unsigned char CommandProcess(void)
- {
- unsigned char i, status, bTemp;
-
- //接收到命令
- bTemp = UartReceiveCommand();
- if(bTemp == 1)
- {
- //校驗(yàn)命令
- if(Cmd.ReceiveBuffer[Cmd.ReceiveBuffer[0]] == CheckSum(Cmd.ReceiveBuffer, Cmd.ReceiveBuffer[0]))
- {
- //獲取卡號(hào),經(jīng)過UartReceiveCommnad處理過后,有以下規(guī)律
- //Cmd.ReceiveBuffer[0] -> 命令長度
- //Cmd.ReceiveBuffer[1] -> 模塊地址
- //Cmd.ReceiveBuffer[2] -> 命令碼
- //Cmd.ReceiveBuffer[3] -> 狀態(tài)碼
- //Cmd.ReceiveBuffer[4~5] -> 卡類型
- //Cmd.ReceiveBuffer[6~9] -> 卡號(hào)
- 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)
- {
- //讀卡號(hào),這里不能刪除
- case 0x90:break;
- //讀塊數(shù)據(jù)
- //Cmd.ReceiveBuffer[10~25] -> 數(shù)據(jù)
- case 0x91:
- for(i = 0; i < 16; i++){Card.BlockData[i] = Cmd.ReceiveBuffer[10 + i];}
- break;
- //寫塊數(shù)據(jù),這里不能刪除
- case 0x92: break;
- //辦卡,這里不能刪除
- case 0x93: break;
- //恢復(fù)卡,這里不能刪除
- 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;
- }
- /*******************************************************************************
- * 函數(shù)名 : CheckSum
- * 描述 : 命令校驗(yàn)。
- * 輸入 : dat : 要校驗(yàn)的數(shù)組。
- num : 校驗(yàn)的字節(jié)數(shù)。
- * 輸出 : 無
- * 返回 : 校驗(yàn)值。
- *******************************************************************************/
- 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;
- }
復(fù)制代碼
|
-
-
-
51 串口示例(U13T).zip
2019-4-5 09:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
57.34 KB, 下載次數(shù): 27, 下載積分: 黑幣 -5
|