📄 read_write_card.txt
字号:
rxdbuff[4]=0x00;
rxdbuff[5]=0x00;
rxdbuff[6]=0x51;
rxdbuff[7]=0x0d;
uarttxd(7);
rxdi=0;//清空
Delay_10ms();Delay_10ms();//Delay_10ms();Delay_10ms();
// for (i=0;i<20;i++) Delay_10ms();
n=0;
while (n<30)
{
if (rxdbuff[4]==0x0d) break;
if (rxdi>=6) break;
Delay_10ms();
n++;
}
rxdi=0;
if (rxdbuff[1]==0x02) return 0;//成功
else return 1;//失败
}
/////////////////密码验证(只用A密码)//////////
BYTE SetPassword()
{
uint n;
//uchar i;
//下传命令:3C 0A 01 69 00(A套密码) 00(扇区号=00~15) 六字节卡密码 BCC 0D
//成功返回:3C 02 00 00 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D
Delay_10ms(); Delay_10ms();
rxdbuff[0]=0x3c;
rxdbuff[1]=0x0a;
rxdbuff[2]=0x01;
rxdbuff[3]=0x69;
rxdbuff[4]=0x00;//01
rxdbuff[5]=0x00;//00~15
////////////// 六字节密码
rxdbuff[6]=0xff;
rxdbuff[7]=0xff;
rxdbuff[8]=0xff;
rxdbuff[9]=0xff;
rxdbuff[10]=0xff;
rxdbuff[11]=0xff;
///////////// 六字节密码
rxdbuff[12]=XORCheck(rxdbuff,12);
rxdbuff[13]=0x0d;
uarttxd(13); //发密码
// rxdbuff[15]=0;
rxdi=0;
//////////////////////////////////////////////
n=0;
while (n<30)
{
if (rxdbuff[4]==0x0d) break;//错误返回
if (rxdi>=6) break;
Delay_10ms();
n++;
}
rxdi=0;
if (rxdbuff[1]==0x02) return 0;
else return 1;
// rxdbuff[4]=0;
}
////////////////读指定块号处得到16位//////////////////////////////
BYTE ReadCard(BYTE BlockNo) //耗时
{
BYTE i,value;
uint n=0;
/////////////////////////////////密码验证
///下传命令:3C 08 01 6A 00(A密码或B密码01) 00(块号) 四字节卡号 BCC 0D
///成功返回:3C 02 00 00 BCC 0D
///错误返回:3C 01 FF(错误代码) BCC 0D
Delay_10ms(); Delay_10ms();
// Delay_10ms(); Delay_10ms();
// Delay_10ms(); Delay_10ms(); Delay_10ms(); Delay_10ms();
rxdbuff[0]=0x3c; //密码验证
rxdbuff[1]=0x08;
rxdbuff[2]=0x01;
rxdbuff[3]=0x6a;
rxdbuff[4]=0x00;//01
rxdbuff[5]=BlockNo;//
///////////////////////////
rxdbuff[6]=CardNO1[0];
rxdbuff[7]=CardNO1[1];
rxdbuff[8]=CardNO1[2];
rxdbuff[9]=CardNO1[3];
rxdbuff[10]=XORCheck(rxdbuff,10);
rxdbuff[11]=0x0d;
uarttxd(11);
rxdi=0;
//////////////////////////////////////////////
Delay_10ms();
n=0;
while (n<30)
{
if (rxdbuff[4]==0x0d) break;
if (rxdi>=6) break;
Delay_10ms();
n++;
}
rxdi=0;
if (rxdbuff[1]!=0x02)
{value=1;//不成功
goto rcardret;};
//--------- rxdbuff[4]=0;
///////////////////////////////////////////////////
//3C 04 01 66 00(绝对块号) 00 BCC 0D
// 成功返回:3C 17 00 DATA0~DATA15 BCC 0D
// 错误返回:3C 01 FF(错误返回代码) BCC 0D
Delay_10ms(); Delay_10ms();
rxdbuff[0]=0x3c; //读卡命令
rxdbuff[1]=0x04;
rxdbuff[2]=0x01;
rxdbuff[3]=0x66;
rxdbuff[4]=BlockNo;//
rxdbuff[5]=0x00;
rxdbuff[6]=XORCheck(rxdbuff,6);
rxdbuff[7]=0x0d;
uarttxd(7); //发读命令
rxdi=0;
//////////////////////////////////////////////
n=0;
while (n<30)
{
if (rxdbuff[4]==0x0d) break;
if (rxdi>=21) break;
Delay_10ms();
n++;
}
value=(rxdbuff[1]==0x17)?0:1;
rxdi=0;
for(i = 0; i < 16; i++)
CardData[i] = rxdbuff[i+3];
rcardret:
CloseCard();
return value;
}
///////////////////在指定地方写卡///////////////////////////
BYTE WriteCard(BYTE BlockNo)
{ uchar i,value;
uint n=0;
/////////////////////////////////密码验证
///下传命令:3C 08 01 6A 00(A密码或B密码01) 00(块号) 四字节卡号 BCC 0D
///成功返回:3C 02 00 00 BCC 0D
///错误返回:3C 01 FF(错误代码) BCC 0D
Delay_10ms(); Delay_10ms();
rxdbuff[0]=0x3c; //密码验证
rxdbuff[1]=0x08;
rxdbuff[2]=0x01;
rxdbuff[3]=0x6a;
rxdbuff[4]=0x00;
rxdbuff[5]=BlockNo;//
///////////////////////////
rxdbuff[6]=CardNO1[0];
rxdbuff[7]=CardNO1[1];
rxdbuff[8]=CardNO1[2];
rxdbuff[9]=CardNO1[3];
//////////////////////////
rxdbuff[10]=XORCheck(rxdbuff,10);
rxdbuff[11]=0x0d;
uarttxd(11);
rxdi=0;
//////////////////////////////////////////////
Delay_10ms();
n=0;
while (n<30)
{
if (rxdbuff[4]==0x0d) break;
if (rxdi>=6) break;
Delay_10ms();
n++;
}
rxdi=0;
if (rxdbuff[1]!=0x02)
{value=1;
goto wcardret;}
// rxdbuff[4]=0;
///////////////////////////////////////////////////
//写卡:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
//成功返回:3C 02 00 00 BCC 0D
//错误返回:3C 01 FF(错误返回代码) BCC 0D
Delay_10ms(); Delay_10ms();
rxdbuff[0]=0x3C; //卡命令
rxdbuff[1]=0x13;
rxdbuff[2]=0x01;
rxdbuff[3]=0x67;
rxdbuff[4]=BlockNo;//
for (i=0;i<16; i++)
rxdbuff[i+5]=CardData[i];
rxdbuff[21]=XORCheck(rxdbuff,21);
rxdbuff[22]=0x0d;
uarttxd(22); //写命令 由低位->高位发送
rxdi=0;
//////////////////////////////////////////////
Delay_10ms();
n=0;
while (n<30)
{
if (rxdbuff[4]==0x0d) break;
if (rxdi>=6) break;
Delay_10ms();
n++;
}
value=(rxdbuff[1]==0x02)?0:1;
if ((n==30)&&(rxdi==0)) value=2;//写失败
wcardret:
CloseCard();
return value;
}
///////////////////延时足够长时间///////////////////
void delay(unsigned int count)
{ unsigned int i; for(i=0;i<=count;i++){}; }
/////////////////////异或/////////////////////////
BYTE XORCheck(BYTE *psData,BYTE length)
{
BYTE i;
BYTE XORData;
XORData = 0;
for(i = 0; i < length; i++)
{
XORData ^= psData[i];
}
return XORData;
}
//////////////////写卡号////////////////////////////
unsigned char write_card(unsigned char cardNO)
{
unsigned char CardInOk,WriteOK;
delay(7000);
CardInOk=CardReady();
if(CardInOk!=0)return(1);
WriteOK=WriteCard(cardNO);
if(WriteOK==0)return(0);
if(WriteOK==2)return(2);
else return(1);
}
//内部晶振24。5M,波特率为9600
//TH1=0x6A;
//CKCON=XXXX0X00;
//////////////////////时钟初始化/////////////////////////
void SYSCLK_Init (void)
{
OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency
RSTSRC = 0x04; // Enable missing clock detector
}
//-----------------------------------------------------------------------------
// 串口及端口初始化
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//////////////////////串口及端口初始化//////////////////////////////////////////
void UART0_Init (void)
{
// P0SKIP=0X0c; //跳过晶振
P0MDOUT=0xff;
P1MDOUT=0xff; //系统初始化
P2MDOUT=0xff;
P3MDOUT=0xff;
P0SKIP=0x80; //跳过P0.6,用于外部中断
XBR0=0x01; //使用外部时钟,串口允许交叉开关
XBR1=0xc0; //禁止弱上拉,使能交叉译码开关
P0=P1=P2=0X00; //FF;
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
TI0 = 1; //串口发送中断标志
EA=1; // 全部中断控制
//T1=10;//不允许定时器1中断
PS0=1; //串口优先
PT1=1; //定时器1优先
IT01CF=0x0c; //配制中断数据传输外部中断寄存器,INT0端口为P0.6
IT0=1;
}
/////////////////////////定时器1初始化///////////////////////////////////
void Timer1_Init (void)
{
if (SYSCLK/BAUDRATE/2/256 <1)
{
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4)
{
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x09;
} else if (SYSCLK/BAUDRATE/2/256 < 12)
{
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
}
TL1 = TH1; // init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
}
//////////////*主函数*////////////////
void main()
{
// uchar i;
unsigned char CardInOk;
/////////////////内部初始化/////////////////
PCA0MD=0x00; //停止看门狗
SYSCLK_Init ();//时钟初始化
UART0_Init ();//串口及端口初始化
Timer1_Init ();//定时器1初始化
//////////////////////外设初始化////////////////////////////
//////////////////////主程序开始//////////////////////////
delay(20000);
// CardInOk=SetPassword(); //设置密码
for(;;) //主循环
{
delay(1800); //主循环开始
CardInOk=CardReady();
delay(15000);
CardInOk=ReadCard(1);
delay(15000);
CardInOk=write_card(1);
}
//L///////////////主程序/////////////////////
/*
while(1)
{
while(1)//提起枪
{
while(!GUN);
Delay_10ms();Delay_10ms();Delay_10ms();
if(GUN)break;
}
///开中断///
while(1)//放下枪
{
while(GUN);
Delay_10ms();Delay_10ms();Delay_10ms();
if(!GUN)break;
}
for(i=0;i<16;i++)
card_ad[i]=LEDBUF[i];
//关中断///
}
*/
//L///////////////////主程序结束////////////////
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -