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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7766|回復: 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, 下載次數: 263)

分享到:  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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线观看成年人视频 | 免费国产一区二区 | 日本精品视频在线 | 免费国产一区 | 久久综合狠狠综合久久 | 午夜一区二区三区在线观看 | 欧美午夜精品久久久久免费视 | 日日欧美 | 国产一级黄色网 | 国产精品久久久久久妇女 | 特级黄一级播放 | 成人黄色网址大全 | 精品一区二区三区不卡 | 欧美一级视频 | 伊人精品一区二区三区 | 午夜影院在线观看免费 | 特黄色毛片 | 99久久99热这里只有精品 | 艹逼网| 99亚洲精品 | 久久亚洲一区二区 | 天天色av| 国产不卡一区 | 日韩不卡在线观看 | 亚洲视频在线一区 | 亚洲视频欧美视频 | 拍真实国产伦偷精品 | 国产最新精品视频 | 好好的日在线视频 | 天天干天天插 | 日韩视频 中文字幕 | 国产精品视频导航 | 日韩欧美在线免费观看 | 97久久久 | 日韩久久精品 | 国产精品免费看 | 狠狠影院| 夜夜操操操 | 福利视频网站 | 天天综合国产 | 成人精品一区二区 |