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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5007|回復: 4
打印 上一主題 下一主題
收起左側

MSP430F149單片機實現公交卡/飯卡充值功能模塊(RFID+RC522源程序)

[復制鏈接]
跳轉到指定樓層
樓主
實驗目的
1.   最基礎實現刷卡后顯示沖值/扣款說明
2.   實現芯片內部寄存器的讀寫,實現可記憶性。
設計思路
根據M1射頻卡與讀寫器的通訊過程,程序設計基本流程如下:

主函數架構:
  1. void main(void)
  2. {
  3.   WDTCTL = WDTPW + WDTHOLD; // 關看門狗
  4.   int i = 0;
  5.   unsigned char status;
  6.   BoardConfig(0xf0);
  7.   Init_Port();
  8.   InitUART();
  9.   Port_init();   //系統初始化,設置IO口屬性
  10.   delay_ms(100); //延時100ms
  11.   LCD_init();    //液晶參數初始化設置
  12.   LCD_clear();   //清屏
  13.   LCD_Desk1();
  14.   _EINT();
  15.   PcdReset();     //復位RC522
  16.   PcdAntennaOn(); //開啟天線發射
  17.   while (1)
  18.   {
  19.     status = PcdRequest(PICC_REQIDL, Temp); ////尋卡,輸出為卡類型
  20.     if (status == MI_OK)
  21.       status = PcdAnticoll(UD); //防沖撞處理,輸出卡片序列號,4字節
  22.     if (status == MI_OK)
  23.       status = PcdSelect(UD); //選擇卡片,輸入卡片序列號,4字節
  24.     if (status == MI_OK)
  25.       status = PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UD); //在進行讀寫操作之前需要先進行認證
  26.     if (status == MI_OK)
  27.       status == incharg();//讀
  28.     if (status == MI_OK)
  29.     {
  30.       status = PcdWrite(1,money_ok);//充錢
  31.       memset(money_ok,0,sizeof(money_ok));
  32.       break;
  33.      }
  34.     }
  35.       LCD_clear(); //清屏
  36.       LCD_Desk3();  
  37.       led();
  38.   }
復制代碼
其中
status == incharg();//讀
incharg 函數
這一部分是自己編寫用于讀寫存儲器內容,并且進行數據類型轉換功能的函數。
  1. char incharg(void)
  2. {
  3.   unsigned char g_ucTempbuf[20];
  4.   unsigned char num;
  5.   unsigned char temp1[10];
  6.   unsigned char temp2[5];
  7.   unsigned char status2;
  8.   long int sum = 0;               //充值后整數部分的額度
  9.   long int re;

  10.   temp1[0] = '\0';
  11.   temp2[0] = '\0';
  12.   memset(money, 0, sizeof(money)); //清空錢包臨時數組
  13.   status2 = PcdRead(1, g_ucTempbuf);//讀塊2部分
  14.   if (status2 == MI_OK)
  15.   {
  16.     for (num = 0; num < 2; num++)
  17.     {
  18.       money[num] = g_ucTempbuf[1 - num];//存儲芯片寄存器讀出來的內容,并且調換高低位(因為存儲的時候,按照低位在前的順序)
  19.     }
  20.     itoa(money[0], temp1, 16);       //十六進制數值轉十六進制字符串(字符串無法進行計算)
  21.     itoa(money[1], temp2, 16);       //十六進制數值轉十六進制字符串(字符串無法進行計算)
  22.     strcat(temp1, temp2);            //將兩個char類型連接。輸出temp1=temp1temp2
  23.     inteDec = str_dec(temp1);        //余額整數 十六進制字符串轉十進制數
  24.     temp1[0] = '\0';                 // 字符常量占一個字節的內存空間
  25.     temp2[0] = '\0';                 // 字符常量占一個字節的內存空間
  26.     memset(money, 0, sizeof(money)); //將money中當前位置后面清零 。
  27.     sum = inputnum + inteDec; //充值后余額整數部分之和
  28.     re = sum;
  29.     Int_char(re);            //十進制轉字符串
  30.     led();                   //led燈亮
  31.     LCD_clear();             //清屏
  32.     LCD_Desk2();             //lcd顯示正在充值
  33.     while (Result[i] != '\0')
  34.     {
  35.      LCD_write_str(Result); //lcd顯示10進制字符串
  36.      i++;
  37.     }
  38.     delay_ms(1800);
  39.   }
  40.     if(sum<65536)              //將充值完畢的余額總數再次存儲到寄存器內。
  41.   {
  42.     itoa(sum,money_inch_hex,16);     //10進制數值轉為16進制字符串,整數部分
  43.     i=strlen(money_inch_hex);
  44.     switch(i)
  45.     {
  46.     case 0:
  47.       for(num=0;num<4;num++)
  48.       {
  49.         money_inch_hex[num]='0';
  50.       }
  51.       money_inch_hex[4]='\0';
  52.       break;
  53.     case 1:
  54.       money_inch_hex[4]='\0';
  55.       money_inch_hex[3]=money_inch_hex[0];
  56.       money_inch_hex[2]='0';
  57.       money_inch_hex[1]='0';
  58.       money_inch_hex[0]='0';
  59.       break;
  60.     case 2:
  61.       money_inch_hex[4]='\0';
  62.       money_inch_hex[3]=money_inch_hex[1];
  63.       money_inch_hex[2]=money_inch_hex[0];
  64.       money_inch_hex[1]='0';
  65.       money_inch_hex[0]='0';
  66.       break;
  67.     case 3:
  68.       money_inch_hex[4]='\0';
  69.       money_inch_hex[3]=money_inch_hex[2];
  70.       money_inch_hex[2]=money_inch_hex[1];
  71.       money_inch_hex[1]=money_inch_hex[0];
  72.       money_inch_hex[0]='0';
  73.       break;
  74.     }
  75.     StringToHex(money_i, money_inch_hex);   //16進制字符串轉為16進制字節數組
  76.     for(num=0;num<2;num++)         //置高位在前
  77.     {
  78.       money_ok[num]=money_i[1-num];
  79.     }
  80.   }

  81.     return status2;  //返回判斷值
復制代碼
函數功能基本實現,因為是實現充值功能,所以為了防止連續多次充值,在主函數最后設置了break環節。
在實際操作過程中,在刷卡充值的時候,不能過早的移開卡片,否則會導致充卡失敗。



全部資料51hei下載地址:
4.公交卡充值功能實現.rar (90.19 KB, 下載次數: 31)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:594608 發表于 2019-9-23 15:01 | 只看該作者
講述的不夠仔細,如果有什么問題,歡迎前來討論,也希望能發現更好的程序,因為是初學者,我這個程序實際運行會有一些問題。
例如漢字顯示偶爾出現問題
偶爾出現閃屏
刷卡周期過長
如果有更佳的程序,希望你也會和我分享
請聯系我的QQ

歡迎討論!
回復

使用道具 舉報

板凳
ID:594608 發表于 2019-9-23 15:02 | 只看該作者
待會還會更新一個扣費模塊的,主要是希望實現連續扣費
回復

使用道具 舉報

地板
ID:429156 發表于 2019-9-26 14:36 | 只看該作者
公交卡充值是不是數據有加密保護,不然別人搞個同樣的機器也能沖
回復

使用道具 舉報

5#
ID:594608 發表于 2019-9-26 16:54 | 只看該作者
xiaomi_51hei 發表于 2019-9-26 14:36
公交卡充值是不是數據有加密保護,不然別人搞個同樣的機器也能沖

是的,我猜測是可以修改卡片內的密碼在和充值機器密碼校驗。剛剛學習單片機,有許多不完善的地方
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎影院新地址 | 一本大道久久a久久精二百 欧洲一区二区三区 | 一区二区三区国产 | 国产免费一区二区 | 国产成人精品免费视频 | 三级特黄特色视频 | 国产精品一区二区三区在线 | 欧美久久久网站 | 在线91 | 欧美精品一区二区在线观看 | 精品无码三级在线观看视频 | 99国内精品 | 精品欧美一区二区三区久久久小说 | 视频1区2区 | 精品视频一区二区三区在线观看 | 2一3sex性hd | www.日本精品 | 在线看91 | 久久黄色网| 久久9视频 | 亚洲欧美日本在线 | 天堂男人av| 99久久婷婷国产综合精品电影 | 天天干在线播放 | 久久1区| 一区二区在线不卡 | 精品国产伦一区二区三区观看方式 | 欧美激情久久久 | 日韩电影中文字幕 | 国产精品欧美一区二区 | 9色视频在线| 亚洲精品99999 | 色综合一区二区 | 亚洲精品乱码久久久久久按摩观 | av在线一区二区三区 | 欧美激情精品久久久久久 | 亚洲一区二区三区在线播放 | 亚欧精品| 成人精品视频99在线观看免费 | 米奇7777狠狠狠狠视频 | 91精品国产综合久久久动漫日韩 |