标题:
单片机+RC522串口助手操作CPU卡源程序
[打印本页]
作者:
chinafjt
时间:
2021-7-14 20:56
标题:
单片机+RC522串口助手操作CPU卡源程序
本人调试通过。
51hei.png
(8.54 KB, 下载次数: 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个字节表示 //
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个字节表示 //
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]; //接收到串口助手的数据缓存器
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 初值自动装入 产生波特率
TH1=0xfd; //定时器初始为0XFd,晶振为22.1184MHz,本函数实际产生的波特率为38400bps
TL1=0xfd; //同上
SCON=0x50; //串口设置为方式1,REN=1,允许接收
TR1=1; //启动定时器1
ES=1; //使能串口接收中断,
EA=1; //打开所有中断
}
/**************************************************************************
- 功能描述:51单片机的串口发送字节的函数
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:mydata:要发送的一个字节
- 返回说明:无
- 注:发送一个字节,是串口发送的基础操作
**************************************************************************/
void UART_Send_Byte(unsigned char mydata)
{
ES=0;
TI=0;
SBUF=mydata;
while(!TI);
TI=0;
ES=1;
}
/**************************************************************************
- 功能描述:51单片机的串口发送0d 0a ,即回车换行
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:无
- 返回说明:无
- 注:此函数就是发送0d 0a这两个字节,在“超级终端”上会有回车换行的效果
**************************************************************************/
void UART_Send_Enter()
{
UART_Send_Byte(0x0d);
UART_Send_Byte(0x0a);
}
/**************************************************************************
- 功能描述:51单片机的串口发送字符串
- 隶属模块:STC51串口操作
- 函数属性:外部,使用户使用
- 参数说明:s:指向字符串的指针
- 返回说明:无
- 注:如果在字符串中有'\n',则会发送一个回车换行
**************************************************************************/
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]);
}
}
/////////////////////////////////////////////////////////////////////
//串行中断,接收串口助手发来的数据
/////////////////////////////////////////////////////////////////////
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) //寻卡函数
{
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卡复位函数
{
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]); //串口助手显示返回状态
BEEP=0;
delay1(100);
BEEP=1;
delay1(100);
BEEP=0;
delay1(100);
BEEP=1;
memset(g_ucTempbuf, 0x00, MAXRLEN); //清0
}
}
}
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitSystem()
{
P0 = P1 = P2 = P3 = 0xFF;
UART_Init();
}
复制代码
所有资料51hei提供下载:
RC522_CPU卡.rar
(126.91 KB, 下载次数: 49)
2021-7-14 20:56 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1