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

📄 epc.c

📁 用C8051F126实现的RFIDEPC CLASS1B协议程序
💻 C
📖 第 1 页 / 共 3 页
字号:
			combuf[offset]=com;
			check_sum_val += com;
			length--;
            if(length==0)
            {
                if(check_sum_val==0)
                     treat_report();
                endall();
			}
		}
		else if(frame_1byte_ok)
		{	
			if(com != 0x40)
			{
				offset=1;
				combuf[1]=com;
	            length=com;
				check_sum_val += com;

				check_bit=0;
				check_bit=check_bit^com_0;
				check_bit=check_bit^com_1;
				check_bit=check_bit^com_2;
				check_bit=check_bit^com_3;
				check_bit=check_bit^com_4;
				check_bit=check_bit^com_5;
				check_bit=check_bit^com_6;
				check_bit=check_bit^com_7;
				if(check_bit)
				{	
					length = length & 0x7f;
					frame_head_ok=1;               
				}
				else
					endall();
			}
		}
		else if(offset==0)
        {
			if(com==0x40)
			{	
				combuf[0]=com;
				check_sum_val=com;
				frame_1byte_ok=1;
			}
		}
	}
	else if(sendflag)
	{
		if(sendcount < ((sendbuf[1] & 0x7f)+2))
		{
			SFRPAGE = 0x01;
			SBUF1 = sendbuf[sendcount];
			SFRPAGE = 0x00;
			sendcount++;
        }
		else
		{
			sendflag=0;
			receiveflag=1;
			rs485ctl=1;      // 使RS485进入接收状态
		}
	}
}

uchar detect_antenna(void)
{  
	//检测哪个口已接天线: 00-无天线,01-只有天线0,02-只有天线1,03-天线0和1都有

	unsigned char xdata i;	
	
	da_swr1=1;
	da_swr0=1;

	i=0;
	if(da_swr0==0)	i=1;
	if(da_swr1==0)	i+=2;
	return i;	
}

uchar antenna_is_ok(void)
{
	//检测天线连接是否正常
	unsigned char xdata i;	

	i=detect_antenna();
	if((sel_txian0==0) && ((i==1)||(i==3)))
		return true;
	if((sel_txian1==0) && ((i==2)||(i==3)))
		return true;
	return false;
}

void amplifier_on(void)
{
	// 打开功放
	unsigned long xdata kk2;
	
	power_on=1;	

	iic_eeprom_read_adress(out_powerl,1);
	
	kk2=common_buf[0];
	if(kk2>150) kk2=150;

	kk2=(kk2*4096)/240;
	SFRPAGE = 0x00;
	DAC0L=kk2%256;
	DAC0H=kk2/256;

//	delay(20);
	dog();
}

void amplifier_off(void)
{
	// 关闭功放
//	SFRPAGE = 0x00;
//	DAC0L=0;
//	DAC0H=0;

	power_on=0;	
}

// 生成电子标签授权码MAC和UAC
unsigned char get_authorization(void)
{
	unsigned char xdata i, temp;

	//取eeprom中厂商授权码
	iic_eeprom_read_adress(mac_code,5);     
	temp=0;
	for(i=0;i<4;i++)
		temp += common_buf[i];
	temp = (~temp)+1;
	if(temp != common_buf[4])
		return error_mac_code;

	for(i=0;i<4;i++)
		tag_buf[10+i]=common_buf[i];

	// 取eeprom中用户授权码
	iic_eeprom_read_adress(user_code,9);   
	temp=0;
	for(i=0;i<8;i++)
		temp += common_buf[i];
	temp = (~temp)+1;
	if(temp != common_buf[8])
		return error_mac_code;

	for(i=0;i<8;i++)
		tag_buf[i]=common_buf[i];

	// 生成电子标签中的授权码
	if(antenna_is_ok())
	{
		// 读取标签ID号
		amplifier_on();	
		temp = read_data_process(0, 2);
		amplifier_off();	

		if (temp==error_ok)
		{
			// 生成电子标签MAC码
			for(i=0;i<4;i++)
			{
				tag_buf[10+i] ^= data_code[i];
				tag_buf[10+i] ^= data_code[4+i];
			}

			// 生成电子标签UAC码
			for(i=0;i<8;i++)
				tag_buf[i] ^= data_code[i];
			for(i=0;i<4;i++)
				tag_buf[i] ^= tag_buf[4+i];
		}
	}
	else
		temp = error_no_antenna;
	dog();
	return temp;
}

//检测电子标签是否授权
unsigned char check_authorization(void)	
{
	unsigned char xdata i, temp;

	temp = get_authorization();
	if(temp == error_ok)
	{
		// 读取电子标签授权码,MAC在3#区, UAC码在4#区
		amplifier_on();	
		temp = read_data_process(3, 2);
		amplifier_off();	

		if (temp == error_ok)
		{
			for(i=0; i<4; i++)
			{
				if(data_code[i] != tag_buf[13-i])   //!!!??
				{
					temp=error_invalid_tag;
					break;
				}
				if(data_code[4+i] != tag_buf[3-i])
				{
					temp=error_invalid_tag;
					break;
				}
			}
		}
	}
	
	return temp;
}

unsigned char write_authorization(void)
{
	unsigned char xdata i, temp;

	temp=get_authorization();
	if(temp == error_ok)
	{
		amplifier_on();

		for(i=0;i<4;i++)
			tagwritebuf[i]=tag_buf[10+i];
		temp = write_data_process(3);   // 电子标签的3#地址存放MAC码

		if(temp == error_ok)
		{
			for(i=0; i<4; i++)
				tagwritebuf[i]=tag_buf[i];
			temp = write_data_process(4);  // 电子标签的4#地址存放UAC码
		}
		
		amplifier_off();
	}

	return temp;
}


void read_config(void)
{
	unsigned char xdata i, temp;
	
	iic_eeprom_read_adress(config_1820,9);
	
	temp=0;
	for(i=0; i<8; i++)
		temp += common_buf[i];
	temp = (~temp)+1;

	if(temp != common_buf[8])
	{
		config_buf[0]=0;	//卡号输出接口和格式:0-w26, 1-w34, 2-RS485, 3-RS232 
		config_buf[1]=0;    // 卡号输出方式:0-直接输出,1-标准输出
		config_buf[2]=4;	//读卡间隔 1-50ms,2-100ms,3-200ms,4-300ms, 5-500ms, 6-1000ms
		config_buf[3]=0;	//卡号位置,0或5
		config_buf[4]=4;    //485口通信速率,1-1200,2-2400,3-4800,4-9600,5-19200,6-38400,7-57600
		config_buf[5]=0;    //保留
		config_buf[6]=1;    //工作方式:1-定时,2-触发,3-命令
		config_buf[7]=0;    //保留

		temp=0;
		for(i=0;i<8;i++)
		{
			eeprom_buf[i]=config_buf[i];
			temp += config_buf[i];
		}
		eeprom_buf[8]=(~temp) + 1;
		iic_block_write(config_1820,9);
	}
	else
	{
		for(i=0;i<8;i++)
			config_buf[i]=common_buf[i];
	}
}


void  setbps(unsigned char bps)
{
	unsigned char xdata i=bps;
	switch(i)
	{
		// ----- RS232口波特率 -------
		case 0:		//reset 600bps
		    TMR2L = 0x00;
    		TMR2H = 0xf7;
			RCAP2L= 0x00;
			RCAP2H= 0xf7;
			break;
		case 1:		//reset 1200bps	
		    TMR2L = 0x80;
    		TMR2H = 0xfb;
			RCAP2L= 0x80;
			RCAP2H= 0xfb;
			break;
		case 2:		//reset 2400bps	
		    TMR2L = 0xc0;
    		TMR2H = 0xfd;
			RCAP2L= 0xc0;
			RCAP2H= 0xfd;
			break;
		case 3:		//reset 4800bps	
		    TMR2L = 0xe0;
    		TMR2H = 0xfe;
			RCAP2L= 0xe0;
			RCAP2H= 0xfe;
			break;
		case 4:		//reset 9600bps	
		    TMR2L = 0x70;
    		TMR2H = 0xff;
			RCAP2L= 0x70;
			RCAP2H= 0xff;
			break;
		case 5:		//reset 19200bps	
		    TMR2L = 0xb8;
    		TMR2H = 0xff;
			RCAP2L= 0xb8;
			RCAP2H= 0xff;
			break;
		case 6:		//reset 38400bps	
		    TMR2L = 0xdc;
    		TMR2H = 0xff;
			RCAP2L= 0xdc;
			RCAP2H= 0xff;
			break;
		case 7:		//reset 57600bps	
		    TMR2L = 0xe8;
    		TMR2H = 0xff;
			RCAP2L= 0xe8;
			RCAP2H= 0xff;
			break;
		case 8:		//reset 115200bps	
		    TMR2L = 0xf4;
    		TMR2H = 0xff;
			RCAP2L= 0xf4;
			RCAP2H= 0xff;
			break;

		// ----- RS485口波特率 -------
		case 10:	//reset 1200bps
	    	TL1 = 64;
	    	TH1 = 64;
			break;
		case 11:	//reset 1200bps
		   	TL1 = 64;
		   	TH1 = 64;
			break;
		case 12:	//reset 2400bps
		   	TL1 = 160;
		   	TH1 = 160;
			break;
		case 13:	//reset 4800bps
		   	TL1 = 208;
		   	TH1 = 208;
			break;
		case 14:	//reset 9600bps
		   	TL1 = 232;
		   	TH1 = 232;
			break;
		case 15:	//reset 19200bps
		   	TL1 = 244;
		   	TH1 = 244;
			break;
		case 16:	//reset 38400bps
		   	TL1 = 250;
		   	TH1 = 250;
			break;
		case 17:	//reset 57600bps
		   	TL1 = 252;
		   	TH1 = 252;
			break;	
		case 18:	//reset 115200bps
			TL1 = 254;
		   	TH1 = 254;
			break;	
	}
}

void pack_and_send()
{
	// 命令执行返回数据打包,并发送输出
	unsigned char xdata i, m, n, check_sum;
		
	n = sendbuf[1]+1;     // sendbuf[1] 为发送数据包的有效长度.

	m=1;
	for (i=0; i<7; i++)
		if (sendbuf[1] & (1<<i))
				m = (m==1)? 0 : 1;
	if (m==1) 
		sendbuf[1] |= 0x80;    // sendbuf[1]的最高位是低七位的奇校验
	else
        sendbuf[1] &= 0x7f;

	check_sum = 0;
	for(i=0; i<n; i++)
		check_sum += sendbuf[i];
	sendbuf[n] = (~check_sum) + 1;   // 校验和

	sendflag=1;
	sendcount=1;
	receiveflag=0;
	if(uart_selec==1)
	{
			rs485ctl=0;
			SFRPAGE = 0x01;
			SBUF1=sendbuf[0];
			SFRPAGE = 0x0;
	}
	else 
		if(uart_selec==0)
			SBUF0=sendbuf[0];
}

// =================处理数据传输协议======================
void treat_report(void)
{
	unsigned int xdata i, j,temp, is_ok;
	unsigned int  xdata flash_addr;

	switch(combuf[2])
	{
	case 1:		//set baudrate
		temp=combuf[3];
		if(temp>8) temp = 4;    // 9600bps
		eeprom_buf[0]=temp;
		iic_block_write(eeprom_baudl, 1);	//存波特率
	
		sendbuf[0]=0xf0;
		sendbuf[1]=0x02;
		sendbuf[2]=0x01;
		pack_and_send();
        
		delay(1000);    // 等待发送结束
		setbps(temp);
		setbps(temp+10);
		break;
	case 2:	//取版本号
		iic_eeprom_read_adress(hard_versionl,4);

		sendbuf[0]=0xf0;
		sendbuf[1]=0x06;
		sendbuf[2]=0x02;
		for(i=0;i<4;i++)
			sendbuf[i+3]=common_buf[i];
		pack_and_send();
		break;
	case 3:		//取输出功率
		iic_eeprom_read_adress(out_powerl,1);
		
		sendbuf[0]=0xf0;
		sendbuf[1]=0x03;
		sendbuf[2]=0x03;
		sendbuf[3]=common_buf[0];
		pack_and_send();
		break;
	case 4:		//设定输出功率
		if(combuf[3]>150)	
			combuf[3]=150;	//限制最大功率
		eeprom_buf[0]=combuf[3];
		iic_block_write(out_powerl,1);

		sendbuf[0]=0xf0;
		sendbuf[1]=0x02;
		sendbuf[2]=0x04;
		pack_and_send();
		break;
	case 0x07:	//取工作频率
		iic_eeprom_read_adress(current_freql,1);
		sendbuf[0]=0xf0;
		sendbuf[1]=0x03;
		sendbuf[2]=0x07;
		sendbuf[3]=common_buf[0];
	//	sendbuf[3]=get_fre;
		pack_and_send();
		break;
	case 0x08:	//设置工作频率
		if(combuf[3]==0)
			autocon=1;   // 跳频工作
		else
		{
			autocon=0;   // 定频工作
			pll_con(combuf[3]);
		}
		eeprom_buf[0]=combuf[3];
		iic_block_write(current_freql,1);

		sendbuf[0]=0xf0;
		sendbuf[1]=0x02;
		sendbuf[2]=0x08;
		pack_and_send();
		break;
	case 0x0d:	//取天线连接情况
		i=detect_antenna();

		sendbuf[0]=0xf0;
		sendbuf[1]=0x03;
		sendbuf[2]=0x0d;
		sendbuf[3]=i;

⌨️ 快捷键说明

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