實驗目的 1. 最基礎實現刷卡后顯示沖值/扣款說明 2. 實現芯片內部寄存器的讀寫,實現可記憶性。 設計思路
根據M1射頻卡與讀寫器的通訊過程,程序設計基本流程如下:
1569221583(1).jpg (19.46 KB, 下載次數: 96)
下載附件
2019-9-23 14:53 上傳
主函數架構: - void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // 關看門狗
- int i = 0;
- unsigned char status;
- BoardConfig(0xf0);
- Init_Port();
- InitUART();
- Port_init(); //系統初始化,設置IO口屬性
- delay_ms(100); //延時100ms
- LCD_init(); //液晶參數初始化設置
- LCD_clear(); //清屏
- LCD_Desk1();
- _EINT();
- PcdReset(); //復位RC522
- PcdAntennaOn(); //開啟天線發射
- while (1)
- {
- status = PcdRequest(PICC_REQIDL, Temp); ////尋卡,輸出為卡類型
- if (status == MI_OK)
- status = PcdAnticoll(UD); //防沖撞處理,輸出卡片序列號,4字節
- if (status == MI_OK)
- status = PcdSelect(UD); //選擇卡片,輸入卡片序列號,4字節
- if (status == MI_OK)
- status = PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UD); //在進行讀寫操作之前需要先進行認證
- if (status == MI_OK)
- status == incharg();//讀
- if (status == MI_OK)
- {
- status = PcdWrite(1,money_ok);//充錢
- memset(money_ok,0,sizeof(money_ok));
- break;
- }
- }
- LCD_clear(); //清屏
- LCD_Desk3();
- led();
- }
復制代碼其中 status == incharg();//讀 incharg 函數 這一部分是自己編寫用于讀寫存儲器內容,并且進行數據類型轉換功能的函數。 - char incharg(void)
- {
- unsigned char g_ucTempbuf[20];
- unsigned char num;
- unsigned char temp1[10];
- unsigned char temp2[5];
- unsigned char status2;
- long int sum = 0; //充值后整數部分的額度
- long int re;
- temp1[0] = '\0';
- temp2[0] = '\0';
- memset(money, 0, sizeof(money)); //清空錢包臨時數組
- status2 = PcdRead(1, g_ucTempbuf);//讀塊2部分
- if (status2 == MI_OK)
- {
- for (num = 0; num < 2; num++)
- {
- money[num] = g_ucTempbuf[1 - num];//存儲芯片寄存器讀出來的內容,并且調換高低位(因為存儲的時候,按照低位在前的順序)
- }
- itoa(money[0], temp1, 16); //十六進制數值轉十六進制字符串(字符串無法進行計算)
- itoa(money[1], temp2, 16); //十六進制數值轉十六進制字符串(字符串無法進行計算)
- strcat(temp1, temp2); //將兩個char類型連接。輸出temp1=temp1temp2
- inteDec = str_dec(temp1); //余額整數 十六進制字符串轉十進制數
- temp1[0] = '\0'; // 字符常量占一個字節的內存空間
- temp2[0] = '\0'; // 字符常量占一個字節的內存空間
- memset(money, 0, sizeof(money)); //將money中當前位置后面清零 。
- sum = inputnum + inteDec; //充值后余額整數部分之和
- re = sum;
- Int_char(re); //十進制轉字符串
- led(); //led燈亮
- LCD_clear(); //清屏
- LCD_Desk2(); //lcd顯示正在充值
- while (Result[i] != '\0')
- {
- LCD_write_str(Result); //lcd顯示10進制字符串
- i++;
- }
- delay_ms(1800);
- }
- if(sum<65536) //將充值完畢的余額總數再次存儲到寄存器內。
- {
- itoa(sum,money_inch_hex,16); //10進制數值轉為16進制字符串,整數部分
- i=strlen(money_inch_hex);
- switch(i)
- {
- case 0:
- for(num=0;num<4;num++)
- {
- money_inch_hex[num]='0';
- }
- money_inch_hex[4]='\0';
- break;
- case 1:
- money_inch_hex[4]='\0';
- money_inch_hex[3]=money_inch_hex[0];
- money_inch_hex[2]='0';
- money_inch_hex[1]='0';
- money_inch_hex[0]='0';
- break;
- case 2:
- money_inch_hex[4]='\0';
- money_inch_hex[3]=money_inch_hex[1];
- money_inch_hex[2]=money_inch_hex[0];
- money_inch_hex[1]='0';
- money_inch_hex[0]='0';
- break;
- case 3:
- money_inch_hex[4]='\0';
- money_inch_hex[3]=money_inch_hex[2];
- money_inch_hex[2]=money_inch_hex[1];
- money_inch_hex[1]=money_inch_hex[0];
- money_inch_hex[0]='0';
- break;
- }
- StringToHex(money_i, money_inch_hex); //16進制字符串轉為16進制字節數組
- for(num=0;num<2;num++) //置高位在前
- {
- money_ok[num]=money_i[1-num];
- }
- }
- return status2; //返回判斷值
復制代碼函數功能基本實現,因為是實現充值功能,所以為了防止連續多次充值,在主函數最后設置了break環節。 在實際操作過程中,在刷卡充值的時候,不能過早的移開卡片,否則會導致充卡失敗。 
0.png (8.86 KB, 下載次數: 95)
下載附件
2019-9-23 15:46 上傳
全部資料51hei下載地址:
4.公交卡充值功能實現.rar
(90.19 KB, 下載次數: 31)
2019-9-23 14:55 上傳
點擊文件名下載附件
RC522+RFID+MSP430公交卡飯卡充值 下載積分: 黑幣 -5
|