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

📄 main.c.bak

📁 hs4905非接触卡读卡机芯片读t5557 的源代码
💻 BAK
📖 第 1 页 / 共 3 页
字号:
			}
			else if((capture_time[j]>MaxCaptureHalfDateRate) &&(capture_time[j]<MaxCaptureDateRate))
			{
				if((i%2)==0)	
				{
					store_bit(!b_edge);
				}
				else
				{
					store_bit(b_edge);
				}
				captured_bits_count++;
				if (captured_bits_count>64) //45位数据结构
					break;
			}
			else  
			{
				check_stat=0xf3;
				break;
			}
			j++;
		}
	}
	for(i=0;i<150;i++)	//2006-5-13 14:19
	{
		capture_time[i]=0xff;
	}	
	
	//trace(capture_time,120);
	//trace(capture_data,32);
	
}

//写卡程序,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<10;j++)
	{
		if(((halfDataRate*2+8)<capture_time[j])&&(capture_time[j]<(halfDataRate*3+8))
		&&(capture_time[j+1]<MaxCaptureHalfDateRate)&&(capture_time[j+2]>MaxCaptureHalfDateRate)
		&&(capture_time[j+2]<(halfDataRate*3+8)))
			break;
	}
	if(j==5)
	{
		check_stat = 0xf1;
		return;		
	}
	
	check_stat = UART_MESSAGE_OK;
	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(b==1) 
			captured_byte = captured_byte|(0x80>>captured_bit_count);
		if (captured_bit_count==7)
		{
			capture_data[capture_cnt++] = captured_byte;
			captured_byte=0;
			captured_bit_count = 0;
		}
		else 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);
}

*/


void ResetT5557(void)
{
	uchar fwd_bit_count;
	fwd_bit_count = Prepare_Cmd(0x00);
	SendForward(fwd_bit_count);		
}
void WakeUpT5557(void)
{
	uchar fwd_bit_count;
	fwd_bit_count = Prepare_Cmd(0x01);
	fwd_bit_count += Prepare_Data(rx_buff);		
	SendForward(fwd_bit_count);
}
void GeneralRead_T5557()//发送时序 Opcode
{
	uchar fwd_bit_count;
	fwd_bit_count = Prepare_Cmd(rx_buff[1]);
	SendForward(fwd_bit_count);
	maxCaptureTimeLow = maxTRead; 
    maxCaptureTimeHi = 0;
	ManchesterRead();
	if (check_stat==UART_MESSAGE_OK)
	{
		tx_buff[0]=capture_data[0];	//数据
		tx_buff[1]=capture_data[1];	//数据
		tx_buff[2]=capture_data[2];	//数据
		tx_buff[3]=capture_data[3];	//数据
		tx_buff[4]=capture_data[4];	//数据
		tx_buff[5]=capture_data[5];	//数据
		tx_buff[6]=capture_data[6];	//数据
		tx_buff[7]=capture_data[7];	//数据		
		trace(tx_buff,8);		//发送到PC 11个字节
	}
	else
	{
		tx_buff[0]= check_stat;	//数据
		tx_buff[1]=0xee;	//数据
		tx_buff[2]=0xee;	//数据
		tx_buff[3]=0xee;	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}	
}

void ReadT5557(void)//发送时序 Opcode + Lock + Addr
{
	uchar fwd_bit_count;
	fwd_bit_count = Prepare_Cmd(rx_buff[1]);
	fwd_bit_count += Prepare_Lock();
	fwd_bit_count += Prepare_Addr(rx_buff[2]);
	SendForward(fwd_bit_count);
	maxCaptureTimeLow = maxTRead; 
    maxCaptureTimeHi = 0;
	ManchesterRead();
	if (check_stat==UART_MESSAGE_OK)
	{
		tx_buff[0]=capture_data[0];	//数据
		tx_buff[1]=capture_data[1];	//数据
		tx_buff[2]=capture_data[2];	//数据
		tx_buff[3]=capture_data[3];	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}
	else
	{
		tx_buff[0]= check_stat;	//数据
		tx_buff[1]=0xee;	//数据
		tx_buff[2]=0xee;	//数据
		tx_buff[3]=0xee;	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}		
}

void WriteT5557(void)//发送时序 Opcode + Lock + Data + Addr
{
	uchar fwd_bit_count;
	fwd_bit_count = Prepare_Cmd(0x01);
	fwd_bit_count += Prepare_Lock();
	fwd_bit_count += Prepare_Data(rx_buff);	
	fwd_bit_count += Prepare_Addr(rx_buff[5]);
	SendForward(fwd_bit_count);
	maxCaptureTimeLow = maxTWrite;
	maxCaptureTimeHi = 0;	
	ManchesterWrite();
	if (check_stat==UART_MESSAGE_OK)
	{
		tx_buff[0]=0xe0;	//数据
		tx_buff[1]=0x00;	//数据
		tx_buff[2]=0x00;	//数据
		tx_buff[3]=0x00;	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}
	else
	{
		tx_buff[0]= check_stat;	//数据
		tx_buff[1]=0xee;	//数据
		tx_buff[2]=0xee;	//数据
		tx_buff[3]=0xee;	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}
}

void ReadT5557_PWD(void) //发送时序 Opcode + PassWord + Lock + Addr
{
	uchar fwd_bit_count;
	fwd_bit_count = Prepare_Cmd(rx_buff[1]);
	fwd_bit_count += Prepare_Data(rx_buff);
	fwd_bit_count += Prepare_Lock();
	fwd_bit_count += Prepare_Addr(rx_buff[5]);
	SendForward(fwd_bit_count);
	maxCaptureTimeLow = maxTRead; 
    maxCaptureTimeHi = 0;
	ManchesterRead();
	if (check_stat==UART_MESSAGE_OK)
	{
		tx_buff[0]=capture_data[0];	//数据
		tx_buff[1]=capture_data[1];	//数据
		tx_buff[2]=capture_data[2];	//数据
		tx_buff[3]=capture_data[3];	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}
	else
	{
		tx_buff[0]= check_stat;	//数据
		tx_buff[1]=0xee;	//数据
		tx_buff[2]=0xee;	//数据
		tx_buff[3]=0xee;	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}		
}

void WriteT5557_PWD(void)	//发送时序 Opcode + PassWord + Lock + Data + Addr
{
	uchar fwd_bit_count;
	fwd_bit_count = Prepare_Cmd(0x01);
	fwd_bit_count += Prepare_Data(rx_buff);		
	fwd_bit_count += Prepare_Lock();	
	fwd_bit_count += Prepare_Data(rx_buff+4);	
	fwd_bit_count += Prepare_Addr(rx_buff[9]);
	SendForward(fwd_bit_count);
	maxCaptureTimeLow = maxTWrite;
	maxCaptureTimeHi = 0;	
	ManchesterWrite();
	if (check_stat==UART_MESSAGE_OK)
	{
		tx_buff[0]=0xe0;	//数据
		tx_buff[1]=0x00;	//数据
		tx_buff[2]=0x00;	//数据
		tx_buff[3]=0x00;	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}
	else
	{
		tx_buff[0]= check_stat;	//数据
		tx_buff[1]=0xee;	//数据
		tx_buff[2]=0xee;	//数据
		tx_buff[3]=0xee;	//数据
		trace(tx_buff,4);		//发送到PC 11个字节
	}
}

/*
uchar PulseWide()
{
	uint wide = 0;
	uint icr;  
	 
	read_pulse_front = 2; 
	capture_cnt = 0;
	last_capture = 0;  
	flag_wait = 1;
	read_header = 1;
	is_1p = 0;
	read_ok = 0;
	TH2 = 0; 
	TL2 = 0;
	edge = 0;	//save prior Vol state
	TR2 = 1;
	ET2 = 1;
	while(flag_wait)
	{
		while(read_header)
		{
			if((edge ^ DEMOD_OUT))// && (DEMOD_OUT==1))
			{	
				edge = DEMOD_OUT;
				icr = count_module();
				wide = icr - last_captrue;
				last_capture = icr;								
			
				if(wide>0x28 && wide<0x38)//1.5P
				{
					read_ok = 1;	
				}
				if(read_ok && (wide>0x08 && wide<0x18))//0.5P
				{
					read_header	= 0;
					read_ok = 0;
				}	
			}			
		}
		while(!read_ok)//manchester decode 
		{
			if(edge ^ DEMOD_OUT)
			{	
				edge = DEMOD_OUT;
				icr = count_module();
				wide = icr - last_captrue;
				last_capture = icr;								
			
				if(wide>0x38 && wide<0x08)//>1.5P
				{
					check_stat = ERR_T5557_READ_ERR;
					flag_wait = 0;				
					break;
				}

				if(wide>0x28 && wide<0x38)//1.5P
				{
					if(capture_cnt != 0)//只在起始才有可能检测到
					{
						flag_wait = 0;
						break;
					}
					read_pulse_front = 1;//first bit
					continue;			
				}
				
				if(wide>0x18 && wide<0x28)//1P
				{
					if(capture_cnt == 32)
					{
						flag_wait = 0;
						break;
					}
					if(read_pulse_front == 2)
					{
						read_pulse_front = 0;//first bit
						continue;
					}
					else if(read_pulse_front == 1)//;'0'
					{
						if(is_1p==0)
						{
							code = code<<1;
							read_pulse_front = 0;
							continue;
						}
						
					}
					else //read_pulse_front =0
					{
						
					}
				
				}
				
				if(wide>0x08 && wide<0x18)//0.5P
				{
					
				}
					
			}// edge^DEMOD_OUT	
		}// !read_ok	
	}// flag_wait
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -