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

📄 zhubo.c.bak

📁 驻波模块的监控数据处理
💻 BAK
📖 第 1 页 / 共 3 页
字号:
	uchar  wcount;
    union buf_union comm;
    wcount = 0;
	comm.buf1 = addr;
iic_write_re:
	if( wcount > 4 )
	{
		iic_stop();
		_nop();
		wcount = 0;
		err_eeprom = 1;
		return 0;
	}
	_nop();
	iic_star();
	iic_send((comm.buf2[1]<<1) | 0xa0);
	ubuf = iic_ack();
	if(ubuf)
	{
		wcount++;
		_nop();
		goto iic_write_re;
	}
	iic_send(comm.buf2[0]);
	ubuf = iic_ack();
	if(ubuf)
	{
		wcount++;
		_nop();
		goto iic_write_re;
	}
	iic_send(buf);
	ubuf = iic_ack();
	if(ubuf)
	{
		wcount++;
		_nop();
		goto iic_write_re;
	}	
	iic_stop();
	return 1;
}
/**********************************************************
** 功能说明:  延时函数
** 输入参数:
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void iic_delay()
{
	uchar  a;
	for(a = 0; a < IIC_DELAY ; a++ )
	{
		asm("NOP");
	}
}
/**********************************************************
** 功能说明:  操作eeprom时发起始命令
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void iic_star()
{
	TRISC0 = 0;
	TRISC1 = 0;
	scl(1);
	sda(1);
//	_nop();
	sda(0);
	scl(0);
	_nop();
}
/**********************************************************
** 功能说明:  操作eeprom完成时发结束命令
** 输入参数: 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void iic_stop()
{
	TRISC0 = 0;
	TRISC1 = 0;
	sda(0);
	scl(1);
	_nop();
	sda(1);
	_nop();
	scl(1);
	_nop();
}
/**********************************************************
** 功能说明:  发数据给eeprom
** 输入参数: buf			类型:uchar		:需要发送的数据
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/

void iic_send(uchar buf)
{
	uchar i;
	TRISC0 = 0;
	TRISC1 = 0;
	for(i = 0 ; i < 8 ;i++)
	{
		if( buf & 0x80 )
		{
			sda(1);
		}
		else
		{
			sda(0);
		}
		_nop();
		scl(1);
		//_nop();
		scl(0);
		//_nop();
		buf = buf << 1;
	}
}
/**********************************************************
** 功能说明:  从eeprom获取数据
** 输入参数: 
** 输出参数:  buf 		类型:uchar		:获取的数据
** 返 回 值:  无 
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/	
uchar iic_get()
{
	uchar  i,buf;
	buf = 0x00;
	TRISC0 = 0;
	TRISC1 = 1;
	for(i = 0 ; i < 8 ;i++)
	{		
		scl(1);
		_nop();
		buf = buf <<1;
		if(PORTC & 0x02)
		{
		buf = buf|0x01;
		}
		scl(0);
		_nop();	
	}
	return buf;
}
/**********************************************************
** 功能说明:  eeprom回应命令体
** 输入参数:  buf          类型:uchar 	:0响应/1无响应
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
uchar iic_ack()
{
	uchar buf;
	TRISC1 = 1;
	TRISC0 = 0;
	sda(1);
	_nop();
	scl(1);
	if(PORTC & 0x02)
		buf = 1;
	else
		buf = 0;
	scl(0);
	_nop();
	TRISC1 = 0;
	_nop();
	return buf;
}
/**********************************************************
** 功能说明:  收到数据发出响应
** 输入参数: 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void ack_iic(uchar buf)
{
	if(buf == 0)
	{
		sda(0);
	}
	else
	{
		sda(1);
	}
	_nop();
	
	scl(1);
	_nop();
	scl(0);
	_nop();
}




/**********************************************************
** 功能说明:  485串口数据处理
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人:  陈璐        创建时间:2006/01/04
*********************************************************/
void serial_data()
{
	auto uchar start,length,buf,buf1;
//	uchar mokuaiadd;
	uchar bufver;//接收到的版本号
	if(receive_over == 1)//如果接收完毕(包头,包尾都收到)
	{
		length = receive_cnt - 2; 
		//if(Prmter1.TYPE != receive_buf[1])   //判断协议类型
		
//		if(TYPE != receive_buf[1])   //判断协议类型
//		{
//			send_reply_flag(0x10,0x00);//协议类型错误
//			goto go_return;
//		}
		
		if((Prmter1.ADDR != receive_buf[4]) && (receive_buf[4] != 0xff))//模块地址错(0xff为广播群发)0X00为没有设置地址
		{
			goto go_return;	//模块地址不符合,没返回
		}	
		dog();
		
		bufver=receive_buf[2] & 0x0f;//取缓冲数组的第二个字节的低4位字节,高4位是信息来源
		//if(Prmter1.PROTL_ETN != bufver)//协议版本号判断
		if(bufver!= PROTL)//协议版本号判断
		{
			send_reply_flag(0x02,0x00);//0X02表示版本错误
			goto go_return;	
		}

		if(receive_buf[7] > 69)   //命令体长度不能大于69
		{
			send_reply_flag(0x05,0x00);
			goto go_return;
		}
		if(receive_buf[6]!= 0xff) //命令头应答标志错
		{
			send_reply_flag(0x06,0x00);
			goto go_return;
		}
		
		length = receive_buf[7] + 7;  //长度=命令体长度+……(不包括起始、结束、ASCII校验这4个字节)
		start = 1;
		CheckCRC(receive_buf,length,start,pChecksum);
		buf1 = length + 1;
		
		if((pChecksum[0] != receive_buf[buf1]) || (pChecksum[1] != receive_buf[buf1+1]))//CRC检验判断
		{
			send_reply_flag(0x03,0x00);
			goto go_return;
		}

		if(receive_buf[5] == 0x40)//查询基本参数
		{

				buf = Query_Basic_Parameter();//模块基本信息参数查询
				send_reply_flag(0x00,buf);//发送成功标志
				goto go_return;
		}		
		if(receive_buf[5] == 0x60)//设置基本信息项
		{
			buf = Set_Basic_Parameter();//模块基本信息参数设置
			if(erro&0x02)//设置出错
			{
				receive_buf[6] = 0x07;
				erro = erro & 0xfd;
			}
			else
			{
				receive_buf[6] = 0x00;
			}
			send_reply_flag(receive_buf[6],buf);
			goto go_return;
		}
		
		if(receive_buf[5] == 0xc1)//设置参数
		{
			buf = Set_Parameter();//设置参数
			if(erro&0x02)//设置出错
			{
				receive_buf[6] = 0x07;
				erro = erro & 0xfd;
			}
			else
			{
				receive_buf[6] = 0x00;
			}
			send_reply_flag(receive_buf[6],buf);
			goto go_return;
		}
		else if(receive_buf[5] == 0xc2)//查询参数
		{
			buf = Query_Parameter();
			if(erro&0x01)//查询出错
			{
				receive_buf[6] = 0x08;
				erro = erro & 0xfe;
			}
			else
			{
				receive_buf[6] = 0x00;
			}
			send_reply_flag(receive_buf[6],buf);
			goto go_return;
		}
		else if(receive_buf[5] == 0x50)//查询模块参数地址
		{
			buf = Query_Address();
			send_reply_flag(0x00,buf);
			goto go_return;
		}
				
		else
		{
			send_reply_flag(0x09,0x00); //命令编号错
			goto go_return;
		}
	}
	else if(receive_over == 0 && receive_time_on == 1)
	{
		if(receive_time_count >= 200)
		{
			headend_flag=0x00;
			tran_flag=0x00;
			receive_time_on = 0;
			receive_time_count = 0;
			receive_free();
			receive_cnt = 0x00;
			CREN = 1;
			RCIE = 1;
			return;
		}
		else 
		{
			receive_time_count++;
			return;
		}
	}
//	T1CON=0x31;
	return;
go_return:
		headend_flag=0x00;
		tran_flag=0x00;
		receive_free();
		receive_over = 0;
		receive_cnt = 0;
		CREN = 1;
		RCIE = 1;
	//	T1CON=0x31;
		return;
}

/**********************************************************
** 功能说明:  基本数据查询函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  参数个数
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2005/12/12
*********************************************************/
uchar Query_Basic_Parameter()
{
	uchar buf;
	uchar i ;
	uint j ;
	j = 0x0700;
	buf=receive_buf[8];//BUF为上位机下传的第几包数据;命令体的第1个字节为我应传给上位机第几包数据
	receive_buf[8]=2;//PIC需上传总包数为2包;所以命令体的第1个字节变成了总包数.
	if(buf==1)
	{
		receive_buf[9]=1;//表示PIC发送第1包数据
		for(i=0; i<32; i++)
		{
			receive_buf[i+10] = basic_table[i];
		}
		return 34;
	}
	else if(buf==2)//
	{
		receive_buf[9]=2;//表示PIC发送第2包数据
		for(i=0; i<37; i++)
		{
			receive_buf[i+10] = rrom(j + i);
		}
		return 39;
	}
	else
	{
		return 0;
	}

}
/**********************************************************
** 功能说明:  基本信息参数设置函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  参数个数
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2006/01/11
*********************************************************/
uchar Set_Basic_Parameter()
{
	auto union buf_union comm;
	uint i;
	uchar length;
	uchar buf;
	uchar *P = 0;
	length = receive_buf[7];
	P = receive_buf+8;
	erro = 0;
	while(length)

⌨️ 快捷键说明

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