找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

MSP430F149單片機(jī)實(shí)現(xiàn)公交卡/飯卡充值功能模塊(RFID+RC522源程序)

[復(fù)制鏈接]
ID:594608 發(fā)表于 2019-9-23 14:56 | 顯示全部樓層 |閱讀模式
實(shí)驗(yàn)?zāi)康?/strong>
1.   最基礎(chǔ)實(shí)現(xiàn)刷卡后顯示沖值/扣款說明
2.   實(shí)現(xiàn)芯片內(nèi)部寄存器的讀寫,實(shí)現(xiàn)可記憶性。
設(shè)計(jì)思路
根據(jù)M1射頻卡與讀寫器的通訊過程,程序設(shè)計(jì)基本流程如下:
1569221583(1).jpg
主函數(shù)架構(gòu):
  1. void main(void)
  2. {
  3.   WDTCTL = WDTPW + WDTHOLD; // 關(guān)看門狗
  4.   int i = 0;
  5.   unsigned char status;
  6.   BoardConfig(0xf0);
  7.   Init_Port();
  8.   InitUART();
  9.   Port_init();   //系統(tǒng)初始化,設(shè)置IO口屬性
  10.   delay_ms(100); //延時100ms
  11.   LCD_init();    //液晶參數(shù)初始化設(shè)置
  12.   LCD_clear();   //清屏
  13.   LCD_Desk1();
  14.   _EINT();
  15.   PcdReset();     //復(fù)位RC522
  16.   PcdAntennaOn(); //開啟天線發(fā)射
  17.   while (1)
  18.   {
  19.     status = PcdRequest(PICC_REQIDL, Temp); ////尋卡,輸出為卡類型
  20.     if (status == MI_OK)
  21.       status = PcdAnticoll(UD); //防沖撞處理,輸出卡片序列號,4字節(jié)
  22.     if (status == MI_OK)
  23.       status = PcdSelect(UD); //選擇卡片,輸入卡片序列號,4字節(jié)
  24.     if (status == MI_OK)
  25.       status = PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UD); //在進(jìn)行讀寫操作之前需要先進(jìn)行認(rèn)證
  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.   }
復(fù)制代碼
其中
status == incharg();//讀
incharg 函數(shù)
這一部分是自己編寫用于讀寫存儲器內(nèi)容,并且進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換功能的函數(shù)。
  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;               //充值后整數(shù)部分的額度
  9.   long int re;

  10.   temp1[0] = '\0';
  11.   temp2[0] = '\0';
  12.   memset(money, 0, sizeof(money)); //清空錢包臨時數(shù)組
  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];//存儲芯片寄存器讀出來的內(nèi)容,并且調(diào)換高低位(因?yàn)榇鎯Φ臅r候,按照低位在前的順序)
  19.     }
  20.     itoa(money[0], temp1, 16);       //十六進(jìn)制數(shù)值轉(zhuǎn)十六進(jìn)制字符串(字符串無法進(jìn)行計(jì)算)
  21.     itoa(money[1], temp2, 16);       //十六進(jìn)制數(shù)值轉(zhuǎn)十六進(jìn)制字符串(字符串無法進(jìn)行計(jì)算)
  22.     strcat(temp1, temp2);            //將兩個char類型連接。輸出temp1=temp1temp2
  23.     inteDec = str_dec(temp1);        //余額整數(shù) 十六進(jìn)制字符串轉(zhuǎn)十進(jìn)制數(shù)
  24.     temp1[0] = '\0';                 // 字符常量占一個字節(jié)的內(nèi)存空間
  25.     temp2[0] = '\0';                 // 字符常量占一個字節(jié)的內(nèi)存空間
  26.     memset(money, 0, sizeof(money)); //將money中當(dāng)前位置后面清零 。
  27.     sum = inputnum + inteDec; //充值后余額整數(shù)部分之和
  28.     re = sum;
  29.     Int_char(re);            //十進(jìn)制轉(zhuǎn)字符串
  30.     led();                   //led燈亮
  31.     LCD_clear();             //清屏
  32.     LCD_Desk2();             //lcd顯示正在充值
  33.     while (Result[i] != '\0')
  34.     {
  35.      LCD_write_str(Result); //lcd顯示10進(jìn)制字符串
  36.      i++;
  37.     }
  38.     delay_ms(1800);
  39.   }
  40.     if(sum<65536)              //將充值完畢的余額總數(shù)再次存儲到寄存器內(nèi)。
  41.   {
  42.     itoa(sum,money_inch_hex,16);     //10進(jìn)制數(shù)值轉(zhuǎn)為16進(jìn)制字符串,整數(shù)部分
  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進(jìn)制字符串轉(zhuǎn)為16進(jìn)制字節(jié)數(shù)組
  76.     for(num=0;num<2;num++)         //置高位在前
  77.     {
  78.       money_ok[num]=money_i[1-num];
  79.     }
  80.   }

  81.     return status2;  //返回判斷值
復(fù)制代碼
函數(shù)功能基本實(shí)現(xiàn),因?yàn)槭菍?shí)現(xiàn)充值功能,所以為了防止連續(xù)多次充值,在主函數(shù)最后設(shè)置了break環(huán)節(jié)。
在實(shí)際操作過程中,在刷卡充值的時候,不能過早的移開卡片,否則會導(dǎo)致充卡失敗。

0.png

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


評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:594608 發(fā)表于 2019-9-23 15:01 | 顯示全部樓層
講述的不夠仔細(xì),如果有什么問題,歡迎前來討論,也希望能發(fā)現(xiàn)更好的程序,因?yàn)槭浅鯇W(xué)者,我這個程序?qū)嶋H運(yùn)行會有一些問題。
例如漢字顯示偶爾出現(xiàn)問題
偶爾出現(xiàn)閃屏
刷卡周期過長
如果有更佳的程序,希望你也會和我分享
請聯(lián)系我的QQ

歡迎討論!
回復(fù)

使用道具 舉報

ID:594608 發(fā)表于 2019-9-23 15:02 | 顯示全部樓層
待會還會更新一個扣費(fèi)模塊的,主要是希望實(shí)現(xiàn)連續(xù)扣費(fèi)
回復(fù)

使用道具 舉報

ID:429156 發(fā)表于 2019-9-26 14:36 | 顯示全部樓層
公交卡充值是不是數(shù)據(jù)有加密保護(hù),不然別人搞個同樣的機(jī)器也能沖
回復(fù)

使用道具 舉報

ID:594608 發(fā)表于 2019-9-26 16:54 | 顯示全部樓層
xiaomi_51hei 發(fā)表于 2019-9-26 14:36
公交卡充值是不是數(shù)據(jù)有加密保護(hù),不然別人搞個同樣的機(jī)器也能沖

是的,我猜測是可以修改卡片內(nèi)的密碼在和充值機(jī)器密碼校驗(yàn)。剛剛學(xué)習(xí)單片機(jī),有許多不完善的地方
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表