基于MFRC500射頻芯片和51單片機的13.56MHzRFID射頻識別系統的讀寫程序。
單片機源程序如下:
- /****************************************************************************
- * File: MAIN.C *
- * Version: 飯卡打卡系統簡化版1.0 *
- * Created: 2007.11.30 *
- * Last Change: 2008.5.15 *
- * Author: *
- * QQ: *
- * EMail: *
- * Compiler: KEIL C51 uVision2 V2.23 *
- * Description: 操作流程:先讀卡,等待鍵盤輸入,再寫卡 *
- * 注意:鍵盤輸入后,卡不能抽走,不然數據流失! *
- * 注意:程序共有18個警告,因為有些函數暫時沒用到! *
- * 注意:暫沒小數顯示,由于以后考慮用以太網通訊,故沒加進UATR通訊*
- * 留言:謝謝Hexing的幫助,如果大家對程序有什么意見可以隨時找我 *
- ****************************************************************************/
- #include "main.h"
- #include "m500a.h"
- #include "PORT.h"
- #include "delay.h"
- #include "LCD_Key.h"
- /*************************公有變量定義**********************************************/
- bit KEY_SCAN_G; //鍵盤掃描標志
- bit W_CARD_SCAN_G; //寫卡掃描標志
- tWord Card_Money; //最大值這里只取9999,顯示4位數金額
- tByte LCD_Money[5]; //卡中金額顯示緩沖區
- tByte LCD_Key[6]=" "; //初始化按鍵顯示緩沖區,保證數組最后字節存有結束符'\0'
- tByte temp; //臨時變量
- tByte tt1[2]; //存放卡類型號
- tByte Snr_RC500[4]; //存放rc500序列號
- tByte AbsoluteBlock = 8; //對絕對塊8進行操作, 取值范圍為 0 <= AbsoluteBlock < 64
- tByte data cardserialno[4]; //存放卡號
- tByte idata blockdata[16]; //絕對塊8數據緩沖區,注意其儲存模式 idata
- /************************私有函數原型**************************************************/
- void MCU_Init(void); //單片機初始化函數
- void BEEP_Ctrl(void); //蜂鳴器控制函數
- tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno); //卡激活函數
- tByte MF_Read (tByte AbsoluteBlock,tByte idata *blockdata); //讀卡函數
- tByte MF_Write (tByte AbsoluteBlock,tByte idata *blockdata); //寫卡函數
- tByte data RC500_Disp[13];
- void hex_ten(unsigned char *RC500_St);
- /*****************************************************************************************
- 函數名稱:主函數
- 函數輸入:
- 函數輸出:
- 函數功能:
- ******************************************************************************************/
- void main (void)
- {
- /*************************硬件初始化**********************************************/
- MCU_Init();
- M500PCD_Init();
- KEYPAD_Init();
- LCD_Init();
- LCD_China_Disp();
- BEEP_Ctrl(); //聲音提示1,所有初始化完成,等待讀卡
- /*************************大循環執行**********************************************/
- while(1)
- {
- temp=MF_Active( AbsoluteBlock,cardserialno); //激活一張卡
- if(temp!=MI_OK)
- {
- continue; //跳到 while 入口
- }
- temp=MF_Read(AbsoluteBlock,blockdata); //讀卡數據
- if(temp!=MI_OK)
- {
- continue;
- }
- BEEP_Ctrl();
- hex_ten(cardserialno); //聲音提示2,讀卡成功,等待鍵盤掃描
- put_char(4,30,RC500_Disp);
- /*************************按鍵掃描循環**********************************************/
- KEY_SCAN_G=1; //允許鍵盤掃描
- while(KEY_SCAN_G)
- {
- Card_Money=blockdata[0]+blockdata[1]*256; //合并絕對塊8前兩字節
- LCD_Money[0]=Card_Money/1000+48; //裝載千位數據
- LCD_Money[1]=Card_Money%1000/100+48; //百位
- LCD_Money[2]=Card_Money%1000%100/10+48; //十位
- LCD_Money[3]=Card_Money%1000%100%10+48; //個位
- LCD_Money[4]='\0'; //結束符
- LCD_KEY_Update(); //鍵盤和LCD刷新
- delay_nms(30); //每隔30毫秒掃描一次鍵盤
- }
- /*************************寫入卡循環**********************************************/
- W_CARD_SCAN_G=1; //允許寫卡掃描
- while(W_CARD_SCAN_G)
- {
- blockdata[0]=Card_Money%256; //分解回字節數據,準備寫回到絕對塊8
- blockdata[1]=Card_Money/256;
- temp=MF_Active( AbsoluteBlock,cardserialno); //激活同一張卡
- if(temp!=MI_OK)
- {
- continue;
- }
- temp=MF_Write(AbsoluteBlock,blockdata); //寫數據入卡
- if(temp!=MI_OK)
- {
- continue;
- }
- W_CARD_SCAN_G=0; //清循環標志,跳出while循環
- BEEP_Ctrl();
- put_char(4,30," ");//聲音提示3,表示寫卡完成,用戶可以取走卡
- delay_nms(1000);
- } //注意:聲音提示后的1秒延遲期間,必須拿走卡,否則體統重新讀卡
- }
- }
- /*————————————————————————————————————————————main函數結束———————————————————————————————————————*/
- /*****************************************************************************************
- 函數名稱:tByte MF_Active 激活卡函數
- 函數輸入:tByte AbsoluteBlock,tByte data *cardserialno
- 函數輸出:
- 函數功能:激活A類卡類型
- ******************************************************************************************/
- tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno)
- {
- tByte status1;
- tByte *sak1;
- /*********************尋卡***************************/
- status1 = M500PiccRequest(PICC_REQALL, tt1);
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
- /********************防碰撞**************************/
- status1=M500PiccAnticoll(0,cardserialno);
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
- /*********************選擇卡*************************/
- status1=M500PiccSelect(cardserialno,sak1);
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
- /*************************授權********************************/
- status1 = M500PiccAuth(PICC_AUTHENT1A, cardserialno, 1, AbsoluteBlock);
- if (status1!=MI_OK) //對第八塊(絕對地址)進行授權, 也就是第三個扇區第一塊
- {
- return(FM1715_REQERR);
- }
-
- return MI_OK;
- }
- /*****************************************************************************************
- 函數名稱:tByte MF_Read 讀卡函數
- 函數輸入:tByte AbsoluteBlock,tByte idata *blockdata
- 函數輸出:
- 函數功能:讀取射頻卡的數據
- ******************************************************************************************/
- tByte MF_Read(tByte AbsoluteBlock,tByte idata *blockdata)
- {
- tByte status1;
- status1=M500PiccRead(AbsoluteBlock, blockdata);
-
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
-
- return MI_OK;
- }
- /*****************************************************************************************
- 函數名稱:tByte MF_Write 寫卡函數
- 函數輸入:tByte AbsoluteBlock,tByte idata *blockdata
- 函數輸出:
- 函數功能:寫入射頻卡數據
- ******************************************************************************************/
- tByte MF_Write(tByte AbsoluteBlock,tByte idata *blockdata)
- {
- tByte status1;
- status1 = M500PiccWrite(AbsoluteBlock,blockdata);
-
- if (status1!=MI_OK)
- {
- return(FM1715_REQERR);
- }
- return MI_OK;
- }
- /*****************************************************************************************
- 函數名稱:MCU_Init函數
- 函數輸入:
- 函數輸出:
- 函數功能:初始化RC500
- ******************************************************************************************/
- void MCU_Init(void)
- {
- RC500RST = FALSE;
- RC500_CS = TRUE; // Enable the CS for RC500
- IT0 = 1; // Config ext0 as edge trigger for RC500
- EX0 = 1; // Enable ext0 interrupt for RC500
- EA = TRUE; // Enable all interrupts
- }
- /*****************************************************************************************
- 函數名稱:BEEP_Ctrl (void) 蜂鳴器驅動初始化
- 函數輸入:
- 函數輸出:
- 函數功能:有源蜂鳴器
- ******************************************************************************************/
- void BEEP_Ctrl (void)
- {
- BEEP = OFF;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于MFRC500讀卡芯片的讀卡程序-帶4-3鍵盤輸入和12864液晶.zip
(244.28 KB, 下載次數: 42)
2017-10-3 15:22 上傳
點擊文件名下載附件
13.56MHz
|