|
基于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;
- }
复制代码
|
|