久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3056|回復: 1
打印 上一主題 下一主題
收起左側

基于51單片機的射頻卡讀寫系統

[復制鏈接]
跳轉到指定樓層
樓主
基于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 (100.15 KB, 下載次數: 39)

S~HZ~M)$3N5UD67MX2L_EB4.png

51 串口示例(U13T).zip

57.34 KB, 下載次數: 27, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2019-4-11 20:44 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女羞羞视频在线免费观看 | 夜久久| 97超碰在线播放 | 久草成人| 精品一区国产 | 天天成人综合网 | 射欧美 | 97在线超碰 | 精品1区2区 | 狠狠色综合网站久久久久久久 | 亚洲国产精品久久久久秋霞不卡 | 精品在线看 | 免费观看视频www | 国产a区| 日韩视频一区二区三区 | 成人精品国产 | 97精品超碰一区二区三区 | 国家aaa的一级看片 h片在线看 | 久久精品免费观看 | 国产精品久久久亚洲 | 亚洲欧美激情精品一区二区 | 免费一区二区三区 | 精品欧美一区二区三区久久久 | 亚洲一区二区国产 | 日韩一区二区三区在线 | 精品久久香蕉国产线看观看亚洲 | 一区二区三区免费 | 午夜视频网站 | 成人免费小视频 | 在线视频a | 日韩在线91 | 国产成视频在线观看 | 精品96久久久久久中文字幕无 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 婷婷综合| 日韩成人免费av | 亚洲精品高清视频在线观看 | 五月激情六月婷婷 | 特黄毛片视频 | 久久亚洲国产 | 在线观看中文字幕 |