本人調(diào)試通過。
51hei.png (8.54 KB, 下載次數(shù): 54)
下載附件
2021-7-15 03:51 上傳
單片機源程序如下:
- #include <STDIO.H>
- #include <string.h>
- #include "reg52.h"
- #include "main.h"
- #include "rc522.h"
- #include "1602.h"
- //////////////////CPU卡的指令/////////////////////////////////////////////////////////////////////////////////
- unsigned char code Keyfile[7] ={0x3F, 0x00, 0xB0, 0x01, 0xF0, 0xFF, 0xFF}; //建密鑰文件
- unsigned char code DefaultKey[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //原始外部密鑰
- unsigned char code ExKey[5] ={0x39, 0xF0, 0xF0, 0xAA, 0x55}; ////外部密鑰建立的指令信息
- unsigned char code DFfile[13] ={0x38,0x05,0x20,0xF0,0xF0,0x95,0xFF,0xFF,0x44,0x44,0x46,0x30,0x31};//建立的DF文件
- unsigned char code EF_KEY_File[7]={0x3F, 0x01, 0x8F, 0x95, 0xF0, 0xFF, 0xFF};//建立EF密鑰文件
- unsigned char code C_KEY[8]={0x3A, 0xF0, 0xEF, 0x44, 0x55, 0x12, 0x34, 0x56}; //增加口令密鑰
- unsigned char code EF_File1[7]={0x28, 0x00, 0x1E, 0xF0, 0xF0, 0xFF, 0xFF};// 基本文件EF 建立的二進制文件1
- unsigned char code EF_File2[7]={0x28, 0x00, 0x0F, 0xF4, 0xF0, 0xFF, 0xFF};// 基本文件EF 建立的二進制文件2
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////文件標識的定義/////////////////////////////////////////////////////////////////////////////////
- unsigned char code MF_File_Flag[2] = {0x3f,0x00}; //MF文件標識3F00//
- unsigned char code KEY_File_Flag[2] = {0x00,0x00}; //密鑰文件標識0000//
- unsigned char code KEY_Flag = {0x00}; //密鑰標識00,即放在MF下密鑰文件里面的密鑰,用1個字節(jié)表示 //
- unsigned char code DF_File_Flag[2] = {0x3f,0x01}; //DF文件標識3F01//
- unsigned char code KEY_DF_File_Flag[2] = {0x00,0x01}; //DF下的密鑰文件標識0001//
- unsigned char code Keyword_DF_Flag = {0x01}; //密鑰標識01,即放在DF下密鑰文件里面的密鑰,用1個字節(jié)表示 //
- unsigned char code EF_File3_Flag[2] = {0x00,0x03}; //EF文件標識0003//
- unsigned char code EF_File4_Flag[2] = {0x00,0x04}; //EF文件標識0004//
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- unsigned char xdata g_ucTempbuf[MAXRLEN];
- unsigned char xdata Rec_Buf[MAXRLEN]; //接收到串口助手的數(shù)據(jù)緩存器
- unsigned char WorkInt; //成功接收指令的標志
- unsigned char Cmd_Len; //指令長度
- void delay1(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void UART_Init()
- {
- PCON=0x80; //PCON的最高位SMOD=1時波特率加倍
- TMOD=0x20; //時器1為方式2 初值自動裝入 產(chǎn)生波特率
- TH1=0xfd; //定時器初始為0XFd,晶振為22.1184MHz,本函數(shù)實際產(chǎn)生的波特率為38400bps
- TL1=0xfd; //同上
- SCON=0x50; //串口設置為方式1,REN=1,允許接收
- TR1=1; //啟動定時器1
- ES=1; //使能串口接收中斷,
- EA=1; //打開所有中斷
- }
- /**************************************************************************
- - 功能描述:51單片機的串口發(fā)送字節(jié)的函數(shù)
- - 隸屬模塊:STC51串口操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:mydata:要發(fā)送的一個字節(jié)
- - 返回說明:無
- - 注:發(fā)送一個字節(jié),是串口發(fā)送的基礎(chǔ)操作
- **************************************************************************/
- void UART_Send_Byte(unsigned char mydata)
- {
- ES=0;
- TI=0;
- SBUF=mydata;
- while(!TI);
- TI=0;
- ES=1;
- }
- /**************************************************************************
- - 功能描述:51單片機的串口發(fā)送0d 0a ,即回車換行
- - 隸屬模塊:STC51串口操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:無
- - 返回說明:無
- - 注:此函數(shù)就是發(fā)送0d 0a這兩個字節(jié),在“超級終端”上會有回車換行的效果
- **************************************************************************/
- void UART_Send_Enter()
- {
- UART_Send_Byte(0x0d);
- UART_Send_Byte(0x0a);
- }
- /**************************************************************************
- - 功能描述:51單片機的串口發(fā)送字符串
- - 隸屬模塊:STC51串口操作
- - 函數(shù)屬性:外部,使用戶使用
- - 參數(shù)說明:s:指向字符串的指針
- - 返回說明:無
- - 注:如果在字符串中有'\n',則會發(fā)送一個回車換行
- **************************************************************************/
- void UART_Send_Str(char *s)
- {
- int len=strlen(s)-1;
- int i;
- for(i=0;i<len;i++)
- UART_Send_Byte(s[i]);
- if(s[i]=='\n')
- {
- UART_Send_Enter();
- }
- else
- {
- UART_Send_Byte(s[i]);
- }
- }
- /////////////////////////////////////////////////////////////////////
- //串行中斷,接收串口助手發(fā)來的數(shù)據(jù)
- /////////////////////////////////////////////////////////////////////
- seri_int () interrupt 4 using 1
- {
- unsigned char len, i;
- unsigned int j=0;
- if (RI)
- {
- ES=0;
- len=SBUF;
- RI=0;
- for(i=0;i<len;i++)
- {
- while(!RI)
- {
- j++;
- if(j>1000)
- {
- ES=1;
- break;
- }
- }
- if(j<1000)
- {
- Rec_Buf[i]=SBUF;
- RI=0;
- j=0;
- }
- else
- {
- ES=1;
- break;
- }
- }
- if(i==len)
- {
- ES=1;
- Cmd_Len=len;
- WorkInt = 1;
-
- }
- }
- }
-
- void u8tostr(unsigned char dat)
- {
- switch(dat>>4) //高位
- {
- case 0: UART_Send_Byte(0x30); break;
- case 1: UART_Send_Byte(0x31); break;
- case 2: UART_Send_Byte(0x32); break;
- case 3: UART_Send_Byte(0x33); break;
- case 4: UART_Send_Byte(0x34); break;
- case 5: UART_Send_Byte(0x35); break;
- case 6: UART_Send_Byte(0x36); break;
- case 7: UART_Send_Byte(0x37); break;
- case 8: UART_Send_Byte(0x38); break;
- case 9: UART_Send_Byte(0x39); break;
- case 0x0A: UART_Send_Byte(0x41); break;
- case 0x0B: UART_Send_Byte(0x42); break;
- case 0x0C: UART_Send_Byte(0x43); break;
- case 0x0D: UART_Send_Byte(0x44); break;
- case 0x0E: UART_Send_Byte(0x45); break;
- case 0x0F: UART_Send_Byte(0x46); break;
- }
- switch(dat&0x0f) //低位
- {
- case 0: UART_Send_Byte(0x30); break;
- case 1: UART_Send_Byte(0x31); break;
- case 2: UART_Send_Byte(0x32); break;
- case 3: UART_Send_Byte(0x33); break;
- case 4: UART_Send_Byte(0x34); break;
- case 5: UART_Send_Byte(0x35); break;
- case 6: UART_Send_Byte(0x36); break;
- case 7: UART_Send_Byte(0x37); break;
- case 8: UART_Send_Byte(0x38); break;
- case 9: UART_Send_Byte(0x39); break;
- case 0x0A: UART_Send_Byte(0x41); break;
- case 0x0B: UART_Send_Byte(0x42); break;
- case 0x0C: UART_Send_Byte(0x43); break;
- case 0x0D: UART_Send_Byte(0x44); break;
- case 0x0E: UART_Send_Byte(0x45); break;
- case 0x0F: UART_Send_Byte(0x46); break;
- }
-
- }
- void UART_Put_Num(unsigned char * dat,unsigned char len)
- {
- unsigned char i;
-
- for(i=0;i<len;i++)
- {
- u8tostr(dat[i]);
- }
- UART_Send_Enter();
- }
- //////////////////////////////////////////////////////////////////////////////
- void main( )
- {
- unsigned char status;
- unsigned char tt[2],st[2];
- unsigned int sst=0;
- InitSystem( );
- lcd_int();
- RC522_Init();
- PcdAntennaOff();
- PcdAntennaOn();
- display_welcome();
- delay1(500);
- BEEP=0;
- delay1(100);
- BEEP=1;
- memset(g_ucTempbuf, 0x00, MAXRLEN); //清0
- while(1)
- {
- if(WorkInt)
- {
- WorkInt=0;
-
- if((Cmd_Len==1)&&(Rec_Buf[0]==0xAA)) //尋卡及復位只操作一次 約定指令為:01AA
- {
- Rec_Buf[0]=0;
- Cmd_Len=0;
- if(GetCard(PICC_REQALL,tt,g_ucTempbuf)!=ST_OK) //尋卡函數(shù)
- {
- UART_Send_Str("無卡!");
- UART_Send_Enter();
- continue;
- } //尋卡失敗返回
- else
- {
- UART_Send_Str("類型:");
- UART_Put_Num(tt,2); //串口助手顯示返回
- UART_Send_Enter();
- UART_Send_Str("卡號:");
- UART_Put_Num(g_ucTempbuf,4); //串口助手顯示返回
- UART_Send_Enter();
-
- }
- memset(g_ucTempbuf, 0x00, MAXRLEN); //清0
- if (CardReset(g_ucTempbuf,st)!=ST_OK) //CPU卡復位函數(shù)
- {
- UART_Send_Str("復位失敗!");
- UART_Send_Enter();
- continue;
- }
- UART_Send_Str("復位成功!");
- UART_Send_Str("返回ATS值:");
- UART_Send_Enter();
- UART_Put_Num(g_ucTempbuf,st[0]); //串口助手顯示返回
- UART_Send_Enter();
- memset(g_ucTempbuf, 0x00, MAXRLEN); //清0
- BEEP=0;
- delay1(500);
- BEEP=1;
- continue;
- }
- status=Pcd_Cmd(Rec_Buf, Cmd_Len, g_ucTempbuf,tt);
- if(status) //1時出錯了
- {
- Cmd_Len=0;
- memset(Rec_Buf, 0x00, MAXRLEN);
- memset(g_ucTempbuf, 0x00, MAXRLEN); //清0
- UART_Send_Str("操作失敗!");
-
- UART_Send_Enter();
- continue; //返回
- }
-
- UART_Put_Num(&g_ucTempbuf[2],tt[0]); //串口助手顯示返回狀態(tài)
- BEEP=0;
- delay1(100);
- BEEP=1;
- delay1(100);
- BEEP=0;
- delay1(100);
- BEEP=1;
-
- memset(g_ucTempbuf, 0x00, MAXRLEN); //清0
-
- }
-
- }
- }
- /////////////////////////////////////////////////////////////////////
- //系統(tǒng)初始化
- /////////////////////////////////////////////////////////////////////
- void InitSystem()
- {
-
- P0 = P1 = P2 = P3 = 0xFF;
- UART_Init();
- }
復制代碼
所有資料51hei提供下載:
RC522_CPU卡.rar
(126.91 KB, 下載次數(shù): 49)
2021-7-14 20:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|