⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 HSDB4095 RFID 开发板是基于Winbond 单片机W78E365 和EM 可读写模拟前端125K RFID 基站芯片EM4095 的一个RFID 卡的开发板配合上位机软件
💻 C
📖 第 1 页 / 共 3 页
字号:
	}

	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 + -