11933浏览
查看: 11933|回复: 11

校园一卡通

[复制链接]
本帖最后由 丄帝De咗臂 于 2015-6-5 10:47 编辑

一、功能介绍
该校园一卡通可以用在校内的宿舍楼、教学楼等场所,当学生刷卡的时候,显示屏上会显示该生的姓名,同时伴随着刷卡成功的提示音“嘀”,此时“门”打开,学生方可进入;如果非学校的学生刷卡,显示屏上会显示错误信息“error”,同时蜂鸣器发出警报。
二、使用方法
1.将程序下载到控制器当中。
2.使用LCD显示屏显示刷卡的信息,当没有人刷卡的时候,显示屏上会显示当前环境的温湿度、以及当前时间。
3.当刷卡成功时,会显示该生的信息;当刷卡不成功的时候,会显示“error”信息,同时蜂鸣器发出报警的声音。
三、所需器材
校园一卡通图1
校园一卡通图2
时钟模块
校园一卡通图3
校园一卡通图4
校园一卡通图5
校园一卡通图7校园一卡通图6
四、接线
LCD:IIC接口
蜂鸣器:数字口3
时钟模块:IIC接口
       RFID:RX、TX、数字口6、VCC、GND
五、程序代码
(一)库文件RC522.h
  1. /////////////////////////////////////////////////////////////////////
  2. //MFRC522命令字
  3. /////////////////////////////////////////////////////////////////////
  4. #define PCD_IDLE              0x00               //取消当前命令
  5. #define PCD_AUTHENT           0x0E               //验证密钥
  6. #define PCD_RECEIVE           0x08               //接收数据
  7. #define PCD_TRANSMIT          0x04               //发送数据
  8. #define PCD_TRANSCEIVE        0x0C               //发送并接收数据
  9. #define PCD_RESETPHASE        0x0F               //复位
  10. #define PCD_CALCCRC           0x03               //CRC计算
  11. /////////////////////////////////////////////////////////////////////
  12. //Mifare_One卡片命令字
  13. /////////////////////////////////////////////////////////////////////
  14. #define PICC_REQIDL           0x26               //寻天线区内未进入休眠状态
  15. #define PICC_REQALL           0x52               //寻天线区内全部卡
  16. #define PICC_ANTICOLL1        0x93               //防冲撞
  17. #define PICC_ANTICOLL2        0x95               //防冲撞
  18. #define PICC_AUTHENT1A        0x60               //验证A密钥
  19. #define PICC_AUTHENT1B        0x61               //验证B密钥
  20. #define PICC_READ             0x30               //读块
  21. #define PICC_WRITE            0xA0               //写块
  22. #define PICC_DECREMENT        0xC0               //减值
  23. #define PICC_INCREMENT        0xC1               //增值
  24. #define PICC_RESTORE          0xC2               //调块数据到缓冲区
  25. #define PICC_TRANSFER         0xB0               //保存缓冲区中数据
  26. #define PICC_HALT             0x50               //休眠
  27. /////////////////////////////////////////////////////////////////////
  28. //MFRC522 FIFO长度定义
  29. /////////////////////////////////////////////////////////////////////
  30. #define DEF_FIFO_LENGTH       64                 //FIFO size=64byte
  31. #define MAXRLEN  18
  32. /////////////////////////////////////////////////////////////////////
  33. //MFRC522寄存器定义
  34. /////////////////////////////////////////////////////////////////////
  35. // PAGE 0
  36. #define     RFU00                 0x00   
  37. #define     CommandReg            0x01   
  38. #define     ComIEnReg             0x02   
  39. #define     DivlEnReg             0x03   
  40. #define     ComIrqReg             0x04   
  41. #define     DivIrqReg             0x05
  42. #define     ErrorReg              0x06   
  43. #define     Status1Reg            0x07   
  44. #define     Status2Reg            0x08   
  45. #define     FIFODataReg           0x09
  46. #define     FIFOLevelReg          0x0A
  47. #define     WaterLevelReg         0x0B
  48. #define     ControlReg            0x0C
  49. #define     BitFramingReg         0x0D
  50. #define     CollReg               0x0E
  51. #define     RFU0F                 0x0F
  52. // PAGE 1     
  53. #define     RFU10                 0x10
  54. #define     ModeReg               0x11
  55. #define     TxModeReg             0x12
  56. #define     RxModeReg             0x13
  57. #define     TxControlReg          0x14
  58. #define     TxAutoReg             0x15
  59. #define     TxSelReg              0x16
  60. #define     RxSelReg              0x17
  61. #define     RxThresholdReg        0x18
  62. #define     DemodReg              0x19
  63. #define     RFU1A                 0x1A
  64. #define     RFU1B                 0x1B
  65. #define     MifareReg             0x1C
  66. #define     RFU1D                 0x1D
  67. #define     RFU1E                 0x1E
  68. #define     SerialSpeedReg        0x1F
  69. // PAGE 2   
  70. #define     RFU20                 0x20  
  71. #define     CRCResultRegM         0x21
  72. #define     CRCResultRegL         0x22
  73. #define     RFU23                 0x23
  74. #define     ModWidthReg           0x24
  75. #define     RFU25                 0x25
  76. #define     RFCfgReg              0x26
  77. #define     GsNReg                0x27
  78. #define     CWGsCfgReg            0x28
  79. #define     ModGsCfgReg           0x29
  80. #define     TModeReg              0x2A
  81. #define     TPrescalerReg         0x2B
  82. #define     TReloadRegH           0x2C
  83. #define     TReloadRegL           0x2D
  84. #define     TCounterValueRegH     0x2E
  85. #define     TCounterValueRegL     0x2F
  86. // PAGE 3      
  87. #define     RFU30                 0x30
  88. #define     TestSel1Reg           0x31
  89. #define     TestSel2Reg           0x32
  90. #define     TestPinEnReg          0x33
  91. #define     TestPinValueReg       0x34
  92. #define     TestBusReg            0x35
  93. #define     AutoTestReg           0x36
  94. #define     VersionReg            0x37
  95. #define     AnalogTestReg         0x38
  96. #define     TestDAC1Reg           0x39  
  97. #define     TestDAC2Reg           0x3A   
  98. #define     TestADCReg            0x3B   
  99. #define     RFU3C                 0x3C   
  100. #define     RFU3D                 0x3D   
  101. #define     RFU3E                 0x3E   
  102. #define     RFU3F                  0x3F
  103. /////////////////////////////////////////////////////////////////////
  104. //和MFRC522通讯时返回的错误代码
  105. /////////////////////////////////////////////////////////////////////
  106. #define         MI_OK                 0
  107. #define         MI_NOTAGERR           (-1)
  108. #define         MI_ERR                (-2)
复制代码


(二)RC522
  1. /////////////////////////////////////////////////////////////////////
  2. //功    能:读RC632寄存器
  3. //参数说明:Address:寄存器地址
  4. //返    回:读出的值
  5. /////////////////////////////////////////////////////////////////////
  6. unsigned char ReadRawRC(unsigned char Address)
  7. {
  8.     unsigned char ucAddr;
  9.     unsigned char ucResult=0;
  10.     ucAddr = (Address&0x3f)|0x80;//串口读地址格式
  11. #ifndef NEWIDE       
  12.     Serial.print(ucAddr);
  13. #else
  14.     Serial.write(ucAddr);
  15. #endif
  16.     delay(10);//等待
  17.     if(Serial.available() > 0)
  18.     ucResult=Serial.read();
  19.     return ucResult;
  20. }
  21. /////////////////////////////////////////////////////////////////////
  22. //功    能:写RC632寄存器
  23. //参数说明:Address:寄存器地址
  24. //          value:写入的值
  25. /////////////////////////////////////////////////////////////////////
  26. void WriteRawRC(unsigned char Address, unsigned char value)
  27. {  
  28.     unsigned char ucAddr;
  29.     unsigned char revAddr=0;
  30.     ucAddr = Address&0x3f;//串口写地址格式
  31. #ifndef NEWIDE       
  32.     Serial.print(ucAddr);
  33.     Serial.print(value);  
  34. #else
  35.     Serial.write(ucAddr);
  36.     Serial.write(value);  
  37. #endif
  38.     delay(10);//等待返回确认地址
  39.    
  40.     while(Serial.available() > 0)
  41.     revAddr=Serial.read();
  42. }
  43. /////////////////////////////////////////////////////////////////////
  44. //功    能:置RC522寄存器位
  45. //参数说明:reg:寄存器地址
  46. //          mask:置位值
  47. /////////////////////////////////////////////////////////////////////
  48. void SetBitMask(unsigned char reg,unsigned char mask)  
  49. {
  50.     char tmp = 0x00;
  51.     tmp = ReadRawRC(reg);
  52.     WriteRawRC(reg,tmp | mask);  // set bit mask
  53. }
  54. /////////////////////////////////////////////////////////////////////
  55. //功    能:清RC522寄存器位
  56. //参数说明:reg:寄存器地址
  57. //          mask:清位值
  58. /////////////////////////////////////////////////////////////////////
  59. void ClearBitMask(unsigned char reg,unsigned char mask)  
  60. {
  61.     char tmp = 0x00;
  62.     tmp = ReadRawRC(reg);
  63.     WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  64. }
  65. /////////////////////////////////////////////////////////////////////
  66. //开启天线  
  67. //每次启动或关闭天险发射之间应至少有1ms的间隔
  68. /////////////////////////////////////////////////////////////////////
  69. void PcdAntennaOn(void)
  70. {
  71.     unsigned char i;
  72.     i = ReadRawRC(TxControlReg);
  73.     if (!(i & 0x03))
  74.     {
  75.         SetBitMask(TxControlReg, 0x03);
  76.     }
  77. }
  78. /////////////////////////////////////////////////////////////////////
  79. //关闭天线
  80. /////////////////////////////////////////////////////////////////////
  81. void PcdAntennaOff(void)
  82. {
  83.         ClearBitMask(TxControlReg, 0x03);
  84. }
  85. //////////////////////////////////////////////////////////////////////
  86. //设置RC522的工作方式
  87. //////////////////////////////////////////////////////////////////////
  88. char M500PcdConfigISOType(unsigned char type)
  89. {
  90.    if (type == 'A')                     //ISO14443_A
  91.    {
  92.        ClearBitMask(Status2Reg,0x08);
  93.        WriteRawRC(ModeReg,0x3D);
  94.        WriteRawRC(RxSelReg,0x86);
  95.        WriteRawRC(RFCfgReg,0x7F);
  96.        WriteRawRC(TReloadRegL,30);
  97.        WriteRawRC(TReloadRegH,0);
  98.        WriteRawRC(TModeReg,0x8D);
  99.        WriteRawRC(TPrescalerReg,0x3E);
  100.        delay(10);
  101.        PcdAntennaOn();
  102.    }
  103.    else{ return -1; }
  104.    
  105.    return MI_OK;
  106. }
  107. /////////////////////////////////////////////////////////////////////
  108. //功    能:复位RC522
  109. //返    回: 成功返回MI_OK
  110. /////////////////////////////////////////////////////////////////////
  111. char PcdReset(void)
  112. {
  113.     SET_RC522RST;
  114.     delay(10);
  115.     CLR_RC522RST;
  116.     delay(10);
  117.     SET_RC522RST;
  118.     delay(10);
  119.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  120.     delay(10);
  121.    
  122.     WriteRawRC(ModeReg,0x3D);//和Mifare卡通讯,CRC初始值0x6363
  123.     WriteRawRC(TReloadRegL,30);           
  124.     WriteRawRC(TReloadRegH,0);
  125.     WriteRawRC(TModeReg,0x8D);
  126.     WriteRawRC(TPrescalerReg,0x3E);
  127.        
  128.     WriteRawRC(TxAutoReg,0x40);//必须要
  129.    
  130.     return MI_OK;
  131. }
  132. /////////////////////////////////////////////////////////////////////
  133. //功    能:通过RC522和ISO14443卡通讯
  134. //参数说明:Command:RC522命令字
  135. //          pInData:通过RC522发送到卡片的数据
  136. //          InLenByte:发送数据的字节长度
  137. //          pOutData:接收到的卡片返回数据
  138. //          *pOutLenBit:返回数据的位长度
  139. /////////////////////////////////////////////////////////////////////
  140. char PcdComMF522(unsigned char Command,
  141.                  unsigned char *pInData,
  142.                  unsigned char InLenByte,
  143.                  unsigned char *pOutData,
  144.                  unsigned int *pOutLenBit)
  145. {
  146.     char stat = MI_ERR;
  147.     unsigned char irqEn   = 0x00;
  148.     unsigned char waitFor = 0x00;
  149.     unsigned char lastBits;
  150.     unsigned char n;
  151.     unsigned int i;
  152.     switch (Command)
  153.     {
  154.         case PCD_AUTHENT:
  155.                         irqEn   = 0x12;
  156.                         waitFor = 0x10;
  157.                         break;
  158.                 case PCD_TRANSCEIVE:
  159.                         irqEn   = 0x77;
  160.                         waitFor = 0x30;
  161.                         break;
  162.                 default:
  163.                         break;
  164.     }
  165.    
  166.     WriteRawRC(ComIEnReg,irqEn|0x80);
  167.     ClearBitMask(ComIrqReg,0x80);
  168.     WriteRawRC(CommandReg,PCD_IDLE);
  169.     SetBitMask(FIFOLevelReg,0x80);
  170.    
  171.     for (i=0; i<InLenByte; i++)
  172.     {   WriteRawRC(FIFODataReg, pInData[i]);    }
  173.     WriteRawRC(CommandReg, Command);
  174.    
  175.    
  176.     if (Command == PCD_TRANSCEIVE)
  177.     {    SetBitMask(BitFramingReg,0x80);  }
  178.    
  179.         i = 2000;
  180.     do
  181.     {
  182.         n = ReadRawRC(ComIrqReg);
  183.         i--;
  184.     }
  185.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  186.     ClearBitMask(BitFramingReg,0x80);
  187.     if (i!=0)
  188.     {   
  189.         if(!(ReadRawRC(ErrorReg)&0x1B))
  190.         {
  191.             stat = MI_OK;
  192.             if (n & irqEn & 0x01)
  193.             {   stat = MI_NOTAGERR;   }
  194.             if (Command == PCD_TRANSCEIVE)
  195.             {
  196.                        n = ReadRawRC(FIFOLevelReg);
  197.                       lastBits = ReadRawRC(ControlReg) & 0x07;
  198.                 if (lastBits)
  199.                 {   *pOutLenBit = (n-1)*8 + lastBits;   }
  200.                 else
  201.                 {   *pOutLenBit = n*8;   }
  202.                 if (n == 0)
  203.                 {   n = 1;    }
  204.                 if (n > MAXRLEN)
  205.                 {   n = MAXRLEN;   }
  206.                 for (i=0; i<n; i++)
  207.                 {   pOutData[i] = ReadRawRC(FIFODataReg);    }
  208.             }
  209.         }
  210.         else
  211.         {   stat = MI_ERR;   }
  212.         
  213.     }
  214.    
  215.     SetBitMask(ControlReg,0x80);           // stop timer now
  216.     WriteRawRC(CommandReg,PCD_IDLE);
  217.     return stat;
  218. }
  219. /////////////////////////////////////////////////////////////////////
  220. //功    能:寻卡
  221. //参数说明: req_code:寻卡方式
  222. //                0x52 = 寻感应区内所有符合14443A标准的卡
  223. //                0x26 = 寻未进入休眠状态的卡
  224. //          pTagType:卡片类型代码
  225. //                0x4400 = Mifare_UltraLight
  226. //                0x0400 = Mifare_One(S50)
  227. //                0x0200 = Mifare_One(S70)
  228. //                0x0800 = Mifare_Pro(X)
  229. //                0x4403 = Mifare_DESFire
  230. //返    回: 成功返回MI_OK
  231. /////////////////////////////////////////////////////////////////////
  232. char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  233. {
  234.         char stat;  
  235.         unsigned int unLen;
  236.         unsigned char ucComMF522Buf[MAXRLEN];
  237.         ClearBitMask(Status2Reg,0x08);
  238.         WriteRawRC(BitFramingReg,0x07);
  239.         SetBitMask(TxControlReg,0x03);
  240.         ucComMF522Buf[0] = req_code;
  241.         stat = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  242.         if ((stat == MI_OK) && (unLen == 0x10))
  243.         {   
  244.                 *pTagType     = ucComMF522Buf[0];
  245.                 *(pTagType+1) = ucComMF522Buf[1];
  246.         }
  247.         else
  248.         {   stat = MI_ERR;   }
  249.    
  250.         return stat;
  251. }
  252. /////////////////////////////////////////////////////////////////////
  253. //功    能:防冲撞
  254. //参数说明: pSnr:卡片序列号,4字节
  255. //返    回: 成功返回MI_OK
  256. /////////////////////////////////////////////////////////////////////  
  257. char PcdAnticoll(unsigned char *pSnr)
  258. {
  259.     char stat;
  260.     unsigned char i,snr_check=0;
  261.     unsigned int unLen;
  262.     unsigned char ucComMF522Buf[MAXRLEN];
  263.    
  264.     ClearBitMask(Status2Reg,0x08);
  265.     WriteRawRC(BitFramingReg,0x00);
  266.     ClearBitMask(CollReg,0x80);
  267.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  268.     ucComMF522Buf[1] = 0x20;
  269.     stat = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
  270.     if (stat == MI_OK)
  271.     {
  272.              for (i=0; i<4; i++)
  273.          {   
  274.              *(pSnr+i)  = ucComMF522Buf[i];
  275.              snr_check ^= ucComMF522Buf[i];
  276.          }
  277.          if (snr_check != ucComMF522Buf[i])
  278.          {   stat = MI_ERR;    }
  279.     }
  280.    
  281.     SetBitMask(CollReg,0x80);
  282.     return stat;
  283. }
  284. /////////////////////////////////////////////////////////////////////
  285. //用MF522计算CRC16函数
  286. /////////////////////////////////////////////////////////////////////
  287. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  288. {
  289.     unsigned char i,n;
  290.     ClearBitMask(DivIrqReg,0x04);
  291.     WriteRawRC(CommandReg,PCD_IDLE);
  292.     SetBitMask(FIFOLevelReg,0x80);
  293.     for (i=0; i<len; i++)
  294.     {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
  295.     WriteRawRC(CommandReg, PCD_CALCCRC);
  296.     i = 0xFF;
  297.     do
  298.     {
  299.         n = ReadRawRC(DivIrqReg);
  300.         i--;
  301.     }
  302.     while ((i!=0) && !(n&0x04));
  303.     pOutData[0] = ReadRawRC(CRCResultRegL);
  304.     pOutData[1] = ReadRawRC(CRCResultRegM);
  305. }
  306. /////////////////////////////////////////////////////////////////////
  307. //功    能:选定卡片
  308. //参数说明: pSnr:卡片序列号,4字节
  309. //返    回: 成功返回MI_OK
  310. /////////////////////////////////////////////////////////////////////
  311. char PcdSelect(unsigned char *pSnr)
  312. {
  313.     char stat;
  314.     unsigned char i;
  315.     unsigned int unLen;
  316.     unsigned char ucComMF522Buf[MAXRLEN];
  317.    
  318.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  319.     ucComMF522Buf[1] = 0x70;
  320.     ucComMF522Buf[6] = 0;
  321.     for (i=0; i<4; i++)
  322.     {
  323.             ucComMF522Buf[i+2] = *(pSnr+i);
  324.             ucComMF522Buf[6]  ^= *(pSnr+i);
  325.     }
  326.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  327.   
  328.     ClearBitMask(Status2Reg,0x08);
  329.     stat = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  330.    
  331.     if ((stat == MI_OK) && (unLen == 0x18))
  332.     {   stat = MI_OK;  }
  333.     else
  334.     {   stat = MI_ERR;    }
  335.     return stat;
  336. }
  337. /////////////////////////////////////////////////////////////////////
  338. //功    能:验证卡片密码
  339. //参数说明: auth_mode: 密码验证模式
  340. //                 0x60 = 验证A密钥
  341. //                 0x61 = 验证B密钥
  342. //          addr:块地址
  343. //          pKey:密码
  344. //          pSnr:卡片序列号,4字节
  345. //返    回: 成功返回MI_OK
  346. /////////////////////////////////////////////////////////////////////               
  347. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  348. {
  349.     char stat;
  350.     unsigned int unLen;
  351.     unsigned char i,ucComMF522Buf[MAXRLEN];
  352.     ucComMF522Buf[0] = auth_mode;
  353.     ucComMF522Buf[1] = addr;
  354.     for (i=0; i<6; i++)
  355.     {    ucComMF522Buf[i+2] = *(pKey+i);   }
  356.     for (i=0; i<6; i++)
  357.     {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  358.    
  359.     stat = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  360.     if ((stat != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  361.     {   stat = MI_ERR;   }
  362.    
  363.     return stat;
  364. }
  365. /////////////////////////////////////////////////////////////////////
  366. //功    能:读取M1卡一块数据
  367. //参数说明: addr:块地址
  368. //          pData:读出的数据,16字节
  369. //返    回: 成功返回MI_OK
  370. /////////////////////////////////////////////////////////////////////
  371. char PcdRead(unsigned char addr,unsigned char *pData)
  372. {
  373.     char stat;
  374.     unsigned int unLen;
  375.     unsigned char i,ucComMF522Buf[MAXRLEN];
  376.     ucComMF522Buf[0] = PICC_READ;
  377.     ucComMF522Buf[1] = addr;
  378.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  379.    
  380.     stat = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  381.     if ((stat == MI_OK) && (unLen == 0x90))
  382.     {
  383.         for (i=0; i<16; i++)
  384.         {    *(pData+i) = ucComMF522Buf[i];   }
  385.     }
  386.     else
  387.     {   stat = MI_ERR;   }
  388.    
  389.     return stat;
  390. }
  391. /////////////////////////////////////////////////////////////////////
  392. //功    能:写数据到M1卡一块
  393. //参数说明: addr:块地址
  394. //          pData:写入的数据,16字节
  395. //返    回: 成功返回MI_OK
  396. /////////////////////////////////////////////////////////////////////                  
  397. char PcdWrite(unsigned char addr,unsigned char *pData)
  398. {
  399.     char stat;
  400.     unsigned int unLen;
  401.     unsigned char i,ucComMF522Buf[MAXRLEN];
  402.    
  403.     ucComMF522Buf[0] = PICC_WRITE;
  404.     ucComMF522Buf[1] = addr;
  405.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  406.     stat = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  407.     if ((stat != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  408.     {   stat = MI_ERR;   }
  409.         
  410.     if (stat == MI_OK)
  411.     {
  412.         for (i=0; i<16; i++)
  413.         {   
  414.                 ucComMF522Buf[i] = *(pData+i);   
  415.         }
  416.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
  417.         stat = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  418.         if ((stat != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  419.         {   stat = MI_ERR;   }
  420.     }
  421.    
  422.     return stat;
  423. }
  424. /////////////////////////////////////////////////////////////////////
  425. //功    能:命令卡片进入休眠状态
  426. //返    回: 成功返回MI_OK
  427. /////////////////////////////////////////////////////////////////////
  428. char PcdHalt(void)
  429. {
  430.     char stat;
  431.     unsigned int unLen;
  432.     unsigned char ucComMF522Buf[MAXRLEN];
  433.     ucComMF522Buf[0] = PICC_HALT;
  434.     ucComMF522Buf[1] = 0;
  435.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  436.     stat = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  437.     return MI_OK;
  438. }
复制代码



(三)一卡通代码
  1. #include "RC522.h"
  2. #include <Time.h>
  3. #include <DS1307RTC.h>
  4. #include <Wire.h>
  5. #include <LiquidCrystal_I2C.h>
  6. #include <dht11.h>
  7. dht11 DHT11;
  8. #define DHT11PIN 8
  9. LiquidCrystal_I2C lcd(0x20,16,2);
  10. #define NEWIDE
  11. #define RC522_RST  6//Dreamer MEGA  X14 port PIN6
  12. #define SET_RC522RST  digitalWrite(RC522_RST,HIGH)
  13. #define CLR_RC522RST  digitalWrite(RC522_RST,LOW)
  14. unsigned char RevBuffer[30];
  15. unsigned char CardID[4];//存储卡片序列号
  16. unsigned char Card[8][4]={ 221,6,245,79,
  17.                             117,210,147,15,
  18.                             221,40,250,79,
  19.                             12,9,20,150,226,
  20.                             211,226,23,29 };
  21. void InitRc522(void)
  22. {
  23.   PcdReset();
  24.   PcdAntennaOff();  
  25.   PcdAntennaOn();
  26. }
  27. //功    能:操作MFRC522
  28. void CtrlRc522(void)
  29. {
  30.      char stat;
  31.      unsigned char i;
  32.      unsigned char j;
  33.            PcdReset();
  34.            delay(100);
  35.            stat=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
  36.            if(stat!=MI_OK)
  37.            {
  38.              return;
  39.            }
  40.            stat=PcdAnticoll(&RevBuffer[2]);//防冲撞,返回卡的序列号 4字节
  41.            if(stat!=MI_OK)
  42.            {
  43.               return;
  44.            }
  45.            memcpy(CardID,&RevBuffer[2],4);
  46.            stat=PcdSelect(CardID);//选卡
  47.            if(stat!=MI_OK)
  48.            {
  49.                return;
  50.            }
  51.            for(i=0;i<6;i++)         
  52.               {
  53.                  lcd.clear();
  54.                  lcd.setCursor(0,0);
  55.                  lcd.print("hello:");
  56.                   if(Card[i][0]==CardID[0]&&Card[i][1]==CardID[1]&&Card[i][2]==CardID[2]&&Card[i][3]==CardID[3])
  57.                  {   
  58.                         break;
  59.                  }
  60.              }
  61.         switch(i)
  62.         {
  63.           case 0:lcd.print("lulu");tone(3,440,100);break;
  64.           case 1:lcd.print("xiaoxiao");tone(3,440,100);break;
  65.           case 2:lcd.print("rourou");tone(3,440,100);break;
  66.           case 3:lcd.print("yunyun");tone(3,440,100);break;
  67.           case 4:lcd.print("dandan");tone(3,440,100);break;
  68.         default:lcd.print("error");tone(3,440,1000);break;
  69.         }
  70.          }
  71. void setup()
  72. {
  73.      lcd.init();                      // initialize the lcd
  74.      lcd.backlight();
  75.      pinMode(RC522_RST,OUTPUT);
  76.      SET_RC522RST;
  77.      Serial.begin(9600);//串口2:主控板与模块通信
  78. }
  79. void loop()
  80. {
  81.     int chk = DHT11.read(DHT11PIN);
  82.      //lcd.clear();
  83.      lcd.setCursor(0,0);
  84.      lcd.print("tem:");
  85.      lcd.print(DHT11.temperature);
  86.      lcd.print("C ");
  87.     // lcd.setCursor(0,8);
  88.      lcd.print("hum:");
  89.      lcd.print(DHT11.humidity);
  90.      lcd.print("% ");
  91.     InitRc522();//初始化
  92.     CtrlRc522();//操作MFRC522
  93.     tmElements_t tm;
  94.     if (RTC.read(tm)) {
  95.     lcd.setCursor(0,3);
  96.     print2digits(tm.Hour);
  97.     lcd.write(':');
  98.     print2digits(tm.Minute);
  99.     lcd.setCursor(6,3);
  100.     lcd.print(tm.Day);
  101.     lcd.write('/');
  102.     lcd.print(tm.Month);
  103.     lcd.write('/');
  104.     lcd.print(tmYearToCalendar(tm.Year));
  105.   } else {
  106.     if (RTC.chipPresent()) {
  107.       lcd.println("  Please run the SetTime");
  108.     } else {
  109.       lcd.println("DS1307 read error!  Please check the circuitry.");
  110.     }
  111.     delay(9000);
  112.   }
  113.   delay(1000);
  114. }
  115.   void print2digits(int number) {
  116.   if (number >= 0 && number < 10) {
  117.     lcd.write('0');
  118.   }
  119.   lcd.print(number);
  120. }   
复制代码


六、参考图片
校园一卡通图8

大连林海  初级技神

发表于 2015-6-4 21:21:49

很牛的设计 这个作品很酷
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-6-4 21:25:06

大连林海 发表于 2015-6-4 21:21
很牛的设计 这个作品很酷

都是比较早的作品,拿出来共享给大家的同时,自己也复习复习
回复

使用道具 举报

大连林海  初级技神

发表于 2015-6-4 21:37:50

丄帝De咗臂 发表于 2015-6-4 21:25
都是比较早的作品,拿出来共享给大家的同时,自己也复习复习

好作品 不分多久
回复

使用道具 举报

hnyzcj  版主

发表于 2015-6-5 09:19:25

我想明白怎么比对?你的数据库呢》?在哪里呢?
回复

使用道具 举报

hnyzcj  版主

发表于 2015-6-5 09:20:43

不会只对一个卡号管用吧,哈哈。代码中没有看到数据库的相关信息呀!
回复

使用道具 举报

Juice  高级技师

发表于 2015-6-5 10:22:24

感觉很棒~~有个小疑问,这个一卡通和目前学校用的一卡通功能有什么区别啊?
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-6-5 10:33:49

hnyzcj 发表于 2015-6-5 09:19
我想明白怎么比对?你的数据库呢》?在哪里呢?

数据库调用不会,所以就弄了4个卡号
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-6-5 10:34:30

我靠,发现代码弄错了,重新修改过了,各位对不住,希望没有误导
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-6-5 10:37:23

Juice 发表于 2015-6-5 10:22
感觉很棒~~有个小疑问,这个一卡通和目前学校用的一卡通功能有什么区别啊? ...

这个一卡通比较LOW,就是能够实现刷卡显示你的个人信息。不能洗澡,不能吃饭。。。不过可以实现打卡报道上班,哈哈,像陈杰老师所说,没有数据库,不能处理大批量数据。。。总之,这只是一个模拟,希望能抛砖引玉,引出大家对这个一卡通的改进
回复

使用道具 举报

hnyzcj  版主

发表于 2015-6-5 22:08:53

丄帝De咗臂 发表于 2015-6-5 10:37
这个一卡通比较LOW,就是能够实现刷卡显示你的个人信息。不能洗澡,不能吃饭。。。不过可以实现打卡报道 ...

不错了,张禄手里有不少好东西。
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-6-5 22:13:10

hnyzcj 发表于 2015-6-5 22:08
不错了,张禄手里有不少好东西。

没多少啦,快拿光啦,o(∩_∩)o 哈哈
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail