找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3076|回复: 1
收起左侧

基于51单片机的射频卡读写系统

[复制链接]
ID:505041 发表于 2019-4-5 09:18 | 显示全部楼层 |阅读模式
基于51的射频卡读写,可实现读卡,写卡操作,利用串口写如AT指令,可利用在小区门禁系统,食堂消费刷卡

下面是部分的程序,因为分模块写,完整程序见附加文件

  1. /* 包含文件 -------------------------------------------------------------------*/
  2. #include"Card.h"
  3. #include"UART.h"
  4. /* 宏定义 ---------------------------------------------------------------------*/
  5. /* 本文件使用的变量 -----------------------------------------------------------*/
  6. xdata CARD Card;
  7. /* 本文件使用的函数声明 -------------------------------------------------------*/
  8. unsigned char CheckSum(unsigned char *dat, unsigned char num);
  9. /* 本文件函数体 ---------------------------------------------------------------*/

  10. /*******************************************************************************
  11. * 函数名         : ReadCard
  12. * 描述           : 读卡号
  13. * 输入           : 无
  14. * 输出           : 无
  15. * 返回           : 无
  16. *******************************************************************************/
  17. void ReadCard(void)
  18. {
  19.         unsigned char len = 3;
  20.         
  21.         Cmd.SendBuffer[0] = len;
  22.         Cmd.SendBuffer[1] = 0;
  23.         Cmd.SendBuffer[2] = 0x10;
  24.         Cmd.SendBuffer[3] = CheckSum(Cmd.SendBuffer, len);
  25.         UartSendCommand(Cmd.SendBuffer, len);
  26. }

  27. /*******************************************************************************
  28. * 函数名         : ReadBlock
  29. * 描述           : 读块数据
  30. * 输入           : block: 将要操作的块地址。
  31. * 输出           : 无
  32. * 返回           : 无
  33. *******************************************************************************/
  34. void ReadBlock(unsigned char block)
  35. {
  36.         unsigned char len = 4;
  37.         
  38.         Cmd.SendBuffer[0] = len;
  39.         Cmd.SendBuffer[1] = 0;
  40.         Cmd.SendBuffer[2] = 0x11;
  41.         Cmd.SendBuffer[3] = block;
  42.         Cmd.SendBuffer[4] = CheckSum(Cmd.SendBuffer, len);
  43.         UartSendCommand(Cmd.SendBuffer, len);
  44. }

  45. /*******************************************************************************
  46. * 函数名         : WriteBlock
  47. * 描述           : 写块数据
  48. * 输入           : block: 将要操作的块地址。
  49.                                                                          blockData: 将要写入的数据。
  50. * 输出           : 无
  51. * 返回           : 无
  52. *******************************************************************************/
  53. void WriteBlock(unsigned char block, unsigned char *blockData)
  54. {
  55.         unsigned char i;
  56.         unsigned char len = 20;
  57.         
  58.         Cmd.SendBuffer[0] = len;
  59.         Cmd.SendBuffer[1] = 0;
  60.         Cmd.SendBuffer[2] = 0x12;
  61.         Cmd.SendBuffer[3] = block;

  62.         for(i = 0; i < 16; i ++)
  63.         {
  64.                 Cmd.SendBuffer[4 + i] = blockData[i];
  65.         }
  66.         Cmd.SendBuffer[20] = CheckSum(Cmd.SendBuffer, len);
  67.         UartSendCommand(Cmd.SendBuffer, len);
  68. }

  69. /*******************************************************************************
  70. * 函数名         : MakeCard
  71. * 描述           : 办卡。
  72. * 输入           : block: 将要操作的块地址。
  73.                    value: 将要操作的值。
  74. * 输出           : 无
  75. * 返回           : 无
  76. *******************************************************************************/
  77. void MakeCard(unsigned char block, unsigned long value)
  78. {
  79.         unsigned char len = 9;
  80.         
  81.         Cmd.SendBuffer[0] = len;
  82.         Cmd.SendBuffer[1] = 0;
  83.         Cmd.SendBuffer[2] = 0x13;
  84.         Cmd.SendBuffer[3] = block;
  85.         Cmd.SendBuffer[4] = 0;        //固定为0
  86.         Cmd.SendBuffer[5] = (unsigned char)(value >> 24);
  87.         Cmd.SendBuffer[6] = (unsigned char)(value >> 16);
  88.         Cmd.SendBuffer[7] = (unsigned char)(value >> 8);
  89.         Cmd.SendBuffer[8] = (unsigned char)(value);
  90.         
  91.         Cmd.SendBuffer[9] = CheckSum(Cmd.SendBuffer, len);
  92.         UartSendCommand(Cmd.SendBuffer, len);
  93. }

  94. /*******************************************************************************
  95. * 函数名         : Inc
  96. * 描述           : 充值。
  97. * 输入           : block: 将要操作的块地址。
  98.                    value: 将要操作的值。
  99. * 输出           : 无
  100. * 返回           : 无
  101. *******************************************************************************/
  102. void Inc(unsigned char block, unsigned long value)
  103. {
  104.         unsigned char len = 8;
  105.         
  106.         Cmd.SendBuffer[0] = len;
  107.         Cmd.SendBuffer[1] = 0;
  108.         Cmd.SendBuffer[2] = 0x15;
  109.         Cmd.SendBuffer[3] = block;
  110.         Cmd.SendBuffer[4] = (unsigned char)(value >> 24);
  111.         Cmd.SendBuffer[5] = (unsigned char)(value >> 16);
  112.         Cmd.SendBuffer[6] = (unsigned char)(value >> 8);
  113.         Cmd.SendBuffer[7] = (unsigned char)(value);
  114.         
  115.         Cmd.SendBuffer[8] = CheckSum(Cmd.SendBuffer, len);
  116.         UartSendCommand(Cmd.SendBuffer, len);
  117. }

  118. /*******************************************************************************
  119. * 函数名         : Dec
  120. * 描述           : 扣款。
  121. * 输入           : block: 将要操作的块地址。
  122.                    value: 将要操作的值。
  123. * 输出           : 无
  124. * 返回           : 无
  125. *******************************************************************************/
  126. void Dec(unsigned char block, unsigned long value)
  127. {
  128.         unsigned char len = 8;
  129.         
  130.         Cmd.SendBuffer[0] = len;
  131.         Cmd.SendBuffer[1] = 0;
  132.         Cmd.SendBuffer[2] = 0x16;
  133.         Cmd.SendBuffer[3] = block;
  134.         Cmd.SendBuffer[4] = (unsigned char)(value >> 24);
  135.         Cmd.SendBuffer[5] = (unsigned char)(value >> 16);
  136.         Cmd.SendBuffer[6] = (unsigned char)(value >> 8);
  137.         Cmd.SendBuffer[7] = (unsigned char)(value);
  138.         
  139.         Cmd.SendBuffer[8] = CheckSum(Cmd.SendBuffer, len);
  140.         UartSendCommand(Cmd.SendBuffer, len);
  141. }

  142. /*******************************************************************************
  143. * 函数名         : ClearCard
  144. * 描述           : 清除卡
  145. * 输入           : block: 将要操作的块地址。
  146. * 输出           : 无
  147. * 返回           : 无
  148. *******************************************************************************/
  149. void ClearCard(unsigned char block)
  150. {
  151.         unsigned char len = 7;

  152.         Cmd.SendBuffer[0] = len;
  153.         Cmd.SendBuffer[1] = 0;
  154.         Cmd.SendBuffer[2] = 0x14;
  155.         Cmd.SendBuffer[3] = block;
  156.         Cmd.SendBuffer[4] = 0x38;        
  157.         Cmd.SendBuffer[5] = 0x52;
  158.         Cmd.SendBuffer[6] = 0x7A;
  159.         
  160.         Cmd.SendBuffer[7] = CheckSum(Cmd.SendBuffer, len);        
  161.         UartSendCommand(Cmd.SendBuffer, len);
  162. }

  163. /*******************************************************************************
  164. * 函数名         : CommandProcess
  165. * 描述           : 命令处理。
  166. * 输入           : 无
  167. * 输出           : 无
  168. * 返回           : 执行结果。
  169.                    -0   : 正确。
  170.                    -0xFF: 无卡。
  171.                    -0xFE: 卡操作错误。
  172.                    -0xFD: 没有收到命令。
  173.                    -0xFC: 余额不足。
  174.                    -0xFB: 校验错误。
  175. *******************************************************************************/
  176. unsigned char CommandProcess(void)
  177. {
  178.         unsigned char i, status, bTemp;
  179.         
  180.         //接收到命令
  181.         bTemp = UartReceiveCommand();
  182.         if(bTemp == 1)
  183.         {
  184.                 //校验命令
  185.                 if(Cmd.ReceiveBuffer[Cmd.ReceiveBuffer[0]] == CheckSum(Cmd.ReceiveBuffer, Cmd.ReceiveBuffer[0]))
  186.                 {
  187.                         //获取卡号,经过UartReceiveCommnad处理过后,有以下规律
  188.                         //Cmd.ReceiveBuffer[0]                 -> 命令长度
  189.                         //Cmd.ReceiveBuffer[1]                 -> 模块地址
  190.                         //Cmd.ReceiveBuffer[2]                 -> 命令码
  191.                         //Cmd.ReceiveBuffer[3]                 -> 状态码
  192.                         //Cmd.ReceiveBuffer[4~5]         -> 卡类型
  193.                         //Cmd.ReceiveBuffer[6~9]         -> 卡号
  194.                         Card.UID = Cmd.ReceiveBuffer[9]; Card.UID <<= 8;
  195.                         Card.UID |= Cmd.ReceiveBuffer[8]; Card.UID <<= 8;
  196.                         Card.UID |= Cmd.ReceiveBuffer[7]; Card.UID <<= 8;
  197.                         Card.UID |= Cmd.ReceiveBuffer[6];
  198.                         Cmd.Code = Cmd.ReceiveBuffer[2];
  199.                         switch(Cmd.Code)
  200.                         {
  201.                                 //读卡号,这里不能删除
  202.                                 case 0x90:break;
  203.                                 //读块数据
  204.                                 //Cmd.ReceiveBuffer[10~25] -> 数据
  205.                                 case 0x91:
  206.                                         for(i = 0; i < 16; i++){Card.BlockData[i] = Cmd.ReceiveBuffer[10 + i];}
  207.                                         break;
  208.                                 //写块数据,这里不能删除
  209.                                 case 0x92: break;
  210.                                 //办卡,这里不能删除
  211.                                 case 0x93: break;
  212.                                 //恢复卡,这里不能删除
  213.                                 case 0x94: break;
  214.                                 //充值
  215.                                 case 0x95:
  216.                                         Card.Value = Cmd.ReceiveBuffer[10];
  217.                                         Card.Value <<= 8;
  218.                                         Card.Value |= Cmd.ReceiveBuffer[11];
  219.                                         Card.Value <<= 8;
  220.                                         Card.Value |= Cmd.ReceiveBuffer[12];
  221.                                         Card.Value <<= 8;
  222.                                         Card.Value |= Cmd.ReceiveBuffer[13];
  223.                                         break;
  224.                                 //扣款
  225.                                 case 0x96:
  226.                                         Card.Value = Cmd.ReceiveBuffer[10];
  227.                                         Card.Value <<= 8;
  228.                                         Card.Value |= Cmd.ReceiveBuffer[11];
  229.                                         Card.Value <<= 8;
  230.                                         Card.Value |= Cmd.ReceiveBuffer[12];
  231.                                         Card.Value <<= 8;
  232.                                         Card.Value |= Cmd.ReceiveBuffer[13];
  233.                                         break;
  234.                                 //身份证, 这里不能删除
  235.                                 case 0xA0: break;
  236.                                 default: status = 0xFB; break;
  237.                         }
  238.                         status = Cmd.ReceiveBuffer[3];
  239.                 }
  240.                 else {status = 0xFB;}
  241.         }
  242.         else{status = 0xFD;}
  243.         return status;
  244. }

  245. /*******************************************************************************
  246. * 函数名         : CheckSum
  247. * 描述           : 命令校验。
  248. * 输入           :         dat : 要校验的数组。
  249.                                                                                 num : 校验的字节数。
  250. * 输出           : 无
  251. * 返回           : 校验值。
  252. *******************************************************************************/
  253. unsigned char CheckSum(unsigned char *dat, unsigned char num)
  254. {
  255.   unsigned char bTemp = 0, i;

  256.   for(i = 0; i < num; i ++){bTemp ^= dat[i];}
  257.   return bTemp;
  258. }
复制代码

S~HZ~M)$3N5UD67MX2L_EB4.png

51 串口示例(U13T).zip

57.34 KB, 下载次数: 27, 下载积分: 黑币 -5

回复

使用道具 举报

ID:1 发表于 2019-4-11 20:44 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表