📄 main.c
字号:
MOD=1; //force 1st mod pulse
fwd_bit_sz--; //prepare next bit modulation
fwd_write_ptr++;
TF0=0; //clear any pending flag
TR0=0;
TH0=0xFF;TL0= field_stop;
TR0=1;
field_stop = fwd_01_stop;
fwd_bit_phase = 2;
ET0=1; //enable overflow interrupt
// waiting for clearing T0IE0 => command sending
while ( ET0== 1 ) ;
}
void Wait(uint period)
{
TR2 = 0;
TF2=0;
TL2=(uchar)(~period); TH2=(uchar)((~period)>>8);
currentMaxTimeHi = 0xFF;
ET2=1;
TR2=1;
flag_wait=1;
while ( flag_wait);
}
//读卡程序, Manchester解码
void ManchesterRead(void)
{
uchar i,j;
uchar captured_bits_count;
ClearCaptureBuffers();
captured_bit_count = 0;
capture_cnt = 0;
captured_byte=0;
capture_check=0;
capture_check_count=0;
buffer_capture_check=0;
compute_capture_check=0;
check_stat=0;
for(i=0;i<120;i++) //2006-5-13 14:19
{
capture_time[i]=0xff;
}
TR2 = 0;
TF2 = 0;
TL2 = (uchar)(~maxCaptureTimeLow); //0xd7
TH2 = (uchar)((~maxCaptureTimeLow)>>8); //0xf0, //set timer with initial time
currentMaxTimeHi = ~maxCaptureTimeHi; //0xff
last_capture = ~maxCaptureTimeLow; //~0x0f28
capture_read_time_data_ptr = capture_time; // capture ptr
flag_wait=1;
ET2=1; //enable t2 interrupt
check_stat=ERR_EM4469_NEITHER_ACK; //if read card ok,check_stat will change
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;
}
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;
}
cap_count = 0;
TR2=1; //
while ( flag_wait ) //接收
{
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 0)
break;
}
if(i>=0xf0)
return;
capture(); //hi电平时间
cap_count++;
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 1)
break;
}
if(i>=0xf0)
return;
capture(); //low电平时间
cap_count++;
if(cap_count > 120)
break;
}
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))
{
check_stat = UART_MESSAGE_OK;
break;
}
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;
}
}
captured_bits_count=0;
if (check_stat==UART_MESSAGE_OK)
{
//解码
for (i=(j+6);;i++)
{
if (capture_time[i]<MaxCaptureHalfDateRate)
{
if((i%2)==0)
{
store_bit(0);
}
else
{
store_bit(1);
}
i++;
captured_bits_count++;
if (captured_bits_count>45) //45位数据结构,参考EM4469文档
break;
}
else if((capture_time[i]>MaxCaptureHalfDateRate) &&(capture_time[i]<MaxCaptureDateRate))
{
if((i%2)==0)
{
store_bit(1);
}
else
{
store_bit(0);
}
captured_bits_count++;
if (captured_bits_count>45) //45位数据结构,参考EM4469文档
break;
}
else
{
check_stat=ERR_EM4469_FLOWLINK_ERR;
break;
}
}
}
if ((check_stat!=ERR_EM4469_NEITHER_ACK)&&(check_stat!=ERR_EM4469_NACK)&&(check_stat!=ERR_EM4469_FLOWLINK_ERR))
{
if (((capture_check&0x10)!=0)||((compute_capture_check&0x0f)!=(capture_check&0x0f)))
{
check_stat=ERR_EM4469_PARITY_ERR;
}
else
{ //capture_data[4] CRC
if ((capture_data[0]^capture_data[1]^capture_data[2]^capture_data[3])!=capture_data[4])
{
check_stat=ERR_EM4469_PARITY_ERR;
}
else
{
check_stat=UART_MESSAGE_OK; //读卡成功
}
}
}
//trace(capture_time,120);
//trace(capture_data,32);
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
}
//写卡程序,Manchester解码
void ManchesterWrite(void)
{
uchar i,j;
ClearCaptureBuffers();
captured_bit_count = 0;
capture_cnt = 0;
captured_byte=0;
capture_check=0;
capture_check_count=0;
buffer_capture_check=0;
compute_capture_check=0;
check_stat=0;
TR2 = 0;
TF2=0; //clear pending interrupts
TL2=(uchar)(~maxCaptureTimeLow); TH2=(uchar)((~maxCaptureTimeLow)>>8) ; //set timer with initial time
currentMaxTimeHi = ~maxCaptureTimeHi;
last_capture=~maxCaptureTimeLow;
capture_read_time_data_ptr=capture_time;
flag_wait=1;ET2=1;
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;
}
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读卡器的软件版本,硬件版本,日期等信息
void ReadStatusToPC(void)
{
tx_buff[0]=0x02;
tx_buff[1]=0x08;
tx_buff[2]=0xfd;
tx_buff[3]=0x00;
tx_buff[4]=READER_RELEASE;
tx_buff[5]=READER_DATE | ((READER_MONTH & 0x07) << 5);
tx_buff[6]=(READER_MONTH >> 3) | (READER_YEAR << 1);
tx_buff[7]=READER_FAMILY;
tx_buff[8]=(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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -