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

📄 g1.c

📁 选频加功放一体化模块监控处理程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
      * Copyright (c) 2005,
      * All rights reserved.
      * 
      * 文件名称:GSM900.C
      * 文件标识:见配置管理计划书
      * 摘    要:选频+功放模块的监控数据处理
      * 
      * 当前版本:1.1
     
*/

#include"g1.h"

void main()
{
	delay_unit(10000);
	init_mcu();	
	init_menu();
	init_serial();
	init_eeprom();

	for( ; ; )
	{
 	sign_collect();
	serial_data();
	
		if (chushi>=0x0d6b)//定时器1产生3435次中断,每次终端时间为65.5*8=524ms,3435次中断约为半个小时
		{
		init_sign_ctl();
		chushi=0;
		}
	}

}
void init_mcu()
/********************************************************************
 初始化项目:
	1、WDT
 	2、ADC
 	3、SSP(只初始化端口方向,其他的在具体使用的时候初始化)
 	4、TMR1
 	5、USART
 	6、中断资源
 	7、端口方向
********************************************************************/
{
		
		TRISA  = 0x3f; //initialize the direction of the ports
		TRISB  = 0x35;//RB3为DSALE1
		TRISC  = 0x81;
		TRISD  = 0xef;
		TRISE  = 0x07;
		porta_wbuf = 0x00;
		portb_wbuf = 0x00;
		portc_wbuf = 0x00;
		portd_wbuf = 0x00;//modify
		porte_wbuf = 0x00;
		
//		TMR1L  = 0x00; //initialize TMR1,65.6ms
//		TMR1H  = 0x00;
//		T1CON  = 0x00;
		
	//	SPBRG  = 0x19; //initialize USART baud = 9600 error = 0.16%
	SPBRG  = 0x0c; //initialize USART baud = 19200 error = 0.16%
		TXSTA  = 0x06;
		RCSTA  = 0x90;	
		OPTION = 0x8f;
		INTCON = 0xc0;
		PIE1   = 0x21;
		PIR1   = 0x00;
		PIE2   = 0x00;
		PIR2   = 0x00;
		PCON   = 0x03;
		
		//定时器设置
		TMR1L  = 0x00; //initialize TMR1,65.5ms
		TMR1H  = 0x00;
		T1CON  = 0x31;//使能定时器工作,TMR1ON=1;8分频65.5*8=524ms;
}
void init_menu()
{
	dog_soft = 0;
	dog();
//	delay_Tad(300);
	chushi=0;
	Prmter1.ATT1 = rrom(att1add); 
	Prmter1.ATT2 = rrom(att2add);
	Prmter1.VGS1_L = rrom(vgs1add);
	Prmter1.VGS1_H = rrom(vgs1add+1);
	Prmter1.VGS2_L = rrom(vgs2add);
	Prmter1.VGS2_H = rrom(vgs2add+1);
	Prmter1.VGS3_L = rrom(vgs3add);
	Prmter1.VGS3_H = rrom(vgs3add+1);
	Prmter1.VGS4_L = rrom(vgs4add);
	Prmter1.VGS4_H = rrom(vgs4add+1);
	Prmter1.PC1 = rrom(pc1add);
	Prmter1.PC1U_L = rrom(pc1uadd);
	Prmter1.PC1U_H = rrom(pc1uadd+1);
	Prmter1.PC2 = rrom(pc2add);	
	Prmter1.PC2U_L = rrom(pc2uadd);
	Prmter1.PC2U_H = rrom(pc2uadd+1);
	Prmter1.FREQ1_L = rrom(freq1add);
	Prmter1.FREQ1_H = rrom(freq1add+1); 
	FR1=Prmter1.FREQ1_H *256+Prmter1.FREQ1_L ;

	Prmter1.FREQ3_L = rrom(freq3add);
	Prmter1.FREQ3_H = rrom(freq3add+1); 
	FR3=Prmter1.FREQ3_H *256+Prmter1.FREQ3_L ;
	Prmter1.BUTTON1= rrom(but1add); 
	Prmter1.BUTTON2= rrom(but2add);
	Prmter1.POFFSET1=rrom(poff1add);
	Prmter1.POFFSET2=rrom(poff2add);
	Prmter1.POFFSET3=rrom(poff3add);
	Prmter1.POFFSET4=rrom(poff4add);
//	Prmter1.PROTL_ETN = 0x02;//协议版本
	Prmter1.ADDR = rrom(mod_add_add);
	tempcheck=0;
	tran_flag=0x00;//转义标志,=0为没有转义,=1为转义过了
	headend_flag=0x00;
}
/**********************************************************
** 功能说明:  串口初始化函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void init_serial()
{
	auto int i;

	for(i = 0;i < BUF_LENGTH;i++)
	{
		receive_buf[i] = 0;
	}
	for(i = 0; i < 2 ;i ++)
	{
		pChecksum[i] = 0;
	}
	receive_time_on = 0;
	receive_time_count = 0;
	receive_over = 0;
	receive_cnt = 0;
//	dog();	
	portd_wbuf = portd_wbuf & 0xef;
	PORTD = portd_wbuf;
}
/**********************************************************
** 功能说明:  初始化eeprom函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void init_eeprom(void)
{
	uint i;
	uchar j;
	TRISD1 = 0;
	TRISC2 = 0;
	err_eeprom=0;
	dog();
	j = rrom(0x07ff); 
	if(j!=0xab)
	{
		for(i=0;i<0x07ff;i++)
		{
			wrom(i,0x00);
			dog();	
		}
		wrom(0x07ff,0xab);
//		wrom(mod_idadd,0x00);//写入模块ID号地址低字节
//		wrom(mod_idadd+1,0xf0);//写入模块ID号地址高字节
//
//		wrom(mod_add_add,0x02);//写入模块地址的地址低字节
//		wrom(mod_add_add+1,0xf0);//写入模块地址的地址高字节
//		
//		wrom(product_add,0x19);//写入生产序列号参数地址低字节
//		wrom(product_add+1,0xf0);//写入生产序列号参数地址高字节
		
	}
}

void dog()
{
	asm("CLRWDT");
	OPTION = 0x8f;	
}




void delay_unit(uint buf)
{
	auto uint i;
	for(i = 0;i < buf ;i++)
	{
		asm("nop");
	}
}
void delay_Tad(uchar j)  
{
	auto uchar i;
	for(i=0;i<j;i++)
	{
		asm("nop");
		asm("nop");
		asm("nop");
	}	
}


/**********************************************************
** 功能说明:  增益1、2控制初始化控制函数
** 输入参数:  tempnumb   类型:uchar  :温度补偿第几个参数 
			  attnumb   类型:uchar  :标称值补偿第几个参数	
			  fqnumb	类型:uchar  :频响补偿第几个参数
			  fr       类型:uint  :本振信道数值
			  attbuf	类型:uchar  :衰减数值
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/	
void init_att(uchar tempnumb ,uchar attnumb,uchar fqnumb,uint fr,uchar attbuf)//
{
	uchar buf;
		Prmter1.GCUTPBC=TEMP(tempnumb);
		Prmter1.GCUBC=ATTBU(attbuf,attnumb);
		fr=fr>>1;
		Prmter1.FQGCUBC=FREQBU(fr,fqnumb);
		dog();
		buf=attbuf+Prmter1.GCUTPBC+Prmter1.GCUBC+Prmter1.FQGCUBC;
	if(buf>=0x80)//衰减<0.
	{
		buf=0;
	}
	if(buf>=63)//衰减不可以超过31.5DB.
	{
		buf=63;
	}
			if(tempnumb==1)
			{
				Prmter1.ACTATT1=buf;
				ATT(buf,0x20);
			}
			else
			{
				Prmter1.ACTATT2=buf;
				ATT(buf,0x02);
			}
			
return;
}
/**********************************************************
** 功能说明:  输出功率1、2和四个栅压控制初始化控制函数
** 输入参数:  CHANNEL   类型:uchar  :AD5318转换管道号	
			  tempnumb   类型:uchar  :温度补偿第几个参数 
			  buf_H		类型:uchar  :数值的高字节
			  buf_L 	类型:uchar  :数值的低字节
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void init_vgsandpcu(uchar channel ,uchar tempnumb,uchar buf_H,uchar buf_L)
{
	uint bcbuf;
	uchar numb;
	Prmter1.VTPBC=TEMP(tempnumb);
	vbuf.buf2[0]=buf_L;
	vbuf.buf2[1]=buf_H;
	if(Prmter1.VTPBC<0x80)
	{	
		bcbuf=Prmter1.VTPBC;
		bcbuf=bcbuf&0x00ff;
		vbuf.buf1=vbuf.buf1+bcbuf;
	}
	//else if ((Prmter1.VTPBC>=0x80)&&(vbuf.buf1>=((-Prmter1.VTPBC)+(-Prmter1.VTPBC))))
	else if (Prmter1.VTPBC>=0x80)
	{		
		bcbuf=256-Prmter1.VTPBC;
		bcbuf=bcbuf&0x00ff;
		vbuf.buf1=vbuf.buf1-bcbuf;		
	}
	if(vbuf.buf1>0x03fc)
	{
		vbuf.buf1=0x0000;
	}
		if (vbuf.buf1>=0x03dd)//电压超过4。8V
	{
		vbuf.buf1=0x03dd;
	}
//	else
//	{
//		vbuf.buf1=0x0000;
//	}
	numb=tempnumb-3;
	Prmter1.ACTVPL[numb]=vbuf.buf2[0];
	Prmter1.ACTVPH[numb]=vbuf.buf2[1];
	DAC(channel,vbuf.buf2[1],vbuf.buf2[0]);	
return;
}
/**********************************************************
** 功能说明:  模块检测函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void sign_collect()
{
	dog();
	CHECK_TEMP();
	CHECK_VTE28v();
	CHECK_PWR1();//选频电路I输出功率检测
	CHECK_PWR2();//选频电路II输出功率检测
	CHECK_id1();//功放管I第一级电流检测
	CHECK_id2();//功放管II第一级电流检测
	CHECK_id3();//功放管I第二级电流检测
	CHECK_id4();//功放管II第二级电流检测
	CHECK_PLL1();//锁相环1检测
	CHECK_PLL3();//锁相环3检测
}
/**********************************************************
** 功能说明:  模块控制函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void init_sign_ctl()
{
	
	//DAC(0x0,0x02,0x64);
//	TRISC0 = 0x00;//LO3LE
//	set_pll(FR3,0,0x01,0x01);//最后一个数1代表选用PORTC端口
//	TRISC0 = 0x01;
//		
//	TRISB5 = 0x00;//LO1LE
//	set_pll(FR1,0,0x20,0x02);//最后一个数2代表选用PORTB端口
//	TRISB5 = 0x01;		
//	ATT(Prmter1.ATT2, 0x02);
//		
//	ATT(Prmter1.ATT1, 0x20);
//
//
//	if(Prmter1.BUTTON2==0)
//	{
//	DAC(0x03,0);//第一个管子第一级栅压
//	DAC(0x02,0);//第一个管子第二级栅压
//	}
//	else
//	{
//	DAC(0x02,Prmter1.VGS4_L);
//	DAC(0x03,Prmter1.VGS3_L);
//	
//	}
//
//	if(Prmter1.BUTTON1==0)
//	{
//	DAC(0x05,0);//第二个管子第一级栅压
//	DAC(0x04,0);//第二个管子第二级栅压
//	}
//	else
//	{
//	DAC(0x05,Prmter1.VGS1_L);	
//	DAC(0x04,Prmter1.VGS2_L);	
//
//	}
//	DAC(0x06,Prmter1.PC1U);//选频电路1最大输出功率
//	
//	DAC(0x01,Prmter1.PC2U);//选频电路2最大输出功率
	// init_att1();//
	// init_att2();//
//delay_unit(1000);
	
	TRISB5 = 0x00;//LO1LE
 	//init_freq1();//
 	//init_freq(9,0x20,0x02,FR1);
 	set_pll(FR1,0,0x20,0x02);//最后一个数2代表选用PORTB端口
 	TRISB5 = 0x01;//LO1LE
 	
 	TRISC0 = 0x00;//LO3LE
 	//init_freq3();//
  //  init_freq(10,0x01,0x01,FR3);
  set_pll(FR3,0,0x01,0x01);//最后一个数1代表选用PORTC端口
 	TRISC0 = 0x01;//LO3LE
 	//init_pcu1();//
	// init_pcu2();//
	init_vgsandpcu(6 ,7,Prmter1.PC1U_H,Prmter1.PC1U_L);
	init_vgsandpcu(1 ,8,Prmter1.PC2U_H,Prmter1.PC2U_L);
//	DAC(0x06,Prmter1.PC1U_H,Prmter1.PC1U_L);//选频电路1最大输出功率
	
//	DAC(0x01,Prmter1.PC2U_H,Prmter1.PC2U_L);//选频电路2最大输出功率
	
	if(Prmter1.BUTTON2==0)
	{
	DAC(0x03,0,0);//第一个管子第一级栅压
	DAC(0x02,0,0);//第一个管子第二级栅压
	}
	else
	{
	// init_vgs3();//
	// init_vgs4();//
	
	init_vgsandpcu(3 ,5,Prmter1.VGS3_H,Prmter1.VGS3_L);
	init_vgsandpcu(2 ,6,Prmter1.VGS4_H,Prmter1.VGS4_L);
	}

	if(Prmter1.BUTTON1==0)
	{
	DAC(0x05,0,0);//第二个管子第一级栅压
	DAC(0x04,0,0);//第二个管子第二级栅压
	}
	else
	{
	// init_vgs1();//
	// init_vgs2();//	
	init_vgsandpcu(5 ,3,Prmter1.VGS1_H,Prmter1.VGS1_L);
	init_vgsandpcu(4 ,4,Prmter1.VGS2_H,Prmter1.VGS2_L);
	}
	init_att(1 ,1,1,FR1,Prmter1.ATT1);
//	init_att(1 ,1,1,FR1,Prmter1.ATT1);
//dog();
	init_att(2 ,2,2,FR3,Prmter1.ATT2);
	
	
}
/**********************************************************
** 功能说明:  adc数据的采集输出
** 输入参数: buf      类型:uchar   :管道号
** 输出参数: adcbuf   类型:uchar   :数字量
** 返 回 值:  无
** 引用函数: 
***********************************************************/
uchar adc_read(uchar buf)
{
	uchar adcbuf;
	ADCON1 = 0x00;
	buf = buf & 0x07;
	buf = buf << 3;
	ADCON0 = buf | 0x41;
//	delay_Tad(5);//16f877采用
	delay_Tad(2);
	ADGO = 0x01;
	while(ADGO)
	{
		;
	}
	#if defined(_16F77)
		adcbuf = ADRES;
	#endif
	#if defined(_16F877A)
		adcbuf = ADRESH;
	#endif
	ADON = 0x00;
	ADIF = 0x00;
	return adcbuf;
} 
/**********************************************************
** 功能说明:  增益实际值补偿函数
** 输入参数:  attin     类型:uchar   :标称值
	      attnb    类型:uchar   :=1,代表第1个增益,=2,代表第2个增益等
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
uchar ATTBU(uchar attin,uchar attnb)
{
	uchar i;
	uchar buf;
	//buf=attin;//如果比较没有结果,则返回标称值原值
	buf=0;//如果比较没有结果,则返回标称值原值
	for (i=0;i<bcnumb;i++)
	{
		dog();	
		B[0]=rrom(bczcszd+zyn*i+attnb-1);//参数值首地址+偏置
		 if (attin==i)
		{
 		//buf=B[0]+buf4;
 		buf=B[0];	
 		break;		     
	        }    	       
	}	
	  B[0]=0; 
	return buf;
}
/**********************************************************
** 功能说明:  频响实际值补偿函数(其实是增益补偿)DB/2
关于频率值计算,设信道号为X,频点宽为100K,二分频,则频率值=信道0时频率值+信道×0.025
** 输入参数:  freqin   类型:uchar   :信道值
	          freqnb    类型:uchar   :代表第几个本振器件。
          
** 输出参数:  
** 返 回 值:  频响补偿实际值  buf,如果返回值为0,则为没有补偿值
** 引用函数: 
*********************************************************/
uchar FREQBU(uint freqin,uchar freqnb)
{
	uchar i;
	uchar buf;
	uchar buff;
	uchar buf1;
	uchar buf2;
	union buf_union Pbuf1;
	union buf_union Pbuf2;
//	uchar P[2];//EEPROM中信道值1byte
	buf=0;//如果比较没有结果,则返回0
	
	for (i=0;i<fnumb;i++)//频率
	{
		dog();	
		// P[0]=rrom(freqd+i);
		Pbuf1.buf2[0]=rrom(freqd+i);
		Pbuf1.buf2[1]=rrom(freqd+i+1);
		i++;
		 if (i<(fnumb-1))
		 {
		 	//P[1]=rrom(freqd+i+1);
		 	Pbuf2.buf2[0]=rrom(freqd+i+1);
		 	Pbuf2.buf2[1]=rrom(freqd+i+2);
		 }
		 else
		 {
		 	Pbuf2.buf1=Pbuf1.buf1;
	   	 }
		
	    if (freqin==Pbuf1.buf1)
		{
			B[0]=rrom(freqcszd+pn*i+freqnb-1);
 			buf=B[0];
 			break;
 		}
	    else if((freqin>Pbuf1.buf1)&&(freqin<Pbuf2.buf1))
	    {   
	     	B[0]=rrom(freqcszd+pn*i+freqnb-1);
		 	B[1]=rrom(freqcszd+pn*(i+1)+freqnb-1);
		 	buff=B[1]-B[0];
		 	buf2=Pbuf2.buf1-Pbuf1.buf1;
			buf1=freqin-Pbuf1.buf1;
		 	if(buff<0x80)
		 	{
				buf1=(B[1]-B[0])*buf1;	
		 	}		 	
		 	else if(buff>=0x80)
		 	{
				buf1=(B[0]-B[1])*buf1;				
		 	}
		 	buf1=buf1/buf2;
		 	//B[2]=B[0]+(((B[1]-B[0])*(freqin-P[0]))/(P[1]-P[0]));
			B[2]=B[0]+buf1;			
	     	buf=B[2];

⌨️ 快捷键说明

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