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

📄 g1.c

📁 选频加功放一体化模块监控处理程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		PLL_count11=0;
		PLL_count12++;
		
	}
	if (PLL_count1>=80)
	{
	 PLL_count1=0;
	   if((PLL_count11<20)||(PLL_count12<20))	
	   {
	    Prmter1.PLL_STATE1 = 0x00;	
		PLL_count12=0;
		PLL_count11=0;	
  		TRISB5 = 0x00;//LO1LE
		set_pll(FR1,0,0x20,0x02);//最后一个数2代表选用PORTB端口
		TRISB5 = 0x01; 
		//init_freq(9,0x20,0x02,FR1);
	   }
	}
	PLL_count1++;
}

/**********************************************************
** 功能说明:  锁相环3的检测
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/	
void CHECK_PLL3()
{	
	uchar buf13;
	buf13 = PORTD & 0x01;//3
	if(buf13)
	{
		if(PLL_count31>=20)
		{
			Prmter1.PLL_STATE3 = 0x01;
			PLL_count31=20;
			PLL_count3=0;
		}
		PLL_count32=0;
		PLL_count31++;
		
	}
	else
	{
		if(PLL_count32>=20)
		{
		Prmter1.PLL_STATE3 = 0x00;
		PLL_count32=20;
		//PLL_count3=0;
		}
		PLL_count31=0;
		PLL_count32++;
		
	}
	if (PLL_count3>=80)
	{
	 PLL_count3=0;
	   if((PLL_count31<20)||(PLL_count32<20))	
	   {
	    Prmter1.PLL_STATE3 = 0x00;	
		PLL_count32=0;
		PLL_count31=0;	  
		TRISC0 = 0x00;//LO3LE
		set_pll(FR3,0,0x01,0x01);//最后一个数1代表选用PORTC端口
		TRISC0 = 0x01;  
		//init_freq(10,0x01,0x01,FR3);;
	   }
	}
	PLL_count3++;

}

/**********************************************************
** 功能说明: 锁相环选择端口PORTB,PORTC OR  PORTD
** 输入参数:buf4  	类型uchar    :某端口的通道号	
** 输入参数:buf  	类型uchar    :端口号,buf=1为PORTC,buf=2为PORTB
** 输入参数:buf8  	类型uchar    :buf8=0为不锁定,buf8=1为锁定
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/
void PLL_PORT(uchar buf4,uchar buf,uchar buf8)
{
   if (buf8==0)
      {
      	 switch(buf)
	   {

		case 1:		portc_wbuf = portc_wbuf & (~buf4);
				PORTC = portc_wbuf;
		       		break;		    
		case 2:	        portb_wbuf = portb_wbuf & (~buf4);
				PORTB = portb_wbuf;
		       		break;
		default:       break;
	   }
     }
     else
      {
      	   switch(buf)
	   {
		case 1:		portc_wbuf = portc_wbuf | buf4;
				PORTC = portc_wbuf;
		       		break;		    
		case 2: 	portb_wbuf = portb_wbuf | buf4;
				PORTB = portb_wbuf;
		       		break;
		default:       break;
	   }
     }	
}	
/**********************************************************
** 功能说明: 锁相环的控制(一、三级是ADF4360-7,12.8M晶振,起始频点为885MHZ~915MHZ,中频=140MHZ
** 输入参数:  freq	类型 uint	:信道号
** 输出参数:  buf3      类型 uchar	:上下行选择,buf3=0为上行,buf3=1为下行
** 输出参数:  buf4      类型 uchar	:某端口的通道号
** 输出参数:  buf6      类型 uchar	:端口号,buf6=0为PORTD,buf6=1为PORTC,buf6=2为PORTB
** 返 回 值:  无
** 引用函数: 
****/
void set_pll(uint freq,uchar buf3,uchar buf4,uchar buf6)
{
	auto uchar reg_n_a;
	auto uint  reg_n_b,buf1,buf2;
	auto union reg_n_buf reg_n_union;
	SSPSTAT = 0x40;             
	SSPCON  = 0x20;
        PLL_PORT(buf4,buf6,0);
	send(2,0x00000201);
//	send(2,0x00000191);
        PLL_PORT(buf4,buf6,1);
	
        PLL_PORT(buf4,buf6,0);
	send(2,0x004fe120);
//	if (buf4==0x20)//LO1LE
//	{
//	send(2,0x008fc128);
//	}
//	else if (buf6==0x01)//LO3LE
//	{
//	send(2,0x008fc128);
//	}	
        PLL_PORT(buf4,buf6,1);
	
	delay_unit(1000);
	dog();
    
	if(freq > 300)//最大信道号的判断
	{
	buf2 = 300;
	}
	else 
	{
	buf2 = freq;
	}		
	buf1 = buf2 + 10;
		
       if (buf6==0x02) 	 
       {
	reg_n_a = buf1 % 16;
        reg_n_b = 465 + buf1 / 16;
       }
       else if (buf6==0x01)//LO3LE
       { 
	reg_n_a = buf1 % 16;		   
	reg_n_b = 465 + buf1 / 16;   	
	}	
	reg_n_union.buf1 = 0x00000000;
	reg_n_union.buf2[1] = reg_n_b%256;
	reg_n_union.buf2[2] = reg_n_b/256;

	//reg_n_union.buf2[2] = reg_n_union.buf2[2] | 0x40; //2分频 
	reg_n_a = (reg_n_a << 2) | 0x02;
	reg_n_union.buf2[0] = reg_n_union.buf2[0] | reg_n_a;
        PLL_PORT(buf4,buf6,0);
	send(2,reg_n_union.buf1);
        PLL_PORT(buf4,buf6,1);
return;
}

/**********************************************************
** 功能说明: 发送数据
** 输入参数:  k		类型 uint	:发送的次数
** 输入参数:  buf	类型 ulong	:发送的数据	
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/
void send(int k,ulong buf6)
{
	auto union reg_n_buf reg_n_union1;
	SSPIF = 0;
	reg_n_union1.buf1 = buf6;
	for(k = 2;k >= 0;k--)
	{
		SSPBUF = reg_n_union1.buf2[k];
		while(SSPIF == 0)
		{
			;
		}
		SSPIF = 0;
	}	
return;
}
/**********************************************************
** 功能说明:  485串口数据处理
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
**********************************************************/
void serial_data()
{
	auto uchar start,length,buf,buf1;
	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(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_cnt-4;  //长度=命令体长度+……(不包括起始、结束、ASCII校验这4个字节)
		//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 = Set_Basic_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;
		}		
		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 =Set_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 if(receive_buf[5]==0xd1)//查询表格参数
		{		
			if (receive_buf[8]==0x01)//查询所有温度值
			{
				buf=Query_tp(tempd,0x01);
			}
			else if (receive_buf[8]==0x02)//查询所有频率值
			{
				buf=Query_tp(freqd,0x02);	
			}
			else if (receive_buf[8]==0x03)//查询所有温补参数编码
			{
				buf=Query_csd(1,tn);				
			}
			else if (receive_buf[8]==0x04)//查询所有频补参数编码
			{
				buf=Query_csd(2,pn);	
			}
			else if (receive_buf[8]==0x05)//查询所有标称值参数编码
			{
				buf=Query_csd(3,zyn);				
			}
			else if (receive_buf[8]==0x06)//查询所有温补参数表内容
			{
				buf=Query_cszd(tempcszd,tn);		
			}
			else if (receive_buf[8]==0x07)//查询所有频补参数表内容
			{
				buf=Query_cszd(freqcszd,pn);		
			}
			else if (receive_buf[8]==0x08)//查询所有标称值参数表内容
			{
				buf=Query_cszd(bczcszd,zyn);		
			}
			receive_buf[7]=buf;//命令体长度
			send_reply_flag(0x00,buf);	
			goto go_return;	
			
		}
		else if(receive_buf[5]==0xd2)//设置表格参数
		{
			if (receive_buf[8]==0x01)//设置所有温度值
			{
				buf=Set_tp(tempd);
			}
			else if (receive_buf[8]==0x02)//设置所有频率值
			{
				buf=Set_tp(freqd);	
			}
			else if (receive_buf[8]==0x06)//设置所有温补参数表内容
			{
				buf =Set_cszd(tempcszd,tn);
			}
			else if (receive_buf[8]==0x07)//设置所有频补参数表内容
			{
				buf =Set_cszd(freqcszd,pn);
			}
			else if (receive_buf[8]==0x08)//设置所有标称值参数表内容
			{
				buf =Set_cszd(bczcszd,zyn);
			}
			receive_buf[7]=buf;//命令体长度
			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;
}

/**********************************************************
** 功能说明:  基本信息参数设置/查询函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  参数个数
** 引用函数: 
**********************************************************/
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++)

⌨️ 快捷键说明

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