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

標題: 51單片機水卡充值扣費系統 RC522+S50卡源程序 [打印本頁]

作者: xianxianhh    時間: 2019-8-15 10:48
標題: 51單片機水卡充值扣費系統 RC522+S50卡源程序
本設計包括兩個終端,包括負責水卡充值(可選擇金額)的充值終端和每次刷卡扣費兩元的付費終端。制作成品時建議兩個終端做在一塊板子上,用跳帽切換兩個51單片機的電源。

主控芯片51單片機
射頻模塊RC522
射頻卡M1卡S50
以下是付費終端的程序,其他詳見附件
  1. #include "reg52.h"
  2. #include "main.h"
  3. #include "mfrc522.h"
  4. #include<intrins.h>         //函數處理頭文件        
  5. #include<string.h>          //字符串處理頭文件  
  6. #include<stdio.h>           // 輸入輸出函數頭文件

  7. unsigned char code data1[16] = {0x00,0x00,0x00,0x00,0xff,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x01,0xFE,0x01,0xFE};
  8. //M1卡的某一塊寫為如下格式,則該塊為錢包,可接收扣款和充值命令
  9. //4字節金額(低字節在前)+4字節金額取反+4字節金額+1字節塊地址+1字節塊地址取反+1字節塊地址+1字節塊地址取反
  10. unsigned char data2[4]  = {0x00,0x00,0x00,0x00};//存值減值金額
  11. unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //密碼
  12. unsigned char TYPE_DATA[2];                                              //類型
  13. unsigned char ID_DATA[4];                                                //ID地址
  14. unsigned char value_DATA[4];                                             //卡里面的值                                                                                                                                 
  15. unsigned char g_ucTempbuf[20];                                           //卡號
  16. unsigned char code dis0[] = {"S50"};
  17. unsigned char code dis1[] = {"S70"};
  18. unsigned char code dis2[] = {"X"};
  19. unsigned char code dis3[] = {"44"};        
  20. unsigned char code dis4[] = {"ID:"};  
  21. unsigned char code dis5[] = {"RMB:"};   
  22. unsigned char code dis6[] = {"0123456789ABCDEF"};  
  23. unsigned int tt=0,a=2,b,falg_pro;                                    //falg_pro聲音提示標志         
  24. void main( )
  25. {     
  26.      unsigned char status;
  27.      InitializeSystem( );                 //初始化
  28.      PcdReset();                                //復位RC522
  29.      PcdAntennaOff();                     //關閉天線
  30.      PcdAntennaOn();                      //開啟天線
  31.            data2[1]=a/256;
  32.                  data2[0]=a%256;
  33.      while ( 1 )
  34.      {                           
  35.                status = PcdRequest(PICC_REQALL, g_ucTempbuf); //返回卡片類型#define PICC_REQIDL 0x26 尋天線區內未進入休眠狀態
  36.                                  if(status!= MI_OK)         //讀不到卡,顯示清0;
  37.                                  {
  38.                                                 TYPE_DATA[0]=0;         
  39.                                                 TYPE_DATA[1]=0;
  40.                                                 ID_DATA[0]=0;
  41.                                                 ID_DATA[1]=0;
  42.                                                 ID_DATA[2]=0;
  43.                                                 ID_DATA[3]=0;
  44.                                                 value_DATA[0]=0;
  45.                                                 value_DATA[1]=0;
  46.                                                 value_DATA[2]=0;
  47.                                                 value_DATA[3]=0;
  48.                                                 falg_pro=0;
  49.                                                 b=0;
  50.                                  }
  51.          if (status == MI_OK)
  52.          {         
  53.                                                  TYPE_DATA[0]=g_ucTempbuf[0];
  54.                                                  TYPE_DATA[1]=g_ucTempbuf[1];
  55.                                                   status = PcdAnticoll(g_ucTempbuf);       //防沖撞 ,返回卡片ID號 4字節
  56.                          if (status == MI_OK)
  57.                          {
  58.                                                            status = PcdSelect(g_ucTempbuf);    //選定卡片  ,輸入卡片ID號
  59.                                          if (status == MI_OK)
  60.                                          {         
  61.                                                                      if(falg_pro==0)//聲音提示標志
  62.                                                                                  {
  63.                                                                                          falg_pro=1;
  64.                                                                                          pro();
  65.                                                                                  }        
  66.                                                                          ID_DATA[0]=g_ucTempbuf[0];
  67.                                                                          ID_DATA[1]=g_ucTempbuf[1];
  68.                                                                          ID_DATA[2]=g_ucTempbuf[2];
  69.                                                                          ID_DATA[3]=g_ucTempbuf[3];
  70.                                                                          init_k();//初始化卡
  71.                                                                          writek();//寫卡
  72.                                                                    readk();
  73.                                                                         
  74.                                          }           
  75.                          }
  76.                  }            
  77.                         LCD1206();//顯示處理        
  78.                         PcdHalt();//命令卡片進入休眠狀態        
  79.          }      
  80. }
  81. /////////////////////////////////////////////////////////////////////
  82. //系統初始化
  83. /////////////////////////////////////////////////////////////////////
  84. void InitializeSystem()
  85. {     
  86.    P0 = 0xFF;
  87.          P1 = 0xFF;
  88.          P2 = 0xFF;
  89.          P3 = 0xFF;
  90.          fmq=0;             //fmp喇叭
  91.          fmq=1;
  92.          lcd_init();                                // 初始化LCD                        
  93.          Delay(1);
  94. }
  95. void Delay(unsigned int time)
  96. {
  97.   unsigned int i,k  ;
  98.   for(i=0;i<150;i++)
  99.     for(k=0;k<time;k++)
  100.       _nop_();         
  101. }

  102. void Delay2(unsigned int time2)
  103. {
  104.   unsigned int i,k  ;
  105.   for(i=0;i<5;i++)
  106.     for(k=0;k<time2;k++)
  107.       _nop_();         
  108. }
  109. ////////////////////////顯示處理函數////////////////////////////////
  110. bit lcd_bz()                            // 測試LCD忙碌狀態
  111. {                                                
  112.         bit result;
  113.         rs = 0;
  114.         rw = 1;
  115.         ep = 1;
  116.         _nop_();
  117.         _nop_();
  118.         _nop_();
  119.         _nop_();
  120.         result = (bit)(P0 & 0x80);
  121.         ep = 0;
  122.         return result;        
  123. }
  124. lcd_wcmd(unsigned char cmd)// 寫入指令數據到LCD
  125. {                                                        
  126.         while(lcd_bz());
  127.         rs = 0;
  128.         rw = 0;
  129.         ep = 0;
  130.         _nop_();
  131.         _nop_();        
  132.         P0 = cmd;
  133.         _nop_();
  134.         _nop_();
  135.         _nop_();
  136.         _nop_();
  137.         ep = 1;
  138.         _nop_();
  139.         _nop_();
  140.         _nop_();
  141.         _nop_();
  142.         ep = 0;
  143.         return 0;
  144. }

  145. lcd_pos(unsigned char pos)
  146. {                                                        //設定顯示位置
  147.         lcd_wcmd(pos | 0x80);
  148.         return 0;
  149. }

  150. lcd_wdat(unsigned char dat)        
  151. {                                                        //寫入字符顯示數據到LCD
  152.         while(lcd_bz());
  153.         rs = 1;
  154.         rw = 0;
  155.         ep = 0;
  156.         P0 = dat;
  157.         _nop_();
  158.         _nop_();
  159.         _nop_();
  160.         _nop_();
  161.         ep = 1;
  162.         _nop_();
  163.         _nop_();
  164.         _nop_();
  165.         _nop_();
  166.         ep = 0;        
  167.         return 0;
  168. }
  169. lcd_init()                                         //LCD初始化設定
  170. {                                                        
  171.         lcd_wcmd(0x38);                        //
  172.         Delay(1);
  173.         lcd_wcmd(0x0c);                        //
  174.         Delay(1);
  175.         lcd_wcmd(0x06);                        //
  176.         Delay(1);
  177.         lcd_wcmd(0x01);                        //清除LCD的顯示內容
  178.         Delay(1);
  179.         return 0;
  180. }
  181. LCD1206()
  182. {
  183.         unsigned char i;
  184.         lcd_pos(0x01);                                // 設置顯示位置為第一行的第0個字符
  185.         i = 0;
  186.         switch(TYPE_DATA[0])
  187.                  {
  188.                  case 0x04:
  189.            lcd_wdat(dis0[0]);                     //dis0[] = {"S50"};
  190.                  lcd_wdat(dis0[1]);
  191.                  lcd_wdat(dis0[2]);
  192.                  break;
  193.                  case 0x02:
  194.                  lcd_wdat(dis1[0]);                     //dis1[] = {"S70"};
  195.                  lcd_wdat(dis1[1]);
  196.                  lcd_wdat(dis1[2]);
  197.                  break;
  198.                  case 0x08:                             //dis2[] = {"X"};
  199.            lcd_wdat(dis2[0]);
  200.                  break;
  201.                  case 0x44:
  202.                  lcd_wdat(dis3[0]);                     //dis3[] = {"44"};  
  203.                  lcd_wdat(dis3[1]);
  204.                  break;   
  205.                  }
  206.                         lcd_pos(0x05);                                            // 設置顯示位置為第一行的第5個字符
  207.                         lcd_wdat(dis4[0]);                //dis4[] = {"ID:"};  
  208.                         lcd_wdat(dis4[1]);
  209.                         lcd_wdat(dis4[2]);
  210.                         lcd_pos(0x08);                                            // 設置顯示位置為第一行的第5個字符
  211.                   lcd_wdat(dis6[ID_DATA[0]/16]);    //dis6[] = {"0123456789ABCDEF"};
  212.                         lcd_wdat(dis6[ID_DATA[0]%16]);
  213.                         lcd_wdat(dis6[ID_DATA[1]/16]);
  214.                         lcd_wdat(dis6[ID_DATA[1]%16]);
  215.                         lcd_wdat(dis6[ID_DATA[2]/16]);
  216.                         lcd_wdat(dis6[ID_DATA[2]%16]);
  217.                         lcd_wdat(dis6[ID_DATA[3]/16]);
  218.                         lcd_wdat(dis6[ID_DATA[3]%16]);
  219.                         lcd_pos(0x40);                                      // 設置顯示位置為第二行第二個字符
  220.                         lcd_wdat(dis5[0]);                //dis5[] = {"RMB:"};
  221.                         lcd_wdat(dis5[1]);
  222.                         lcd_wdat(dis5[2]);//
  223.                         lcd_wdat(dis5[3]);//        人民幣
  224.                         lcd_wdat(dis6[0]);
  225.                         lcd_wdat(dis6[2]);
  226.                
  227.                         lcd_pos(0x47);                        // 設置顯示位置為第二行第二個字符
  228.                         lcd_wdat(dis5[0]);
  229.                         lcd_wdat(dis5[1]);
  230.                         lcd_wdat(dis5[2]);//
  231.                         lcd_wdat(dis5[3]);//        人民幣
  232.                         lcd_pos(0x4b);
  233.                         lcd_wdat(dis6[b/10000]);
  234.                         lcd_wdat(dis6[b%10000/1000]);
  235.                         lcd_wdat(dis6[b%10000%1000/100]);
  236.                         lcd_wdat(dis6[b%10000%1000%100/10]);
  237.                         lcd_wdat(dis6[b%10000%1000%100%10]);
  238.                         return 0;
  239. }  
  240. void pro()
  241. {
  242.         fmq=0;
  243.         TMOD=0x11;//設置定時器0為工作方式1
  244.         TH0=(65536-50000)/256;//給定時器裝初值 高八位
  245.         TL0=(65536-50000)%256;//給定時器裝初值 低八位
  246.         EA=1;   //開總中斷
  247.         ET0=1;  //開定時器0中斷
  248.         TR0=1;  //啟動定時器0
  249. }

  250. void time0() interrupt 1// 中斷服務子程序 聲音時間一致
  251. {

  252. TH0=(65536-50000)/256;//給定時器裝初值 高八位
  253. TL0=(65536-50000)%256;//給定時器裝初值 低八位
  254. tt++;
  255. if(tt==3)
  256.         {        
  257.     tt=0;
  258.                 fmq=1;
  259.                 EA=0;   //關總中斷
  260.                 ET0=0;  //關定時器0中斷
  261.                 TR0=0;  //關定時器0
  262.         }        
  263. }

  264. void readk()//讀卡
  265. {        
  266. unsigned char status;
  267. status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
  268.          if (status == MI_OK) //驗證密碼
  269.          {                                                                                                                                                                                                                                                                                                                                                                                          
  270.     status = PcdRead(1, g_ucTempbuf);//讀塊地址“1”的數據,返回值存在        g_ucTempbuf
  271.                           if (status == MI_OK)
  272.                           {
  273.                                 value_DATA[0]=g_ucTempbuf[0];
  274.                                 value_DATA[1]=g_ucTempbuf[1];
  275.                                 value_DATA[2]=g_ucTempbuf[2];
  276.                                 value_DATA[3]=g_ucTempbuf[3];        
  277.                                 b=value_DATA[0]+value_DATA[1]*256;                                                                                    
  278.                           }   
  279.      }
  280. }        
  281. void writek()//寫卡        存值或減值
  282. {
  283.     unsigned char status;
  284.     status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
  285.           if (status == MI_OK) //驗證密碼
  286.           {        

  287.                          if(1)                              //扣款
  288.                          {
  289.                                  if(b>1)
  290.                                  {
  291.                                          status = PcdValue(PICC_DECREMENT,1,data2);//扣款存值命令,錢包地址,金額 低位在前  PICC_INCREMENT 充值
  292.                                          if (status == MI_OK)
  293.                                          {
  294.                                          pro();
  295.                                          }      
  296.                                          status = PcdBakValue(1, 2);              //備份錢包          “1”源地址“2”目標地址
  297.                                          Delay(1000);
  298.                                          b=b-2;
  299.                                  }
  300.                                  else
  301.                                  {
  302.                                          unsigned int x;
  303.                                          for(x=1;x<4000;x++)
  304.                                          {
  305.                                          fmq=1;
  306.            Delay2(1);
  307.                                          fmq=0;
  308.                                          }
  309.                                  }
  310.                                 
  311.                          }
  312.                 }

  313. }        
  314. void init_k()//初始化卡
  315. {
  316.     unsigned char status;
  317.                 if(key1==0)                              //充值
  318.                 {
  319.             status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A 驗證密碼模式60A密碼 61B密碼,“1”塊地址,DefaultKey初始密碼,g_ucTempbuf ID號
  320.                   if (status == MI_OK) //驗證密碼
  321.                   {                                                                                                                                                                                                                                                                                                                                          
  322.                                   status = PcdWrite(1, data1);//4字節金額(低字節在前)+4字節金額取反+4字節金額+1字節塊地址+1字節塊地址取反+1字節塊地址+1字節塊地址取反
  323.                                   if (status == MI_OK)
  324.                                          {
  325.                                                   pro();
  326.                                          }
  327.                         }
  328.                 }
  329. }         
復制代碼
全部程序51hei下載地址:
注冊程序.rar (90.98 KB, 下載次數: 84)
刷卡程序.rar (88.79 KB, 下載次數: 106)


作者: youluping520    時間: 2020-10-13 09:23
這個程序最多能注冊多少個會員?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 热久久性 | 亚洲欧美激情精品一区二区 | 国产资源在线播放 | 国产精品成人一区二区三区 | 色综合色综合 | 欧美 日韩 国产 成人 在线 91 | 91文字幕巨乱亚洲香蕉 | 亚洲精品综合 | 欧美黄色片| 久久久成人网 | 国产精品无码久久久久 | 久久不卡日韩美女 | 精品国产一区二区三区免费 | 一区二区av在线 | 久久久久久亚洲精品不卡 | 四虎影视在线 | 一区二区三区视频在线观看 | 亚洲欧美日韩在线 | 成人黄色在线 | 超碰导航 | 国产高清在线精品一区二区三区 | 午夜综合 | 免费成年网站 | 成人久久久 | 国产精品一区二区欧美黑人喷潮水 | 伦理二区| 久久a久久 | 日韩精品久久久久 | 久久高清| 欧美精品一区二区蜜桃 | 欧美四虎| 欧美在线日韩 | 人人看人人射 | 国产电影一区二区在线观看 | 91久久综合| 中文字幕免费视频 | 啪啪免费网站 | 97国产精品视频人人做人人爱 | 欧美午夜一区 | 久久五月婷 | 在线观看成人 |