📄 11t6_sc.c
字号:
for(j=0;j<100;j++);
for (i=0;i<250;i++)
for(j=0;j<100;j++);
for (i=0;i<250;i++)
for(j=0;j<100;j++);
benci=1;
//chongxinshuaka=tingzhizhi;
// for (i=0;i<16;i++)
// sen(CardDataBuf[i]);
sen(0x30);
};
//if (benci==1)keyitongxing=bofang;
//如果内容不为 0 则 嘀 嘀 嘀 响3声;
if (douweiling==0 )
{
//如果内容不为 0 则 嘀 嘀 嘀 响3声;
TurnOff_Card(); //关闭卡片
for(k=0;k<3;k++) //响3声
{
beep=bofang;
for (i=0;i<250;i++)
for(j=0;j<100;j++);
beep=tingzhi;
for (i=0;i<250;i++)
for(j=0;j<100;j++);
};
// CardBlockNo=0x0c;
// Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
// for(i=0;i<16;i++)
// CardDataBuf[i]=0x00;
// Write_Card(CardBlockNo,CardDataBuf);
//for(i=0;i<16;i++)
// CardDataBuf[i]=0x03;
// Read_Card(CardBlockNo,CardDataBuf);
// for (i=0;i<16;i++)
// sen(CardDataBuf[i]);
sen(0x33);
};
}
else //如果是非注册用户 则响 5 声;
{
//响 5 声
// keyitongxing=tingzhizhi;
//chongxinshuaka=bofang;
TurnOff_Card(); //关闭卡片
for(k=0;k<5;k++) //响5声
{
beep=bofang;
for (i=0;i<250;i++)
for(j=0;j<100;j++);
beep=tingzhi;
for (i=0;i<250;i++)
for(j=0;j<100;j++);
};
sen(0x35);
};
}
//************************************************8
void main(void)
{
uchar i,j,k;
uchar data CardNo[4],CardBlockKey[6];
uchar idata CardDataBuf[16];
bit qidongzhuangtai;
uchar CardBlockNo=02; //默认块02(0-63)
uchar BlockKeyAorB=0;//A套密码
//TL1=0xfa;
//TH1=0xfa;
//TL0=0x30;
//TH0=0x30;
// TMOD=0x21;
//SCON=0x50; // 串口工作方式1,允许接收
// PCON = 0x80;
// ET0=1;
//TR0=1;
// EA=1;
// REN=1;
// TR1=1;
PCON = 0x00; //SMOD=0
TMOD = 0x20; //Timer1:Mode2
TH1 = 0xfd; //9600Baud, 11.059M
TL1 = 0xfd;
SCON = 0x50; //mode 1,8bit UART ,SM2=0,REN=1
TR1 = 1;
Init_UART();
keyitongxing=tingzhi;
chongxinshuaka=tingzhi;
for(i=0;i<6;i++) CardBlockKey[i]=0xff;
for(i=0;i<4;i++) CardNo[i]=i+1;
//writertc(qidongzhuangtaidizhi,0x30);
qidongzhuangtai=0;
if (readrtc(qidongzhuangtaidizhi)==0x31)
qidongzhuangtai=1;
//判断是否进行过启动操作
for (i=0;i<250;i++)
for(j=0;j<200;j++);
for (i=0;i<250;i++)
for(j=0;j<200;j++);
for (i=0;i<250;i++)
for(j=0;j<200;j++);
for (i=0;i<250;i++)
for(j=0;j<200;j++);
if (qidongzhuangtai==1)
{sen(0x31);}
else
sen(0x30);
// GREEN_LINE=0; //green led on
// delay10ms(50);
// GREEN_LINE=1; //led off
// RED_LINE=0; //red led on
// delay10ms(50);
// RED_LINE=1; //led off
// display(tmpResult);
// led_cyc_on();
while(1)
{
start:
time=0;
tmpResult=0xFC;
// led_cyc_on();
// for (i=0;i<250;i++);
//for(j=0;j<100;j++);
keyitongxing=tingzhi;
chongxinshuaka=tingzhi;
// if (benci==1)keyitongxing=bofang;
keyitongxing=tingzhi;
chongxinshuaka=tingzhi;
/*-----------------------------------------------------------------------------------------------
;Step1
;通讯测试
;下传命令:3C 04 00 60 00 00 BCC 0D
;成功返回:3C 01 01 BCC 0D
;错误返回:3C 01 00 BCC 0D*/
Commu_test();
//SetRes(CardStatus,1); //Result中最高位是Commu_Test成功标志,执行此条把tmpResult的最高位置零
delay10ms(3);
//延时30ms
/*-----------------------------------------------------------------------------------------------
;Step2
;寻卡 void Search_Card(uchar *CardNo,uchar SearMode)
;下传命令:3C 04 01 70 00(寻卡模式00(IDLE)或01(ALL)) 00 BCC 0D
;成功返回:3C 05 四字节卡号 00 BCC 0D
;错误返回:3C 01 FF(错误返回代码) BCC 0D
;其中:00寻卡模式要求操作的卡在读写完成后要离开感应区才能再读写;
;01寻卡模式要求操作的卡在读写完成后卡片只需关闭后又可读写;*/
if (CardStatus) //如果通讯测试正常,则执行寻卡操作
{Search_Card(CardNo,SearMode);}
else
{
//chongxinshuaka=bofang;
//benci=0;
goto start;
};
//************************************************
//发送卡号
// for(i = 0; i<4; i++) //依次发送待合成的文本数据
// { SBUF = CardNo[i];
// while (TI == 0) ;
// TI = 0;
// //CardNo++;
// };
//************************************************
//SetRes(CardStatus,2);//Result中第二位成功标志,执行此条把tmpResult的第二位置零
delay10ms(3);
/*-----------------------------------------------------------------------------------------------
;Step3
;密码验证:void Psd_Verify(uchar *BlockKey,uchar BlockKeyAorB,uchar BlockNo,uchar *CardNo)
;下传命令:3C 0E 01 6C 六字节密码 认证模式(00-A/01-B) 绝对块号 四字节卡号 BCC 0D
;成功返回:3C 02 00 00 BCC 0D
;错误返回:3C 01 FF(错误代码) BCC 0D
;其中:0为A密码,1为B密码*/
// CardBlockNo=0x0c;
if (CardStatus) //如果寻卡正常,则执行密码验证操作
{Psd_Verify(CardBlockKey,BlockKeyAorB,CardBlockNo,CardNo);
//benci=0;
}
else
{
//chongxinshuaka=bofang;
//benci=0;
goto start;
};
//SetRes(CardStatus,3);
//sen(0xfe);
delay10ms(3);
// for(i=0;i<16;i++)
// CardDataBuf[i]=0x00;
// Write_Card(CardBlockNo,CardDataBuf);
// for(i=0;i<16;i++)
// CardDataBuf[i]=0x03;
// Read_Card(CardBlockNo,CardDataBuf);
// for (i=0;i<16;i++)
// sen(CardDataBuf[i]);
/*-----------------------------------------------------------------------------------------------
;Step4
;读卡: void Read_Card(uchar BlockNo,uchar *CardDataBuf)
;下传命令:3C 04 01 66 00(绝对块号) 00 BCC 0D
;成功返回:3C 12 00 DATA0~DATA15 BCC 0D
;错误返回:3C 01 FF(错误返回代码) BCC 0D*/
// CardBlockNo=55;
if (CardStatus) //如果密码验证通过,则执行读取块1操作
{
CardBlockNo=0x01;
Read_Card(CardBlockNo,CardDataBuf);
}
else
{
//chongxinshuaka=bofang;
goto start;
};
// SetRes(CardStatus,4);
delay10ms(3);
if (CardStatus) //如果读取块1数据正常,则执行卡类识别操作
{
if (CardDataBuf[0]==0xaa) //如果是启动卡
{
//调用网点设置程序
wangdianshezhi(CardNo);
//sen(0xee);
writertc(qidongzhuangtaidizhi,0x31); //设置启动状态数据字节
qidongzhuangtai=1;
TurnOff_Card(); //关闭卡片
sen(0x39);
for(k=0;k<1;k++) //响一长声
{
beep=bofang;
for (i=0;i<250;i++)
for(j=0;j<100;j++);
for (i=0;i<250;i++)
for(j=0;j<100;j++);
beep=tingzhi;
};
goto start;
};
if (CardDataBuf[0]==0x55 && qidongzhuangtai ) //如果是通行卡,并且处于启动状态
{ //调用网点判断及处理程序
wangdianpanduan(CardNo);
//响 1声
// sen(0x31);
// TurnOff_Card(); //关闭卡片
goto start;
};
if (CardDataBuf[0]==0x55 && qidongzhuangtai==0 ) //如果是通行卡,并且处于不启动状态
{
//响 5 声
TurnOff_Card(); //关闭卡片
sen(0x37);
for(k=0;k<5;k++) //响5短声
{
beep=bofang;
for (i=0;i<250;i++)
for(j=0;j<100;j++);
beep=tingzhi;
for (i=0;i<250;i++)
for(j=0;j<100;j++);
};
goto start;
};
}
else
{
chongxinshuaka=bofang;
goto start;
};
/*;-----------------------------------------------------------------------------------------------
;Step5
;写卡:void Write_Card(uchar BlockNo,uchar *CardDataBuf)
;下传命令:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
;成功返回:3C 02 00 00 BCC 0D
;错误返回:3C 01 FF(错误返回代码) BCC 0D*/
// for(i=0;i<16;i++) CardDataBuf[i]=8;
// Write_Card(CardBlockNo,CardDataBuf);
// SetRes(CardStatus,5);
// delay10ms(3);
/*;-----------------------------------------------------------------------------------------------
;Step6
;关闭卡片:3C 04 01 68 00 00 51 0D
;正确返回:3C 02 00 00 3E 0D
;错误返回:3C 01 FF (错误返回代码)BCC 0D*/
if (CardStatus) //如果密码验证通过,则执行读取块1操作
{
// TurnOff_Card();
}
else
{
//chongxinshuaka=bofang;
goto start;
};
//TurnOff_Card();
//SetRes(CardStatus,6);
delay10ms(3);
// display(tmpResult);
//*****************************************************
//数据区:
//启动卡:1块 4块
// 1块:AA 以后全零
// 4块:02 38 02 38 以后全零
//通行卡:1块 4块
// 1块:55 以后全零
// 4块:02 38 以后全零
//使用后 C块 D块 E块 10块
//C块:02 38 09 02 18 54 00 10 除最后1个外全零 02
//D块:02 38 09 02 18 55 00 10 除最后1个外全零 02
//E块:同D块
//10块:同D块
//2007.9.3 程序流程
//上电流程
//1、读取标志,判断是否初始化过;
//2、如果初始化过,则初始化标志置位,等待读卡;
//3、如果没有初始化过,等待读卡;
//1、寻卡
//2、如果有卡则密码验证
//3、验证正确后,读1块,判断是启动卡,还是通行卡
//4、如果是启动卡,读取4块,验证数据一致性,如果一致则存储数据
//5、如果是通行卡,读取4块,验证是否和启动数据一致,如果一致并且C块没有数据则写收车数据;
//6、如果和启动数据不一致,则报告错误;
//7、返回 寻卡
//*****************************************************
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -