找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于RC522和51单片机的刷卡门禁及扣费系统

  [复制链接]
跳转到指定楼层
楼主
ID:568565 发表于 2019-6-24 08:41 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
修改版,本段程序是利用rc522射频模块,51单片机和12864模块实现的刷卡系统,已实现刷卡门禁及按次扣费,下面附上实物图及rc522原理图以及总电路图,全部代码在附件中

RC522.C
  1. #include <intrins.h>
  2. #include "lpcreg.h"
  3. #include "main.h"
  4. #include "mfrc522.h"

  5. #define MAXRLEN 18
  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.    
  40.    return status;
  41. }

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

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

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

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

  60.     if (status == MI_OK)
  61.     {
  62.              for (i=0; i<4; i++)
  63.          {   
  64.              *(pSnr+i)  = ucComMF522Buf[i];
  65.              snr_check ^= ucComMF522Buf[i];

  66.          }
  67.          if (snr_check != ucComMF522Buf[i])
  68.          {   status = MI_ERR;    }
  69.     }
  70.    
  71.     SetBitMask(CollReg,0x80);
  72.     return status;
  73. }

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

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

  103.     return status;
  104. }

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

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

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

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

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

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

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

  187.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  188.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  189.         {   status = MI_ERR;   }
  190.     }
  191.    
  192.     return status;
  193. }

  194. /////////////////////////////////////////////////////////////////////
  195. //功    能:扣款和充值
  196. //参数说明: dd_mode[IN]:命令字
  197. //               0xC0 = 扣款
  198. //               0xC1 = 充值
  199. //          addr[IN]:钱包地址
  200. //          pValue[IN]:4字节增(减)值,低位在前
  201. //返    回: 成功返回MI_OK
  202. /////////////////////////////////////////////////////////////////////                 
  203. char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
  204. {
  205.     char status;
  206.     unsigned int  unLen;
  207.     unsigned char i,ucComMF522Buf[MAXRLEN];
  208.    
  209.     ucComMF522Buf[0] = dd_mode;
  210.     ucComMF522Buf[1] = addr;
  211.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

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

  235.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  236.         {   status = MI_ERR;   }
  237.     }
  238.     return status;
  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. //返    回: 成功返回MI_OK
  284. /////////////////////////////////////////////////////////////////////
  285. char PcdHalt(void)
  286. {
  287.     char status;
  288.     unsigned int  unLen;
  289.     unsigned char ucComMF522Buf[MAXRLEN];

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

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

  294.     return MI_OK;
  295. }

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

  318. /////////////////////////////////////////////////////////////////////
  319. //功    能:复位RC522
  320. //返    回: 成功返回MI_OK
  321. /////////////////////////////////////////////////////////////////////
  322. char PcdReset(void)
  323. {
  324.         //unsigned char i;
  325.     MF522_RST=1;

  326.                 _nop_();                  

  327.     MF522_RST=0;

  328.                 _nop_();                  

  329.     MF522_RST=1;

  330.                 _nop_();                 
  331.         
  332.     WriteRawRC(CommandReg,PCD_RESETPHASE);

  333.                 _nop_();                  
  334.         
  335.    
  336.     WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
  337.     WriteRawRC(TReloadRegL,30);           
  338.     WriteRawRC(TReloadRegH,0);
  339.     WriteRawRC(TModeReg,0x8D);
  340.     WriteRawRC(TPrescalerReg,0x3E);
  341.    WriteRawRC(TxAutoReg,0x40);
  342.     return MI_OK;
  343. }

  344. /////////////////////////////////////////////////////////////////////
  345. //功    能:读RC632寄存器
  346. //参数说明:Address[IN]:寄存器地址
  347. //返    回:读出的值
  348. /////////////////////////////////////////////////////////////////////
  349. unsigned char ReadRawRC(unsigned char Address)
  350. {
  351.      unsigned char i, ucAddr;
  352.      unsigned char ucResult=0;

  353.      MF522_SCK = 0;
  354.      MF522_NSS = 0;
  355.      ucAddr = ((Address<<1)&0x7E)|0x80;

  356.      for(i=8;i>0;i--)
  357.      {
  358.          MF522_SI = ((ucAddr&0x80)==0x80);
  359.          MF522_SCK = 1;
  360.          ucAddr <<= 1;
  361.          MF522_SCK = 0;
  362.      }

  363.      for(i=8;i>0;i--)
  364.      {
  365.          MF522_SCK = 1;
  366.          ucResult <<= 1;
  367.          ucResult|=(bit)MF522_SO;
  368.          MF522_SCK = 0;
  369.      }

  370.      MF522_NSS = 1;
  371.      MF522_SCK = 1;
  372.      return ucResult;
  373. }

  374. /////////////////////////////////////////////////////////////////////
  375. //功    能:写RC632寄存器
  376. //参数说明:Address[IN]:寄存器地址
  377. //          value[IN]:写入的值
  378. /////////////////////////////////////////////////////////////////////
  379. void WriteRawRC(unsigned char Address, unsigned char value)
  380. {  
  381.     unsigned char i, ucAddr;

  382.     MF522_SCK = 0;
  383.     MF522_NSS = 0;
  384.     ucAddr = ((Address<<1)&0x7E);

  385.     for(i=8;i>0;i--)
  386.     {
  387.         MF522_SI = ((ucAddr&0x80)==0x80);
  388.         MF522_SCK = 1;
  389.         ucAddr <<= 1;
  390.         MF522_SCK = 0;
  391.     }

  392.     for(i=8;i>0;i--)
  393.     {
  394.         MF522_SI = ((value&0x80)==0x80);
  395.         MF522_SCK = 1;
  396.         value <<= 1;
  397.         MF522_SCK = 0;
  398.     }
  399.     MF522_NSS = 1;
  400.     MF522_SCK = 1;
  401. }

  402. /////////////////////////////////////////////////////////////////////
  403. //功    能:置RC522寄存器位
  404. //参数说明:reg[IN]:寄存器地址
  405. //          mask[IN]:置位值
  406. /////////////////////////////////////////////////////////////////////
  407. void SetBitMask(unsigned char reg,unsigned char mask)  
  408. {
  409.     char tmp = 0x0;
  410.     tmp = ReadRawRC(reg);
  411.     WriteRawRC(reg,tmp | mask);  // set bit mask
  412. }

  413. /////////////////////////////////////////////////////////////////////
  414. //功    能:清RC522寄存器位
  415. //参数说明:reg[IN]:寄存器地址
  416. //          mask[IN]:清位值
  417. /////////////////////////////////////////////////////////////////////
  418. void ClearBitMask(unsigned char reg,unsigned char mask)  
  419. {
  420.     char tmp = 0x0;
  421.     tmp = ReadRawRC(reg);
  422.     WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  423. }

  424. /////////////////////////////////////////////////////////////////////
  425. //功    能:通过RC522和ISO14443卡通讯
  426. //参数说明:Command[IN]:RC522命令字
  427. //          pInData[IN]:通过RC522发送到卡片的数据
  428. //          InLenByte[IN]:发送数据的字节长度
  429. //          pOutData[OUT]:接收到的卡片返回数据
  430. //          *pOutLenBit[OUT]:返回数据的位长度
  431. /////////////////////////////////////////////////////////////////////
  432. char PcdComMF522(unsigned char Command,
  433.                  unsigned char *pInData,
  434.                  unsigned char InLenByte,
  435.                  unsigned char *pOutData,
  436.                  unsigned int  *pOutLenBit)
  437. {
  438.     char status = MI_ERR;
  439.     unsigned char irqEn   = 0x00;
  440.     unsigned char waitFor = 0x00;
  441.     unsigned char lastBits;
  442.     unsigned char n;
  443.     unsigned int i;
  444.     switch (Command)
  445.     {
  446.        case PCD_AUTHENT:
  447.           irqEn   = 0x12;
  448.           waitFor = 0x10;
  449.           break;
  450.        case PCD_TRANSCEIVE:
  451.           irqEn   = 0x77;
  452.           waitFor = 0x30;
  453.           break;
  454.        default:
  455.          break;
  456.     }
  457.    
  458.     WriteRawRC(ComIEnReg,irqEn|0x80);
  459.     ClearBitMask(ComIrqReg,0x80);
  460.     WriteRawRC(CommandReg,PCD_IDLE);
  461.     SetBitMask(FIFOLevelReg,0x80);
  462.    
  463.     for (i=0; i<InLenByte; i++)
  464.     {   WriteRawRC(FIFODataReg, pInData[i]);    }
  465.     WriteRawRC(CommandReg, Command);
  466.    
  467.    
  468.     if (Command == PCD_TRANSCEIVE)
  469.     {    SetBitMask(BitFramingReg,0x80);  }
  470.    
  471.     i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
  472.     do
  473.     {
  474.          n = ReadRawRC(ComIrqReg);
  475.          i--;
  476.     }
  477.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  478.     ClearBitMask(BitFramingReg,0x80);
  479.               
  480.     if (i!=0)
  481.     {   
  482.          if(!(ReadRawRC(ErrorReg)&0x1B))
  483.          {
  484.              status = MI_OK;
  485.              if (n & irqEn & 0x01)
  486.              {   status = MI_NOTAGERR;   }
  487.              if (Command == PCD_TRANSCEIVE)
  488.              {
  489.                        n = ReadRawRC(FIFOLevelReg);
  490.                       lastBits = ReadRawRC(ControlReg) & 0x07;
  491.                 if (lastBits)
  492.                 {   *pOutLenBit = (n-1)*8 + lastBits;   }
  493.                 else
  494.                 {   *pOutLenBit = n*8;   }
  495.                 if (n == 0)
  496.                 {   n = 1;    }
  497.                 if (n > MAXRLEN)
  498.                 {   n = MAXRLEN;   }
  499.                 for (i=0; i<n; i++)
  500.                 {   pOutData[i] = ReadRawRC(FIFODataReg);    }
  501.             }
  502.          }
  503.          else
  504.          {   status = MI_ERR;   }
  505.         
  506.    }
  507.    

  508.    SetBitMask(ControlReg,0x80);           // stop timer now
  509.    WriteRawRC(CommandReg,PCD_IDLE);
  510.    return status;
  511. }


  512. /////////////////////////////////////////////////////////////////////
  513. //开启天线  
  514. //每次启动或关闭天险发射之间应至少有1ms的间隔
  515. /////////////////////////////////////////////////////////////////////
  516. void PcdAntennaOn()
  517. {
  518.     unsigned char i;
  519.     i = ReadRawRC(TxControlReg);
  520.     if (!(i & 0x03))
  521.     {
  522.         SetBitMask(TxControlReg, 0x03);
  523.     }
  524. }


  525. /////////////////////////////////////////////////////////////////////
  526. //关闭天线
  527. /////////////////////////////////////////////////////////////////////
  528. void PcdAntennaOff()
  529. {
  530.     ClearBitMask(TxControlReg, 0x03);
  531. }     
  532.          
  533. /*--------------------------------------------------------------------------
  534. INTRINS.H

  535. Intrinsic functions for C51.
  536. Copyright (c) 1988-2004 Keil Elektronik GmbH and Keil Software, Inc.
  537. All rights reserved.
  538. --------------------------------------------------------------------------*/

  539. #ifndef __INTRINS_H__
  540. #define __INTRINS_H__

  541. extern void          _nop_     (void);
  542. extern bit           _testbit_ (bit);
  543. extern unsigned char _cror_    (unsigned char, unsigned char);
  544. extern unsigned int  _iror_    (unsigned int,  unsigned char);
  545. extern unsigned long _lror_    (unsigned long, unsigned char);
  546. extern unsigned char _crol_    (unsigned char, unsigned char);
  547. extern unsigned int  _irol_    (unsigned int,  unsigned char);
  548. extern unsigned long _lrol_    (unsigned long, unsigned char);
  549. extern unsigned char _chkfloat_(float);
  550. extern void          _push_    (unsigned char _sfr);
  551. extern void          _pop_     (unsigned char _sfr);

  552. #endif
  553. 12864.C
  554. #include "lpcreg.h"
  555. #include <intrins.h>        
  556. #include <12864.h>
  557. extern unsigned char g_ucTempbuf[20];
  558. uchar code dis1[] = {"电子信息工程172"};
  559. uchar code dis2[] = {"智能校园卡系统"};
  560. uchar code dis3[] = {"请您选择刷卡类型"};
  561. uchar code dis4[] = {"A 门禁 B BUS"};
  562. uchar code table3[]={"卡号:"};
  563. uchar code table4[]={"卡类型:"};
  564. uchar code table5[]={"消费:"};
  565. uchar code table6[]={"余额:"};
  566. uchar code table7[]={"元:"};

  567. /*******************************************************************/
  568. /*                                                                 */
  569. /*  延时函数                                                       */
  570. /*                                                                 */
  571. /*******************************************************************/
  572. void delay(int ms)
  573. {
  574.     while(ms--)
  575.         {
  576.       uchar i;
  577.           for(i=0;i<250;i++)  
  578.            {
  579.             _nop_();                           
  580.                 _nop_();
  581.                 _nop_();
  582.                 _nop_();
  583.            }
  584.         }
  585. }               
  586. /*******************************************************************/
  587. /*                                                                 */
  588. /*检查LCD忙状态                                                    */
  589. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  590. /*                                                                 */
  591. /*******************************************************************/
  592. bit lcd_busy()
  593. {                          
  594.     bit result;
  595.     LCD_RS = 0;
  596.     LCD_RW = 1;
  597.     LCD_EN = 1;
  598.     delayNOP();
  599.     result = (bit)(P0&0x80);
  600.     LCD_EN = 0;
  601.     return(result);
  602. }
  603. /*******************************************************************/
  604. /*                                                                 */
  605. /*写指令数据到LCD                                                  */
  606. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  607. /*                                                                 */
  608. /*******************************************************************/
复制代码
全部资料51hei下载地址:
门禁加扣费模块.zip (101.45 KB, 下载次数: 258)

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

使用道具 举报

沙发
ID:1 发表于 2019-6-25 01:53 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:568565 发表于 2019-6-25 08:35 | 只看该作者
admin 发表于 2019-6-25 01:53
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)

已经修改了,补上了原理图,源代码太多而且分模块的不方便粘贴,还有你们大半夜审核也太辛苦了吧,加鸡腿
回复

使用道具 举报

地板
ID:293363 发表于 2019-6-28 09:18 | 只看该作者
哥,附件上传一个呗
回复

使用道具 举报

5#
ID:568565 发表于 2019-6-29 14:26 来自手机 | 只看该作者
陈润源home 发表于 2019-6-28 09:18
哥,附件上传一个呗

呀,我记得原来是有的,怎么没了
回复

使用道具 举报

6#
ID:473471 发表于 2019-7-2 22:24 | 只看该作者
大神,好资料
回复

使用道具 举报

7#
ID:726617 发表于 2020-4-12 22:01 来自手机 | 只看该作者
有没有单片机连接刷卡模块控制继电器的程序啊
回复

使用道具 举报

8#
ID:653223 发表于 2020-5-12 17:09 | 只看该作者
阳光小子11 发表于 2020-4-12 22:01
有没有单片机连接刷卡模块控制继电器的程序啊

你好,你有这个资料了吗
回复

使用道具 举报

9#
ID:1047194 发表于 2022-10-11 13:54 | 只看该作者
刚入门,来借鉴学习学习
回复

使用道具 举报

10#
ID:639020 发表于 2022-10-12 16:02 | 只看该作者
阳光小子11 发表于 2020-4-12 22:01
有没有单片机连接刷卡模块控制继电器的程序啊

自己写一个。如果是量产项目联系我,从电路到软件全部帮做好可以直接量产
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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