unsigned char Buff[30];
/*解码缓冲区*/
unsigned char readbit()
/*检测数据位子程序*/
{
unsigned int mk=TIME10;
/*装入超时值,TIME10=600,*/
TL0=TH0=0;
/*初始化计时器*/
TR0=1;
/*开始计时*/
while(--mk)
/*超时机制,防止死等*/
if(bitin!=INPORT)
/*有跳变INPORT=P0.0*/
break;
TR0=0;
/*停止计时*/
if(mk==0)
/*超时退出*/
return 0;
bitin=INPORT;
/*保存状态*/
mk=TH0*256+TL0;
/*计算这样跳变的脉宽*/
if((mk>TIME05)&&(mk<=TIME10))
/*一个周期*/
return 1;
if((mk>=TIME00)&&(mk<=TIME05))
/*半个周期*/
return 2;
return 0;
/*出错*/
}
readdata()函数实现读取一个完整的数据位的子程序,注意应用这个函数时需要在循环中不断查询,程序代码如下:
unsigned char readdata()
/*读一个完整的数据位子程序*/
{
switch(readbit())
{
case 1:
/*一个周期*/
return !bitin;
case 2:
/*半个周期*/
if(readbit()!=2) return 2;
/*再读一次半个周期*/
return !bitin;
default:
return 2;
}
}
CheckData()函数实现接收并解码子程序,程序中调用了readdata()函数,
bit CheckData()
{
unsigned char i,j;
bitin=INPORT;
/*保存位状态*/
for(i=0;i<9;i++)
/*检测9个数据位1*/
{
if(readdata()!=1)
return 0;
}
for(i=0;i<11;i++)
/*读取数据*/
{
Buff[i]=0x00;
for(j=0;j<5;j++)
{
Buff[i]<<=1;
switch(readdata())
{
case 0:
break;
case 1:
Buff[i]|=0x08;
break;
case 2:
/*err*/
return 0;
}
}
}
/*结束位*/
if(Buff[10]&0x08!=0x00)
return 0;
/*行奇校验位*/
for(i=0;i<10;i++)
if((((Buff[i]>>4) ^(Buff[i]>>3) ^(Buff[i]>>2) ^(Buff[i]>>1) ^Buff[i])&0x08)!=0)
return 0;
/*列奇校验位*/
j=0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x80);
if(j!=0)
return 0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x40);
if(j!=0)
return 0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x20);
if(j!=0)
return 0;
for(i=0;i<11;i++)
j=j ^ (Buff[i]&0x10);
if(j!=0)
return 0;
/*完成*/
return 1;
}
ReadCardNo()函数实现读取卡号的功能。程序中如果检测到卡信息正确,则卡号信息存放在Buff缓冲区中,程序代码如下:
bit ReadCardNo()
{
if(CheckData())
/*检测卡*/
{
unsigned char i;
/*编码输出*/
Buff[0]=(Buff[2] & 0xF0) | (Buff[3]>>4 & 0x0F);
Buff[1]=(Buff[4] & 0xF0) | (Buff[5]>>4 & 0x0F);
Buff[2]=(Buff[6] & 0xF0) | (Buff[7]>>4 & 0x0F);
Buff[3]=(Buff[8] & 0xF0) | (Buff[9]>>4 & 0x0F);
/* Buff[0]到Buff[4]存放的就是卡号*/
return 1;
}
return 0;
}