📄 main.c
字号:
}
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 1) //等待高电平,超时退出
break;
}
if(i>=0xf0)
{
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
return;
}
TR2=1;
while ( flag_wait )
{
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 0) //等待低电平,超时退出
break;
}
if(i>=0xf0)
{
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
return;
}
capture();
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 1) //等待高电平,超时退出
break;
}
if(i>=0xf0)
{
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
return;
}
capture();
}
check_stat=ERR_EM4469_NEITHER_ACK;
for (j=0;j<5;j++)
{
if (((j%2)==0)&&(capture_time[j]<MaxCaptureHalfDateRate)\
&&(capture_time[j+1]<MaxCaptureHalfDateRate)&&(capture_time[j+2]<MaxCaptureHalfDateRate)\
&&(capture_time[j+3]<MaxCaptureHalfDateRate)&&(capture_time[j+4]<MaxCaptureHalfDateRate)\
&&(capture_time[j+5]<MaxCaptureHalfDateRate)&&(capture_time[j+6]<MaxCaptureHalfDateRate)\
&&(capture_time[j+7]<MaxCaptureHalfDateRate)&&(capture_time[j+8]>MaxCaptureHalfDateRate))
{
check_stat = ERR_EM4469_NACK;
break;
}
}
if (check_stat != ERR_EM4469_NACK)
{
for (j=0;j<76;j++)
{
if (((j%2)!=0)&&(capture_time[j]<MaxCaptureHalfDateRate)\
&&(capture_time[j+1]>MaxCaptureHalfDateRate)&&(capture_time[j+2]>MaxCaptureHalfDateRate)\
&&(capture_time[j+3]>MaxCaptureHalfDateRate)&&(capture_time[j+4]>MaxCaptureHalfDateRate))
{
check_stat = UART_MESSAGE_OK;
break;
}
}
}
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
}
void ClearCaptureBuffers(void)
{
uchar i;
for(i=0; i<CAPTURE_SIZE; i++)
{
capture_data[i] = 0;
}
}
void capture(void)
{
uint capt;
uint icr = count_module();
capt = icr - last_capture;
last_capture = icr;
*capture_read_time_data_ptr++=capt; //保存高低电平的时间(以125K的脉冲个数),ptr++
}
//保存解码数据
void store_bit(bit b)
{
if (captured_bit_count==8)
{
if (b==1)
capture_check=capture_check|(1<<capture_check_count);
capture_check_count++;
captured_bit_count = 0;
}
else
{
buffer_capture_check=buffer_capture_check^b;
if(b==1)
captured_byte = captured_byte|(1<<captured_bit_count);
if (captured_bit_count==7)
{
capture_data[capture_cnt++] = captured_byte;
captured_byte=0;
if(buffer_capture_check==1) compute_capture_check=compute_capture_check|(1<<capture_check_count);
buffer_capture_check=0;
}
captured_bit_count++;
}
}
uint count_module(void)
{
do
{
count_timer2.bytes.high2 = TH2;
count_timer2.bytes.low2 = TL2;
}while(count_timer2.bytes.high2 != TH2);
return count_timer2.word;
}
//读取本DEMO读卡器的软件版本,硬件版本,日期等信息
//02 08 FD 00 03 36 0B 5A 91 03
void ReadStatusToPC(void)
{
tx_buff[0]=0x02;
tx_buff[1]=0x08;
tx_buff[2]=0xfd;
tx_buff[3]=0x00;
tx_buff[4]= 0x03;//READER_RELEASE;
tx_buff[5]=0x36;//READER_DATE | ((READER_MONTH & 0x07) << 5);
tx_buff[6]=0x0b;//(READER_MONTH >> 3) | (READER_YEAR << 1);
tx_buff[7]=0x5a;//READER_FAMILY;
tx_buff[8]=0x91;//(tx_buff[1]^tx_buff[2]^tx_buff[3]^tx_buff[4]^tx_buff[5]^tx_buff[6]^tx_buff[7]);
tx_buff[9]=0x03;
trace(tx_buff,10);
}
//从串口发送数据出去
void trace(uchar *str,uchar len)
{
uint i;
MYTI = 0;
for(i=0;i<len;i++)
{
myputchar(*str);
str++;
}
}
//trace调用
void myputchar(uchar c)
{
//ES = 0;
SBUF = c;
while (MYTI == 0);
MYTI = 0;
//ES = 1;
}
void speak_on(void)
{
uint xdata i;
speak = 0;
for(i = 0;i<0xfff;i++);
speak = 1;
}
// 返回无卡信息
void return_00(void)
{
tx_buff[0]=0x02;
tx_buff[1]=0x0a;
tx_buff[2]=0x86;
tx_buff[3]=0x14; //无卡 或 错误
tx_buff[4]=1;
tx_buff[5]=0;
tx_buff[6]=0;
tx_buff[7]=0;
tx_buff[8]=0;
tx_buff[9]=0;
tx_buff[10]=(tx_buff[1]^tx_buff[2]^tx_buff[3]^tx_buff[4]^tx_buff[5]^tx_buff[6]^tx_buff[7]^tx_buff[8]^tx_buff[9]);
tx_buff[11]=0x03;
trace(tx_buff,12);
}
void FieldReset(void)
{
uint i;
SHD=1; // 关闭天线
for(i=0;i<0xfff0;i++);
for(i=0;i<0xfff0;i++);
SHD=0; //打开天线
tx_buff[0]=0x02;
tx_buff[1]=0x04;
tx_buff[2]=0xf0;
tx_buff[3]=0x00;
tx_buff[4]=(tx_buff[1]^tx_buff[2]^tx_buff[3]);
tx_buff[5]=0x03;
trace(tx_buff,6);
}
void Read4100ID(void)
{
uchar i,j,k,l;
uchar idata autodection_data[32];
uchar array_subscript; //小标
uchar bit_subscript;
uint capt;
uint icr;
bit flag_RO_last_capt_half=0;
uchar count_autodection_bit=0;
bit flag_header_found=0;
bit flag_stop_found=0;
bit flag_line_check=0;
bit flag_column_check=0;
uchar check=0;
uchar custID=0;
uchar idata DataItem[4]={0,0,0,0};
uchar bit_number;
bit flag_tag_datarate_bigger;
bit flag_invalid_edge_manchester;
uchar times_capture_manchester;
//halfDataRate = 32;//config_data_rate+1;
MaxCaptureHalfDateRate = 48;//halfDataRate+(halfDataRate>>1);
MaxCaptureDateRate = 80;//halfDataRate+halfDataRate+(halfDataRate>>1);
//lwr = 7;//config_lwr;
//maxTDefaultRead = 0x3000;//2*((lwr-4)*4*8)*2*((uint32)halfDataRate);
maxCaptureTimeLow = 0x3000;//(uint)maxTDefaultRead;
maxCaptureTimeHi = 0x30;//(uchar)(maxTDefaultRead >> 16);
last_capture = 0xcfff;//~maxCaptureTimeLow;
TF2 = 0;
TR2 = 0;
TL2 = 0xff;//(uchar)(~maxCaptureTimeLow);
TH2= 0xcf;//(uchar)((~maxCaptureTimeLow)>>8) ;
currentMaxTimeHi = 0xcf;//~maxCaptureTimeHi;
flag_tag_datarate_bigger=0;
for(j=0;j<32;j++)
{
autodection_data[j]=0;
}
for(i=0;i<0xf8;i++)
{
if(DEMOD_OUT == 0) //等待低电平,超时退出
break;
}
if(i>=0xf0)
{
return_00();
return;
}
for(i=0;i<0xf8;i++)
{
if(DEMOD_OUT == 1) //等待高电平,超时退出
break;
}
if(i>=0xf0)
{
return_00();
return;
}
ET2=1;
TR2=1; //counter 2 start run,interrupt enable
flag_wait=1;
while(flag_wait) //counter 2 is runing
{
for(i=0;i<0xf8;i++)
{
if(DEMOD_OUT == 0) //等待低电平,超时退出
break;
}
if(i>=0xf0)
{
return_00();
return;
}
icr=count_module();
capt=icr-last_capture;
last_capture=icr;
if ((capt>MaxCaptureHalfDateRate)&&(capt<MaxCaptureDateRate))
break; //1p hi,64个时钟
for(i=0;i<0xf8;i++)
{
if(DEMOD_OUT == 1) //等待高电平,超时退出
break;
}
if(i>=0xf0)
{
return_00();
return;
}
icr=count_module();
capt=icr-last_capture;
last_capture=icr;
}
flag_RO_last_capt_half=0;
flag_invalid_edge_manchester=0;
count_autodection_bit=0;
array_subscript=0;
bit_subscript=0;
// //manchester
times_capture_manchester=0;
while(flag_wait) //counter 2 is runing
{
for(i=0;i<0xf8;i++)
{
if(DEMOD_OUT == 1) //,test low time 等待高电平,超时退出
break;
}
if(i>=0xf0)
{
return_00();
return;
}
icr=count_module();
capt=icr-last_capture;
last_capture=icr;
if((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==0))
{ //0.5p low
flag_invalid_edge_manchester=1;
if((times_capture_manchester%2)==0)
{
array_subscript=(count_autodection_bit>>3);
bit_subscript=(count_autodection_bit%8);
autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));
}
count_autodection_bit++;
}
else if ((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==1))
{ //0.5p low
flag_invalid_edge_manchester=0;
}
else if ((capt>MaxCaptureHalfDateRate)&&(capt<MaxCaptureDateRate))
{ //1p low
if((times_capture_manchester%2)==0)
{
array_subscript=(count_autodection_bit>>3);
bit_subscript=(count_autodection_bit%8);
autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));
}
count_autodection_bit++;
}
times_capture_manchester++;
//-----
for(i=0;i<0xf8;i++)
{
if(DEMOD_OUT == 0) //等待低电平,超时退出
break;
}
if(i>=0xf0)
{
return_00();
return;
}
icr=count_module();
capt=icr-last_capture;
last_capture=icr;
if((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==0))
{ //0.5p hi
flag_invalid_edge_manchester=1;
if((times_capture_manchester%2)==0)
{
array_subscript=(count_autodection_bit>>3);
bit_subscript=(count_autodection_bit%8);
autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));
}
count_autodection_bit++;
}
else if ((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==1))
{ //0.5p hi
flag_invalid_edge_manchester=0;
}
else if ((capt>MaxCaptureHalfDateRate)&&(capt<MaxCaptureDateRate))
{ //1p hi
if((times_capture_manchester%2)==0)
{
array_subscript=(count_autodection_bit>>3);
bit_subscript=(count_autodection_bit%8);
autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));
}
count_autodection_bit++;
}
times_capture_manchester++;
}
//数据提取:找标志头、找停止位、检查校验和,一旦正确提取数据退出循环
if(count_autodection_bit>64)
{
flag_header_found=0;
for (j=0;j<(count_autodection_bit-54);j++) //找标志头9 bit 1
{
array_subscript=(j>>3);
bit_subscript=(j%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))==0) //不等于0,即可判断此位为1
{
flag_header_found=1;
for (k=(j+1);k<(j+10);k++)
{
array_subscript=(k>>3);
bit_subscript=(k%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))==0)
{
flag_header_found=0;
break;
}
}
if(flag_header_found==1) break;
}
}
flag_stop_found=0;
if (flag_header_found==1)//停止位
{
array_subscript=((j+64)>>3);
bit_subscript=((j+64)%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))==0) flag_stop_found=1;
}
flag_line_check=0;
if (flag_stop_found==1) //行校验
{
for (k=(j+10);k<(j+60);k=(k+5))
{
check=0;
for(l=k;l<(k+4);l++)
{
array_subscript=(l>>3);
bit_subscript=(l%8);
check=check^((autodection_data[array_subscript]>>bit_subscript)&1);
}
array_subscript=(l>>3);
bit_subscript=(l%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))!=(check<<bit_subscript))
{
flag_line_check=0;
break;
}
flag_line_check=1;
}
}
flag_column_check=0;
if (flag_line_check==1) //列校验
{
for(k=(j+10);k<(j+14);k++)
{
check=0;
for(l=k;l<(k+50);l=(l+5))
{
array_subscript=(l>>3);
bit_subscript=(l%8);
check=check^((autodection_data[array_subscript]>>bit_subscript)&1);
}
array_subscript=(l>>3);
bit_subscript=(l%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))!=(check<<bit_subscript))
{
flag_column_check=0;
break;
}
flag_column_check=1;
}
}
if (flag_column_check==1) //提取数据
{
custID=0;
DataItem[0]=0;DataItem[1]=0;DataItem[2]=0;DataItem[3]=0;
//客户ID
bit_number=0;
for (k=(j+10);k<(j+14);k++)
{
array_subscript=(k>>3);
bit_subscript=(k%8);
custID=(custID|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));
bit_number++;
}
for (k=(j+15);k<(j+19);k++)
{
array_subscript=(k/8);
bit_subscript=(k%8);
custID=(custID|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));
bit_number++;
}
//data
k=0;
bit_number=0;
for(l=(j+20);l<(j+59);l++)
{
if (((l-j-20)%5)!=4)
{
array_subscript=(l>>3);
bit_subscript=(l%8);
DataItem[k]=(DataItem[k]|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));
bit_number++;
if (bit_number==8)
{
bit_number=0;
k++;
}
}
}
}
}
//向PC返回响应信息
check_stat=0x14;
if (flag_column_check==1)
{
check_stat=0;
flag_column_check=0;
}
tx_buff[0]=0x02;
tx_buff[1]=0x09;
tx_buff[2]=0x10;
tx_buff[3]=check_stat;
tx_buff[4]=custID;
tx_buff[5]=DataItem[3];
tx_buff[6]=DataItem[2];
tx_buff[7]=DataItem[1];
tx_buff[8]=DataItem[0];
tx_buff[9]=(tx_buff[1]^tx_buff[2]^tx_buff[3]^tx_buff[4]^tx_buff[5]^tx_buff[6]^tx_buff[7]^tx_buff[8]);
tx_buff[10]=0x03;
trace(tx_buff,12);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -