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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4727|回復(fù): 1
收起左側(cè)

51單片機(jī)水卡充值扣費(fèi)系統(tǒng) RC522+S50卡源程序

[復(fù)制鏈接]
ID:437557 發(fā)表于 2019-8-15 10:48 | 顯示全部樓層 |閱讀模式
本設(shè)計包括兩個終端,包括負(fù)責(zé)水卡充值(可選擇金額)的充值終端和每次刷卡扣費(fèi)兩元的付費(fèi)終端。制作成品時建議兩個終端做在一塊板子上,用跳帽切換兩個51單片機(jī)的電源。

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

  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字節(jié)金額(低字節(jié)在前)+4字節(jié)金額取反+4字節(jié)金額+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
  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聲音提示標(biāo)志         
  24. void main( )
  25. {     
  26.      unsigned char status;
  27.      InitializeSystem( );                 //初始化
  28.      PcdReset();                                //復(fù)位RC522
  29.      PcdAntennaOff();                     //關(guān)閉天線
  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 尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài)
  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字節(jié)
  56.                          if (status == MI_OK)
  57.                          {
  58.                                                            status = PcdSelect(g_ucTempbuf);    //選定卡片  ,輸入卡片ID號
  59.                                          if (status == MI_OK)
  60.                                          {         
  61.                                                                      if(falg_pro==0)//聲音提示標(biāo)志
  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();//命令卡片進(jìn)入休眠狀態(tài)        
  79.          }      
  80. }
  81. /////////////////////////////////////////////////////////////////////
  82. //系統(tǒng)初始化
  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. ////////////////////////顯示處理函數(shù)////////////////////////////////
  110. bit lcd_bz()                            // 測試LCD忙碌狀態(tài)
  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)// 寫入指令數(shù)據(jù)到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. {                                                        //設(shè)定顯示位置
  147.         lcd_wcmd(pos | 0x80);
  148.         return 0;
  149. }

  150. lcd_wdat(unsigned char dat)        
  151. {                                                        //寫入字符顯示數(shù)據(jù)到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初始化設(shè)定
  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的顯示內(nèi)容
  178.         Delay(1);
  179.         return 0;
  180. }
  181. LCD1206()
  182. {
  183.         unsigned char i;
  184.         lcd_pos(0x01);                                // 設(shè)置顯示位置為第一行的第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);                                            // 設(shè)置顯示位置為第一行的第5個字符
  207.                         lcd_wdat(dis4[0]);                //dis4[] = {"ID:"};  
  208.                         lcd_wdat(dis4[1]);
  209.                         lcd_wdat(dis4[2]);
  210.                         lcd_pos(0x08);                                            // 設(shè)置顯示位置為第一行的第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);                                      // 設(shè)置顯示位置為第二行第二個字符
  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);                        // 設(shè)置顯示位置為第二行第二個字符
  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;//設(shè)置定時器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// 中斷服務(wù)子程序 聲音時間一致
  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;   //關(guān)總中斷
  260.                 ET0=0;  //關(guān)定時器0中斷
  261.                 TR0=0;  //關(guān)定時器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”的數(shù)據(jù),返回值存在        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”目標(biāo)地址
  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字節(jié)金額(低字節(jié)在前)+4字節(jié)金額取反+4字節(jié)金額+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
  323.                                   if (status == MI_OK)
  324.                                          {
  325.                                                   pro();
  326.                                          }
  327.                         }
  328.                 }
  329. }         
復(fù)制代碼
全部程序51hei下載地址:
注冊程序.rar (90.98 KB, 下載次數(shù): 84)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:828714 發(fā)表于 2020-10-13 09:23 來自手機(jī) | 顯示全部樓層
這個程序最多能注冊多少個會員?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲毛片 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 国产成人艳妇aa视频在线 | 中文字幕欧美日韩 | 自拍视频一区二区三区 | 日本视频免费 | 青青草国产在线观看 | 国产成人av电影 | 性做久久久久久免费观看欧美 | 中文字幕 国产精品 | 久草在线影 | 成人精品一区二区三区中文字幕 | 午夜小视频在线播放 | 蜜桃视频在线观看免费视频网站www | 日韩欧美一级精品久久 | 精品成人免费视频 | 亚洲精品一区在线 | 精品成人69xx.xyz | 亚洲免费观看视频 | 久久久久国产精品一区 | 亚洲精选久久 | 久久精品国产a三级三级三级 | 超碰在线网站 | 狠狠综合久久av一区二区老牛 | 99热精品在线 | 91精品成人久久 | 欧美激情一区二区 | 超碰婷婷| 亚洲精品三级 | 看毛片的网站 | 亚洲精品99 | 三级成人在线 | 性一交一乱一透一a级 | 久久精品久久久久久 | 韩国av一区二区 | 日本不卡高清视频 | 免费麻豆视频 | 欧美极品在线视频 | 日韩激情在线 | 日韩毛片在线免费观看 | 亚洲精选一区二区 |