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

📄 main.c

📁 keilc写RFID独T5557卡的源程序,
💻 C
📖 第 1 页 / 共 2 页
字号:
//2006-4-27 13:10
//更改为默认 manchester,RF/64,软件可读写EM4469,不能更改设置读卡器参数,可读参数2006-4-27 12:01
//不能使用默认读命令
//支持PCB端软件:1.EM4469 RFID Development Kit Application Software  2.EM4469 Read Only Application Software
//支持卡片:EM4469,EM410X

#include "main.h"
#include   "string.h"
#include   "intrins.h"
#include   "stdio.h"

////EM4095控制线定义
sbit	MOD = P1^1;
sbit	SHD = P1^2;
sbit	DEMOD_OUT = P3^3;
sbit    RDY_CLK = P3^4;
sbit    speak = P1^3;

union	myunion
{
	uint	word;
	struct
	{
		uchar high2;
		uchar low2;
	}bytes;
};


union myunion count_timer2;
uchar fwd_1st_pulse = 256 - 30;            	//18个RF周期
uchar field_stop;                          	//next field stop in RF clocks
uchar fwd_01_zero   = 256 - 24;            	//complement to fwd_01_stop,20个RF周期
uchar fwd_01_one    = 256 - 56;           	//notmod full period '1',29个RF周期
uchar fwd_01_stop   = 256 - 20;            	//9个RF周期
uchar edge=1;                         		//for manchester usage


// 定时器0中断服务程序
// 写操作,控制MOD
void Timer0_int(void) interrupt 1 using 1
{	          
	TF0=0;						//clear interrupt flag
	if (fwd_bit_phase == 4)
	{
		TR0= 0;                            
	      	ET0=0;      		//disable T0 interrupt              
	      	TF0=0;    
	      	MOD=0;     
	      	return;            
	}
	
    if (fwd_bit_phase == 1) 
    {                     
      	MOD=1;  
		TR0=0;                     
      	TH0=0xFF;
      	TL0 = 255-19;//field_stop;
		TR0=1;
      	field_stop = fwd_01_stop;             
      	//fwd_bit_phase = 2;
    	if(fwd_bit_sz-- > 0) 
    	{                   
      		if(((*fwd_write_ptr++) & 1) == 1) 
        		fwd_bit_phase = 2;
      		else
        		fwd_bit_phase = 3;
    	}   
	    else 
	    {
	    	fwd_bit_phase = 4;
	    }     	
	    return;
    }
    
    MOD=0;                   
	TR0=0;
    if (fwd_bit_phase == 2)                 
    {
    	TH0=0xFF;
    	TL0=255-55;//fwd_01_zero;
    	fwd_bit_phase = 1;
    }
    else
    {
    	TH0=0xFF;
    	TL0= 255-23;//fwd_01_one;
    	fwd_bit_phase = 1;
    }                    
	TR0=1;

}
//串口中断标志位
uchar Rxtemp;
bit rx_start;
bit rx_finish;
bit rx_lenflag;
uchar rx_i;
uchar rx_len;
bit MYTI;

//串口中断服务程序
void serial(void) interrupt 4 using 3 
{		
	uint  i;
    if(RI)
    {
    	rx_finish = 0;
        RI = 0;
        EA = 0;
        //Rxtemp = SBUF;         
	    rx_buff[0] = SBUF;
	    rx_i=1; 
	    for(;;)
	    {
	    	for(i=0;i<0xfff;i++)
	    	{
	    		if(RI)
	    		{	    			
	    			RI = 0;
	    			rx_buff[rx_i] = SBUF;
	    			rx_i++;
	    			break;
	    		}	    		
	    	}
	    	if(i>=0xfff)
	    	{
	    		rx_finish = 1;
	    		EA = 1;
	    		break;
	    	}
	    }   
	}
	if(TI)
	{
		TI = 0;
		MYTI = 1;		
 	}
}

// ==================================================================
void Timer2_int(void) interrupt 5 using 2
{
  	if (currentMaxTimeHi != 0xFF) 
  	{                 
    	currentMaxTimeHi = 0xFF;
	} 
	else 
	{
    	flag_wait=0;
    	ET2=0;  
  	}
}

void main(void)
{
//	uchar i;
//	uchar checksum;
	//使能winbond W78E365内部1K SRAM
	CHPENR = 0x87;
    CHPENR = 0x59;
    CHPCON = (CHPCON|0x10);
 	CHPENR = 0x00;

	//串口,定时器1,双倍速率,9600bps
	SCON = 0x50;		
	TMOD = 0x21;
	TH1 = 0xf4;TL1 = 0xf4;
	PCON = PCON|0x80;
	TR1 = 1;
	ES = 1;
	TI = 0;RI = 0;		
	EA = 1;
	C_T2 = 1;				//T2脚的负跳变计数,TH2,TL2自动重装
	//EM4095 初始化
	MOD = 0;
	SHD = 0;
	//串口接收初始化
	rx_start = 0;
    rx_finish = 0;
	rx_lenflag = 0;
    rx_len = 0;				//还要接收的数据个数
	rx_i = 0;               //接收到个数
	MYTI = 0;
	
	//配置读卡器默认值,RF/64,Manchester解码
    config_delayed = 0;
    config_lwr = 8;                      
    config_raw = 0;	

	halfDataRate = 16;//default values, RF/32
	MaxCaptureHalfDateRate = halfDataRate + (halfDataRate >> 1);		//=0x18 
	MaxCaptureDateRate = halfDataRate + halfDataRate + (halfDataRate >> 1);	//0x28
	
	lwr = config_lwr;
	delayed = config_delayed;
	raw = config_raw;
	//forward_link_type = 0x01; 
	maxTLogin = 4 + (4 + 9) * 2 * (uint)halfDataRate;		//0x0344
	maxTWrite = 1144 + (4 + 8) * 2 * (uint)halfDataRate;
	maxTWriteRaw = 1144 + (4 + 5 + 54) * 2 * (uint)halfDataRate;
	maxTRead = (100) + 4 + (5 + 54) * 2 * (uint)halfDataRate;		//3880
	maxTDisable = maxTLogin;
	maxTDefaultRead = 2*((lwr-4)*4*8)*2*((uint32)halfDataRate);
	tpp_period = 4 + 2 * (uint)halfDataRate - 4;		//64
	twr_period = (68 + 64 + 896 + 116) + 2 * (uint)halfDataRate - 4;
	
	while(1)
	{
		if(rx_finish == 1)//串口完成合法的接收
	    {	    	
//		  	rx_finish = 0;
//		    trace(rx_buff,rx_i);
//				continue;
	    }
	    else continue;
		rx_finish = 0;		
		forward_ptr = forwardLink_data;	
//		num_addr = rx_buff[3];
		switch(rx_buff[0]) 			
		{
			case 0x00 :
				ResetT5557();
				break;
			case 0x10 :
				WakeUpT5557();
				break;
			case 0x11 :
				GeneralRead_T5557();
				break;
			case 0x12 :
				ReadT5557();
				break;
			case 0x13 :
				WriteT5557();
				break;			
			case 0x14 :
				ReadT5557_PWD();
				break;
			case 0x15 :
				WriteT5557_PWD();
				break;

			default : 
				break;
		}
	}
}

uchar Prepare_Cmd(uchar cmd) 
{
    *forward_ptr++ = cmd; //start bit
    cmd = cmd>>1;
    *forward_ptr++ = cmd;      	
    return 2;                         	
}

uchar Prepare_Lock(void)
{
	*forward_ptr++ = 0; 
	return 1;
}

uchar Prepare_Addr( uchar addr ) 
{
  	*forward_ptr++ = (addr>>2);  
  	*forward_ptr++ = (addr>>1);
  	*forward_ptr++ = addr; 

  	return 3;                      //return number of emited bits
}

uchar Prepare_Data( uchar *data_tx) 
{
  	register uchar i, j;
	register uchar datas;
  	for(j=1; j<5; j++) 
  	{
  		datas = *(data_tx + j);
  		for(i=8; i>0; i--)
  		{
  			*forward_ptr++ = (datas >> (i-1));
  		} 		
  	}
  	return 32;                             //return number of emited bits
}


// Forward Link setup function
// Requires: forwarLink_data filled with valid bits (1 bit per byte)
//           fwd_bit_count set with number of bits to be sent
void SendForward(uchar fwd_bit_count) 
{
	uchar sync=1;
  	fwd_write_ptr = forwardLink_data;
  	fwd_bit_sz = fwd_bit_count;
  	fwd_bit_phase = 3;
  	field_stop = fwd_1st_pulse;		//fwd_1st_pulse = 256-20

	TR0=0;
  	TH0=0xff;TL0=1;          //minimum startup pulse length,255
  	MOD=0;                   
  	TF0=0;                   
  	ET0=0;          		//disable T0 interrupt         
  	TMOD=(TMOD|0x05);			//计数器,16位计数器
  	TR0=1;     

  // waiting for clearing T0IE0 => command sending
  	while (!TF0) 
  	{
    	if ((sync == 1) && (!DEMOD_OUT))  
    		sync = 0;
    	if ((sync == 0) && (DEMOD_OUT))  
    		break;
  	}
  	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= 255-60;
  	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 ) ;
}



//读卡程序, 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;


	
	TR2 = 0; 
	TF2 = 0;      
	TL2 = 0;//(uchar)(~maxCaptureTimeLow); 		//0xd7
	TH2 = 0;//(uchar)((~maxCaptureTimeLow)>>8);	//0xf0,	//set timer with initial time
	currentMaxTimeHi = ~maxCaptureTimeHi;	//0xff

	last_capture = 0;//~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

	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 > 150)
			break;	
	}
	//capture_time[253]= cap_count;
	//trace(capture_time,254);
	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==10)

⌨️ 快捷键说明

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