找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7220|回复: 7
打印 上一主题 下一主题
收起左侧

RC522 RFID的单片机密码锁Proteus仿真程序及单片机复习题下载

  [复制链接]
跳转到指定楼层
楼主
用RC522模块使用按键输入密码解除密码锁
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <intrins.h>
  2. #include "STC12C54xx.h"
  3. #include "mfrc522.h"

  4. #define MAXRLEN 18
  5. void Sent_Byte(unsigned char Sdata);
  6.                               
  7. /////////////////////////////////////////////////////////////////////
  8. //功    能:寻卡
  9. //参数说明: req_code[IN]:寻卡方式
  10. //                0x52 = 寻感应区内所有符合14443A标准的卡
  11. //                0x26 = 寻未进入休眠状态的卡
  12. //          pTagType[OUT]:卡片类型代码
  13. //                0x4400 = Mifare_UltraLight
  14. //                0x0400 = Mifare_One(S50)
  15. //                0x0200 = Mifare_One(S70)
  16. //                0x0800 = Mifare_Pro(X)
  17. //                0x4403 = Mifare_DESFire
  18. //返    回: 成功返回MI_OK
  19. /////////////////////////////////////////////////////////////////////
  20. char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  21. {
  22.    char status;  
  23.    unsigned int  unLen;
  24.    unsigned char ucComMF522Buf[MAXRLEN];

  25.    ClearBitMask(Status2Reg,0x08);
  26.    WriteRawRC(BitFramingReg,0x07);
  27.    SetBitMask(TxControlReg,0x03);

  28.    ucComMF522Buf[0] = req_code;

  29.    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  30.    
  31.    if ((status == MI_OK) && (unLen == 0x10))
  32.    {   
  33.        *pTagType     = ucComMF522Buf[0];
  34.        *(pTagType+1) = ucComMF522Buf[1];
  35.    }
  36.    else
  37.    {   status = MI_ERR;   }
  38.    
  39.    return status;
  40. }

  41. /////////////////////////////////////////////////////////////////////
  42. //功    能:防冲撞
  43. //参数说明: pSnr[OUT]:卡片序列号,4字节
  44. //返    回: 成功返回MI_OK
  45. /////////////////////////////////////////////////////////////////////  
  46. char PcdAnticoll(unsigned char *pSnr)
  47. {
  48.     char status;
  49.     unsigned char i,snr_check=0;
  50.     unsigned int  unLen;
  51.     unsigned char ucComMF522Buf[MAXRLEN];
  52.    

  53.     ClearBitMask(Status2Reg,0x08);
  54.     WriteRawRC(BitFramingReg,0x00);
  55.     ClearBitMask(CollReg,0x80);

  56.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  57.     ucComMF522Buf[1] = 0x20;

  58.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

  59.     if (status == MI_OK)
  60.     {
  61.              for (i=0; i<4; i++)
  62.          {   
  63.              *(pSnr+i)  = ucComMF522Buf[i];
  64.              snr_check ^= ucComMF522Buf[i];
  65.          }
  66.          if (snr_check != ucComMF522Buf[i])
  67.          {   status = MI_ERR;    }
  68.     }
  69.    
  70.     SetBitMask(CollReg,0x80);
  71.     return status;
  72. }

  73. /////////////////////////////////////////////////////////////////////
  74. //功    能:选定卡片
  75. //参数说明: pSnr[IN]:卡片序列号,4字节
  76. //返    回: 成功返回MI_OK
  77. /////////////////////////////////////////////////////////////////////
  78. char PcdSelect(unsigned char *pSnr)
  79. {
  80.     char status;
  81.     unsigned char i;
  82.     unsigned int  unLen;
  83.     unsigned char ucComMF522Buf[MAXRLEN];
  84.    
  85.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  86.     ucComMF522Buf[1] = 0x70;
  87.     ucComMF522Buf[6] = 0;
  88.     for (i=0; i<4; i++)
  89.     {
  90.             ucComMF522Buf[i+2] = *(pSnr+i);
  91.             ucComMF522Buf[6]  ^= *(pSnr+i);
  92.     }
  93.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  94.   
  95.     ClearBitMask(Status2Reg,0x08);

  96.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  97.    
  98.     if ((status == MI_OK) && (unLen == 0x18))
  99.     {   status = MI_OK;  }
  100.     else
  101.     {   status = MI_ERR;    }

  102.     return status;
  103. }

  104. /////////////////////////////////////////////////////////////////////
  105. //功    能:验证卡片密码
  106. //参数说明: auth_mode[IN]: 密码验证模式
  107. //                 0x60 = 验证A密钥
  108. //                 0x61 = 验证B密钥
  109. //          addr[IN]:块地址
  110. //          pKey[IN]:密码
  111. //          pSnr[IN]:卡片序列号,4字节
  112. //返    回: 成功返回MI_OK
  113. /////////////////////////////////////////////////////////////////////               
  114. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  115. {
  116.     char status;
  117.     unsigned int  unLen;
  118.     unsigned char i,ucComMF522Buf[MAXRLEN];

  119.     ucComMF522Buf[0] = auth_mode;
  120.     ucComMF522Buf[1] = addr;
  121.     for (i=0; i<6; i++)
  122.     {    ucComMF522Buf[i+2] = *(pKey+i);   }
  123.     for (i=0; i<6; i++)
  124.     {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  125. //   memcpy(&ucComMF522Buf[2], pKey, 6);
  126. //   memcpy(&ucComMF522Buf[8], pSnr, 4);
  127.    
  128.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  129.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  130.     {   status = MI_ERR;   }   
  131.     return status;
  132. }

  133. /////////////////////////////////////////////////////////////////////
  134. //功    能:读取M1卡一块数据
  135. //参数说明: addr[IN]:块地址
  136. //          pData[OUT]:读出的数据,16字节
  137. //返    回: 成功返回MI_OK
  138. /////////////////////////////////////////////////////////////////////
  139. char PcdRead(unsigned char addr,unsigned char *pData)
  140. {
  141.     char status;
  142.     unsigned int  unLen;
  143.     unsigned char i,ucComMF522Buf[MAXRLEN];

  144.     ucComMF522Buf[0] = PICC_READ;
  145.     ucComMF522Buf[1] = addr;
  146.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  147.    
  148.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  149.     if ((status == MI_OK) && (unLen == 0x90))
  150. //   {   memcpy(pData, ucComMF522Buf, 16);   }
  151.     {
  152.         for (i=0; i<16; i++)
  153.         {    *(pData+i) = ucComMF522Buf[i];   }
  154.     }
  155.     else
  156.     {   status = MI_ERR;   }
  157.    
  158.     return status;
  159. }

  160. /////////////////////////////////////////////////////////////////////
  161. //功    能:写数据到M1卡一块
  162. //参数说明: addr[IN]:块地址
  163. //          pData[IN]:写入的数据,16字节
  164. //返    回: 成功返回MI_OK
  165. /////////////////////////////////////////////////////////////////////                  
  166. /*char PcdWrite(unsigned char addr,unsigned char *pData)
  167. {
  168.     char status;
  169.     unsigned int  unLen;
  170.     unsigned char i,ucComMF522Buf[MAXRLEN];
  171.    
  172.     ucComMF522Buf[0] = PICC_WRITE;
  173.     ucComMF522Buf[1] = addr;
  174.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  175.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  176.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  177.     {   status = MI_ERR;   }
  178.         
  179.     if (status == MI_OK)
  180.     {
  181.         //memcpy(ucComMF522Buf, pData, 16);
  182.         for (i=0; i<16; i++)
  183.         {    ucComMF522Buf[i] = *(pData+i);   }
  184.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  185.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  186.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  187.         {   status = MI_ERR;   }
  188.     }
  189.    
  190.     return status;
  191. }
  192. */
  193. /////////////////////////////////////////////////////////////////////
  194. //功    能:扣款和充值
  195. //参数说明: dd_mode[IN]:命令字
  196. //               0xC0 = 扣款
  197. //               0xC1 = 充值
  198. //          addr[IN]:钱包地址
  199. //          pValue[IN]:4字节增(减)值,低位在前
  200. //返    回: 成功返回MI_OK
  201. /////////////////////////////////////////////////////////////////////                 
  202. /*char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
  203. {
  204.     char status;
  205.     unsigned int  unLen;
  206.     unsigned char i,ucComMF522Buf[MAXRLEN];
  207.    
  208.     ucComMF522Buf[0] = dd_mode;
  209.     ucComMF522Buf[1] = addr;
  210.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  211.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  212.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  213.     {   status = MI_ERR;   }
  214.         
  215.     if (status == MI_OK)
  216.     {
  217.        // memcpy(ucComMF522Buf, pValue, 4);
  218.         for (i=0; i<16; i++)
  219.         {    ucComMF522Buf[i] = *(pValue+i);   }
  220.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
  221.         unLen = 0;
  222.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  223.         if (status != MI_ERR)
  224.         {    status = MI_OK;    }
  225.     }
  226.    
  227.     if (status == MI_OK)
  228.     {
  229.         ucComMF522Buf[0] = PICC_TRANSFER;
  230.         ucComMF522Buf[1] = addr;
  231.         CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  232.    
  233.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  234.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  235.         {   status = MI_ERR;   }
  236.     }
  237.     return status;
  238. }
  239. */
  240. /////////////////////////////////////////////////////////////////////
  241. //功    能:备份钱包
  242. //参数说明: sourceaddr[IN]:源地址
  243. //          goaladdr[IN]:目标地址
  244. //返    回: 成功返回MI_OK
  245. /////////////////////////////////////////////////////////////////////
  246. /*char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
  247. {
  248.     char status;
  249.     unsigned int  unLen;
  250.     unsigned char ucComMF522Buf[MAXRLEN];

  251.     ucComMF522Buf[0] = PICC_RESTORE;
  252.     ucComMF522Buf[1] = sourceaddr;
  253.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  254.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  255.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  256.     {   status = MI_ERR;   }
  257.    
  258.     if (status == MI_OK)
  259.     {
  260.         ucComMF522Buf[0] = 0;
  261.         ucComMF522Buf[1] = 0;
  262.         ucComMF522Buf[2] = 0;
  263.         ucComMF522Buf[3] = 0;
  264.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

  265.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  266.         if (status != MI_ERR)
  267.         {    status = MI_OK;    }
  268.     }
  269.    
  270.     if (status != MI_OK)
  271.     {    return MI_ERR;   }
  272.    
  273.     ucComMF522Buf[0] = PICC_TRANSFER;
  274.     ucComMF522Buf[1] = goaladdr;

  275.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  276.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  277.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  278.     {   status = MI_ERR;   }

  279.     return status;
  280. }
  281. */

  282. /////////////////////////////////////////////////////////////////////
  283. //功    能:命令卡片进入休眠状态
  284. //返    回: 成功返回MI_OK
  285. /////////////////////////////////////////////////////////////////////
  286. char PcdHalt(void)
  287. {
  288.     char status;
  289.     unsigned int  unLen;
  290.     unsigned char ucComMF522Buf[MAXRLEN];

  291.     ucComMF522Buf[0] = PICC_HALT;
  292.     ucComMF522Buf[1] = 0;
  293.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  294.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  295.     return MI_OK;
  296. }

  297. /////////////////////////////////////////////////////////////////////
  298. //用MF522计算CRC16函数
  299. /////////////////////////////////////////////////////////////////////
  300. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  301. {
  302.     unsigned char i,n;
  303.     ClearBitMask(DivIrqReg,0x04);
  304.     WriteRawRC(CommandReg,PCD_IDLE);
  305.     SetBitMask(FIFOLevelReg,0x80);
  306.     for (i=0; i<len; i++)
  307.     {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
  308.     WriteRawRC(CommandReg, PCD_CALCCRC);
  309.     i = 0xFF;
  310.     do
  311.     {
  312.         n = ReadRawRC(DivIrqReg);
  313.         i--;
  314.     }
  315.     while ((i!=0) && !(n&0x04));
  316.     pOutData[0] = ReadRawRC(CRCResultRegL);
  317.     pOutData[1] = ReadRawRC(CRCResultRegM);
  318. }

  319. /////////////////////////////////////////////////////////////////////
  320. //功    能:复位RC522
  321. //返    回: 成功返回MI_OK
  322. /////////////////////////////////////////////////////////////////////
  323. char PcdReset(void)
  324. {
  325.     MF522_RST=1;
  326.     _nop_();
  327.     MF522_RST=0;
  328.     _nop_();
  329.     MF522_RST=1;
  330.      _nop_();
  331.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  332.     _nop_();
  333.    
  334.     WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
  335.     WriteRawRC(TReloadRegL,30);           
  336.     WriteRawRC(TReloadRegH,0);
  337.     WriteRawRC(TModeReg,0x8D);
  338.     WriteRawRC(TPrescalerReg,0x3E);
  339.     WriteRawRC(TxAskReg,0x40);
  340.    
  341.     return MI_OK;
  342. }
  343. ……………………

  344. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
由于Proteus里面是没有rc522这么高端的玩意的,所以仿真就只是个简单的模拟,大家直接略过看程序吧
所有资料51hei提供下载:
设计.7z (8.96 MB, 下载次数: 185)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:384820 发表于 2019-7-30 07:06 | 只看该作者
感谢分享,下来学习
回复

使用道具 举报

板凳
ID:293363 发表于 2019-7-30 11:44 | 只看该作者
楼主,你确定这个能用??我下载下来连hex文件都没有,编译也不通过
回复

使用道具 举报

地板
ID:414661 发表于 2019-8-1 12:32 | 只看该作者
不行,没有用的
回复

使用道具 举报

5#
ID:229016 发表于 2020-2-24 15:02 | 只看该作者
仿真库里有rs522?
回复

使用道具 举报

6#
ID:229016 发表于 2020-2-24 15:05 | 只看该作者
坑的很,没有rs522,怎么仿真
回复

使用道具 举报

7#
ID:714355 发表于 2020-3-23 21:27 | 只看该作者
没用,没有rs522,怎么仿真
回复

使用道具 举报

8#
ID:914692 发表于 2021-5-1 10:37 | 只看该作者
Proteus工程只能用7.5版本的啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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