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

📄 cdma800.c.bak

📁 10W功放模块监控程序
💻 BAK
📖 第 1 页 / 共 4 页
字号:
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2006/01/11
*********************************************************/
uchar Set_Basic_Parameter()
{
	auto union buf_union comm;
	uint i;
	uchar length;
	uchar para_len;//参数值长度
	uchar buf;
	uchar *P = 0;
	length = receive_cnt-10;//命令体长度
	P = receive_buf+7;
	erro = 0;
	while(length)
	{
		comm.buf2[0] = *P++;
		comm.buf2[1] = *P++;
		para_len=*P++;//参数值长度
		length = length - 3 ;
		
		switch(comm.buf1)
		{
			case 0xf000:	//模块ID号
						if(receive_buf[5]==0x60)//设置命令
						{ 
							for(i=0;i<para_len;i++)
							{
								buf=*P++;
								wrom(mod_idadd+i,buf);		
							}
						}
						else
						{
							for(i=0;i<para_len;i++)
							{
								*P++=rrom(mod_idadd+i);		
							}
						}
							length=length-para_len; 
							break;
			case 0xf001:    //模块类型
						if(receive_buf[5]==0x60)//设置命令
						{ 
							for(i=0;i<para_len;i++)
							{
								buf=*P++;
								wrom(mod_typeadd+i,buf);		
							}
						}
						else
						{
							for(i=0;i<para_len;i++)
							{
								*P++=rrom(mod_typeadd+i);		
							}
						}
						length=length-para_len; 	
			                break;
			case 0xf002:	//模块地址
						if(receive_buf[5]==0x60)//设置命令
						{ 
							Prmter1.ADDR=*P++ ;
							wrom(mod_add_add,Prmter1.ADDR);	
						}
						else
						{
							*P++=Prmter1.ADDR;
						}				
							length--; 
							break;	
			case 0xf003:    //协议版本
							*P++=PROTL;
							length--; 
			                break;
//			case 0xf004:    //模块参数个数
//							*P++=MOD_Num;
//							length--; 
//			                break;
			case 0xf005:    //温补参数个数
							*P++=tn;
							length--; 
			                break; 
//			case 0xf006:    //频响补偿参数个数
//							*P++=pn;
//							length--;
//			                break;
			case 0xf007:    //增益标称值补偿参数个数
							*P++=zyn;
							length--;
			                break; 
			case 0xf008:    //增益刻度
							*P++=bcnumb;
							length--;
			                break;
			case 0xf017:    //程序ID号
							for(i=0;i<para_len;i++)
							{
								*P++=PRO_ID[i];		
							}
							length=length-para_len;
			                break; 
			case 0xf018:    //程序版本号
							*P++=0x01;
							*P++=0x00;
							length=length-2;
			                break;                                                             
			case 0xf019:	//生产序列号
						if(receive_buf[5]==0x60)//设置命令
						{
							for(i=0;i<para_len;i++)
							{
								buf=*P++;
								wrom(product_add+i,buf);		
							}
						}
						else
						{
							for(i=0;i<para_len;i++)
							{
								*P++=rrom(product_add+i);		
							}
						}	
							length=length-para_len; 
							break;																
			default: 	receive_buf[8] = *--P;
						receive_buf[7] = *--P;
						if(receive_buf[5]==0x60)//设置命令
						{
							erro = erro | 0x02;
						}
						else
						{
							erro = erro | 0x01;
						}
							
						length = 0;
						break;//特殊处理
		}
	}
			
	if(erro & 0x02)
	{
		length = 2;//设置参数失败
	}
	else if(erro & 0x01)
	{
		length = 2;//查询参数失败
	}
	else
	{
		length =receive_cnt-10;
	}
	return length;
}
/**********************************************************
** 功能说明:  参数地址查询函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  参数个数
** 引用函数: 
** 创 建 人: 陈璐         创建时间:2005/01/11
*********************************************************/
uchar Query_Address()
{
	uchar i,buf;
	uchar length;
	buf = receive_buf[7];
    receive_buf[7]=3;//总包数
    receive_buf[8]=buf;//包序号数
	switch(buf)
	{
		case 1:		for(i=0; i<68; i++)
		       		{
		       			receive_buf[i+9]= Para_Num_Conf[i];
		       			length = 70;
		       		}
		       		break;
		case 2:		for(i=0; i<68; i++)
		       		{
		       			receive_buf[i+9]= Para_Num_Conf[i+68];
		       			
		       		}
         			length = 70;
         			break;
		case 3:		for(i=0; i<Para_Num - 136; i++)
		       		{
		       			receive_buf[i+9]= Para_Num_Conf[i+136];
		       			
		       		}
					length = Para_Num - 134;
					break;
		default:	length = 1;//查询参数失败
					break;
	}
	return length;	
}
/**********************************************************
** 功能说明:  参数设置/查询函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  参数个数
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2005/01/11
*********************************************************/
uchar Set_Parameter()
{
	auto union buf_union comm;
	auto union buf_union Pbuf;
	uchar length;
	uchar para_len;//参数值长度
	uchar buf;
	//uchar buf1,buf2;
	uchar *P = 0;
	length = receive_cnt-10;//命令体长度
	P = receive_buf+7;
	erro = 0;
	while(length)
	{
		comm.buf2[0] = *P++;
		comm.buf2[1] = *P++;
		para_len=*P++;//参数值长度
		length = length - 3 ;
		switch(comm.buf1)
		{
			case poffset1:	
									if(receive_buf[5]==0xc1)//设置命令
									{
							 				Prmter1.POFFSET1=*P++ ;
											wrom(poff1add,Prmter1.POFFSET1);	
										}
										else
										{
											*P++  = Prmter1.POFFSET1; 	
										}
	
							length--; 
							break;
			case poffset2:
							if(receive_buf[5]==0xc1)//设置命令
							{	
				               Prmter1.POFFSET2=*P++ ;
							       wrom(poff2add,Prmter1.POFFSET2);
		              		}
							else
							{
								*P++  = Prmter1.POFFSET2; 	
							}		
							length--; 
							break;	
			case poffset3:	
					         if(receive_buf[5]==0xc1)//设置命令
							{	
								Prmter1.POFFSET3=*P++ ;
								wrom(poff3add,Prmter1.POFFSET3);
                  			}
							else
							{
								*P++  = Prmter1.TEMP; 	
							}				
							length--; 
							break;	
			case att:	
				       if(receive_buf[5]==0xc1)//设置命令
					   {	
							Prmter1.ATT = *P++;
						    wrom(attadd,Prmter1.ATT);
						    init_att(1 ,1,Prmter1.ATT);
                  	   }
						else
						{
							*P++  = Prmter1.ATT; 	
						}							
						length--; 
						break;

			case vgs1:
				    if(receive_buf[5]==0xc1)//设置命令
						{	
								Prmter1.VGS1_L = *P++;
								Prmter1.VGS1_H = *P++;
												
								wrom(vgs1add,Prmter1.VGS1_L);
								wrom(vgs1add+1,Prmter1.VGS1_H);

								if(Prmter1.BUTTON1==1)//开栅压1
								{				
									init_vgsandpcu(2 ,2,Prmter1.VGS1_H,Prmter1.VGS1_L);
								}
							}
							else
							{
								*P++ = Prmter1.VGS1_L;
								*P++ = Prmter1.VGS1_H;
							}
						
						length=length-2;
						break;
			case vgs2:	
						if(receive_buf[5]==0xc1)//设置命令
						{	
								Prmter1.VGS2_L = *P++;
			
								Prmter1.VGS2_H = *P++;					
								wrom(vgs2add,Prmter1.VGS2_L);
								wrom(vgs2add+1,Prmter1.VGS2_H);
								if(Prmter1.BUTTON1==1)//开栅压2
								{					
									init_vgsandpcu(1 ,3,Prmter1.VGS2_H,Prmter1.VGS2_L);
								}
							}
							else
							{
								*P++ = Prmter1.VGS2_L;
								*P++ = Prmter1.VGS2_H;
							}
						length=length-2;
						break;
			case vgs3:
				      if(receive_buf[5]==0xc1)//设置命令
						  {		
						  	Prmter1.VGS3_L = *P++;
								Prmter1.VGS3_H = *P++;
								wrom(vgs3add,Prmter1.VGS3_L);
								wrom(vgs3add+1,Prmter1.VGS3_H);

								if(Prmter1.BUTTON1==1)//开栅压3
								{
								init_vgsandpcu(0 ,4,Prmter1.VGS3_H,Prmter1.VGS3_L);
								}
							}
						  else
							{
								*P++ = Prmter1.VGS3_L;
								*P++ = Prmter1.VGS3_H;
							}
						length=length-2;
						break;
			case pc:	
				     if(receive_buf[5]==0xc1)//设置命令
						  {
						  	Prmter1.PC = *P++;
								wrom(pcadd,Prmter1.PC);
								buf=Prmter1.PC+Prmter1.POFFSET3;
								Pbuf.buf1=10*buf+192;
					    	Prmter1.PCU_H=Pbuf.buf2[1];
					    	Prmter1.PCU_L=Pbuf.buf2[0];
					   		wrom(pcuadd,Prmter1.PCU_L);
					    	wrom(pcuadd+1,Prmter1.PCU_H);
					    	init_vgsandpcu(3 ,5,Prmter1.PCU_H,Prmter1.PCU_L);//功放输出功率
					    }
					      else
							{
								*P++ = Prmter1.PC;
							}
		
						length--;
						break;
			case pcu:	
				   if(receive_buf[5]==0xc1)//设置命令
						  {
						  	Prmter1.PCU_L = *P++;
						    wrom(pcuadd,Prmter1.PCU_L);
						    Prmter1.PCU_H = *P++;
							  wrom(pcuadd+1,Prmter1.PCU_H);
							  init_vgsandpcu(3 ,5,Prmter1.PCU_H,Prmter1.PCU_L);//功放输出功率
								Pbuf.buf2[0]=Prmter1.PCU_L;
								Pbuf.buf2[1]=Prmter1.PCU_H;
								Pbuf.buf1=Pbuf.buf1-192;
								if(Pbuf.buf1>=0x8000)
								{
									Prmter1.PC=0x00;
								}
								else
								{
									Prmter1.PC=Pbuf.buf1/10;
									Prmter1.PC=Prmter1.PC-Prmter1.POFFSET3;
								}
					    	wrom(pcadd,Prmter1.PC);
					    }
					     else
							{
								*P++ = Prmter1.PCU_L;
								*P++ = Prmter1.PCU_H;
							}
						length=length-2;
					    break;
		
			case button1:
				      if(receive_buf[5]==0xc1)//设置命令
						  {  
								Prmter1.BUTTON1 = *P++;
								wrom(but1add,Prmter1.BUTTON1);
								if(Prmter1.BUTTON1==0)//关栅压1
								{
								DAC(0x02,0,0);
								DAC(0x01,0,0);
								DAC(0x00,0,0);
								}
								else 
								{
									init_vgsandpcu(2 ,2,Prmter1.VGS1_H,Prmter1.VGS1_L);
									init_vgsandpcu(1 ,3,Prmter1.VGS2_H,Prmter1.VGS2_L);
									init_vgsandpcu(0 ,4,Prmter1.VGS3_H,Prmter1.VGS3_L);
						    }
						  }
						    else
							{
								*P++ = Prmter1.BUTTON1;
							}
		        length--;
						break;
			case temp:	*P++ = Prmter1.TEMP; 	
						length--; 
						break;
			case tempu:	*P++ = Prmter1.TEMPU_L; 	
						length--; 
					*P++= 0; 
					length--; 
						break;
			case pof:	*P++= Prmter1.POF+Prmter1.POFFSET1;
						length--;
						break;
			case pofu:	*P++= Prmter1.POFU_L;
						length--;
					*P++= 0;
						length--;	
						break;	
			case por:	*P++ = Prmter1.POR+Prmter1.POFFSET2 ;
						length--;
						break;					
			case poru:	*P++= Prmter1.PORU_L ;
						length--;
					*P++= 0 ;
						length--;
						break;
			case V_28:	*P++= Prmter1.V28_L;
						length--;
						*P++= Prmter1.V28_H;
						length--;
						break;
			case V_28V:	*P++= Prmter1.V28U_L;
						length--;
						*P++= 0;
						length--;
						break;
			case ctr:	*P++= Prmter1.CTR;
						length--;
						break;
			case ctru:	*P++= Prmter1.CTRU;
						length--;
						*P++= 0;
						length--;
						break;
			case pa_flw:	*P++ = Prmter1.F_PWR;
						length--;
						break;
			case id1:	*P++ = Prmter1.ID1;
						length--;
						*P++ = 0;
						length--;
						break;
			case id1u:	*P++ = Prmter1.ID1U_L;
						length--;
						*P++=0;
						length--;
						break;						
			case id2:	*P++= Prmter1.ID2;
						length--;
						*P++ = 0;
						length--;
						break;
			case id2u:	*P++ = Prmter1.ID2U_L;
						length--;
						*P++ = 0;
						length--;
						break;
			case id3:	*P++ = Prmter1.ID3;
						length--;
						*P++ = 0;
						length--;
						break;
			case id3u:	*P++= Prmter1.ID3U_L;
						length--;
						*P++ = 0;
						length--;
						break;
			case id1st:  	*P++ = Prmter1.ID1ST;		
					    	length--;   	 
						break;		
			default: 	receive_buf[8] = *--P;
						receive_buf[7] = *--P;
						if(receive_buf[5]==0xc1)//设置命令
						{
							erro = erro | 0x02;
						}
						else
						{
							erro = erro | 0x01;
						}
						length = 0;
						break;//特殊处理
		}
	}
	if(erro & 0x02)
	{
		length = 2;//设置参数失败
	}
	else if(erro & 0x01)
	{
		length = 2;//查询参数失败
	}
	else
	{
		length = receive_cnt-10;//命令体长度
	}
	return length;
}

/**********************************************************
** 功能说明:  发送参数函数
** 输入参数:  	类型:	uchar	应答标志位
		类型:	uchar	命令体的长度	   	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐         创建时间:2005/01/11
*********************************************************/		
void send_reply_flag(uchar reply_flag,uchar length)
{
	auto uchar start,i;
	//receive_buf[7] = length;
	receive_buf[6] = reply_flag;	
	start = 1;                 //CRC校验
	length = length + 6;
	CheckCRC(receive_buf,length,start,pChecksum);
	receive_buf[length + 1] = pChecksum[0];
	receive_buf[length + 2] = pChecksum[1];	
	length = length + 3;//加上校验字节(2BYTE),再加一个字节,就为包的总长度-1
	receive_buf[length] = 0x4e;//最后一个字节是包尾
	
	portd_wbuf = portd_wbuf | 0x10; //485发送使能
	PORTD = portd_wbuf;		
	
	TXEN = 1;                       //USART 使能
	delay_unit(2000);
	length = length + 1;
	
	for(i = 0;i < length;i ++)
	{
		if((i==0)||(i==(length-1)))
		{
			TXREG = receive_buf[i];	
		}
		else if(receive_buf[i]==0x5e)
		{
			TXREG = 0x5e;
			receive_buf[i]=0x5d;
			i--;
		}
		else if(receive_buf[i]==0x4e)
		{
			TXREG = 0x5e;
			receive_buf[i]=0x4d;
			i--;
		}
		else
		{
			TXREG = receive_buf[i];		
		}
		while(TRMT == 0)
		{
			;
		}
	}
	delay_unit(1000);
	TXEN = 0;
	portd_wbuf = portd_wbuf & 0xef;
	PORTD = portd_wbuf;   
	headend_flag=0x00;  
	return;             
}
/**********************************************************
** 功能说明: CRC校验函数
** 输入参数:  	类型:	uchar*	须校验的数组
		类型:	uchar	命令体的长度
		类型:	uchar	开始位置
		类型:	uchar*	校验配置表	   	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 李承胜          创建时间:不详
*********************************************************/	
void CheckCRC(uchar *pData, uchar length,uchar start, uchar *pChecksum)
{
	auto uchar  i = 0;
	auto uint checksum = 0;
	for(i = 0;i < length;i ++)
	{		
		checksum = ( checksum << 8) ^ CRCTable[( checksum >> 8 ) ^ pData[i + start]];
	}
	pChecksum[0] = checksum % 256;  
	pChecksum[1] = checksum / 256;   
	return;
}

/**********************************************************

⌨️ 快捷键说明

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