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

📄 lna3.c.bak

📁 GSM低噪声放大器模块监控处理程序
💻 BAK
📖 第 1 页 / 共 4 页
字号:
/*
      * Copyright (c) 2004,深圳市国人通信有限公司综合网管部
      * All rights reserved.
      * 
      * 文件名称:lna.c
      * 文件标识:见配置管理计划书
      * 摘    要:低噪放模块的监控数据处理
      * 
      * 当前版本:1.2
      * 作    者:陈璐
      * 完成日期:
      *
      * 取代版本:
      * 原作者  :
      * 完成日期:
*/

#include "lna3.h"

void main()
{
	
	delay_unit(10000);//上电后延迟一段时间,防止刚上电电压过大,乱操作。
	
	init();	
	
	for( ; ; )
	{
		sign_collect();
		
		serial_data();
		
		if (chushi>=0x0d6b)//定时器1产生3435次中断,每次终端时间为65.5*8=524ms,3435次中断约为半个小时
		{
		init_sign_ctl();
		chushi=0;
		}
		
	}
	
}

void init()
{
	init_mcu();	//初始化端口方向、ADC、TMR1、波特率、USART、中断、SSP、WDT
	init_menu();//初始化各控制参数
	init_serial();//初始化各串口部分
	init_eeprom();//初始化EEPROM
//	CHECK_temp();//获取温度值,为初始化控制做补偿准备
//	init_sign_ctl();//初始化各控制项
}
void init_mcu()
/********************************************************************
 初始化项目:
	1、WDT
 	2、ADC
 	3、SSP(只初始化端口方向,其他的在具体使用的时候初始化)
 	4、TMR1
 	5、USART
 	6、中断资源
 	7、端口方向
********************************************************************/
{
	
		TRISA  = 0x2f; //initialize the direction of the ports
		TRISB  = 0xc0;
		TRISC  = 0x80;
		TRISD  = 0x00;
		TRISE  = 0x00;//没用上PORTE
		porta_wbuf = 0x00;
		portb_wbuf = 0x1f;
		portc_wbuf = 0x04;
		portd_wbuf =0x1f;
		porte_wbuf = 0x00;//没用上PORTE

//		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;//高速波特率使能,TRMT=1(发送移位寄存器TSR"空"标志位)
		RCSTA  = 0x90;//SPEN=1(串行口使能),CREN=1(使能连续接收)
		OPTION = 0x8f;//PORTB弱上拉禁止,PSA(预分频器分配位)用于WDT,PS2:PS0=1:128
		INTCON = 0xc0;//GIE=1(全局中断使能),PEIE=1(外围接口中断使能)
		PIE1   = 0x21;//RCIE=1(串行通信接口USART接收中断使能),TMR1IE=1(TMR1溢出中断使能)
		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()
{
    auto int i;
    dog_soft = 0;
    dog();
    for(i = 0;i < 2 ; i++)
    {
     pwr_buf[i] = 0;
     v7_buf[i] = 0;
    }
    
    pwr_cnt=0;
    v7_cnt=0;
	temp_cnt=0;
	id_cnt=0;
	tempbuf=0x0000;
	chushi=0;//定时器中断计数器
	Prmter1.ADDR = rrom(mod_add_add+2);//mod_add_add为模块地址参数的地址
    Prmter1.max = rrom(maxpwradd);
    Prmter1.GCU1 = rrom(gcu1add);
    Prmter1.GCU2 = rrom(gcu2add);
    Prmter1.maxu = rrom(maxpuadd);
    Prmter1.POFFSET1=rrom(poff1add);
    Prmter1.POFFSET2=rrom(poff2add);
    Prmter1.CTRBB=rrom(ctrbbadd);
 //   Prmter1.PROTL_ETN = 0x02;//协议版本
 	tran_flag=0x00;//转义标志,=0为没有转义,=1为转义过了
    tempcheck=0;
    headend_flag=0x00;
}
/**********************************************************
** 功能说明:  模块控制参数初始化函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2004/04/21
*********************************************************/
void init_sign_ctl()
{
	DAC(1,Prmter1.maxu);

    gcu_jz();//前10后10前5后5,增益标称值补+温补。(两个增益)
   
}
/**********************************************************
** 功能说明:  串口初始化函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 王猛         创建时间:不详
*********************************************************/
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 & 0x7f;
	PORTD = portd_wbuf;
}
/**********************************************************
** 功能说明:  初始化eeprom函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐        创建时间:2004-11-16
***********************************************************/
void init_eeprom(void)
{
	uint i;
	uchar j;
	TRISC0 = 0;
	TRISC1 = 0;
	err_eeprom=0;
	dog();
	j = rrom(0x07ff); 
	if(j!=0xa2)
	{
		for(i=0;i<0x07ff;i++)
		{
			wrom(i,0x00);
			dog();	
		}
		wrom(0x07ff,0xa2);
		
		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_Tad(uchar j)  
{
	auto uchar i;
	for(i=0;i<j;i++)
	{
		asm("nop");
		asm("nop");
		asm("nop");
	}	
}
/**********************************************************
** 功能说明:  延时函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void delay_unit(uint buf)
{
	auto uint i;
	for(i = 0;i < buf ;i++)
	{
		asm("nop");
	}
}
/**********************************************************
** 功能说明:  模块检测函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2004/04/21
*********************************************************/
void sign_collect()
{
	dog();
	CHECK_PWR();//输出功率检测和过功率告警检测
	CHECK_ctr();//功率控制深度检测参数
	CHECK_v7();//+7V电压检测参数
	CHECK_temp();//温度检测参数
	CHECK_id();
}
/**********************************************************
** 功能说明:  数控衰减函数
** 输入参数:  ctbuf     类型:uchar   :=0X00时,为选择PORTD; =0X01时,为选择PORTB
	      gcubuf    类型:uchar   :数控衰减值
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2005/04/20
*********************************************************/
void gcu_ctl(uchar ctbuf,char gcubuf)
{
	uchar buf;
	uchar B[5];
	uchar buff;
	if(gcubuf>=0x80)
	{
		gcubuf=0;
	}
	if(gcubuf>31)
	{
		gcubuf=31;
	}
        buf= ~(gcubuf);
	buf = buf & 0x1f;//取低5位,屏蔽前三位
	B[0]=buf&0x01;
    	B[0]=B[0]<<4;
        B[1]= buf & 0x02;
        B[1]= B[1]<<2;
        B[2]= buf & 0x04;	
        B[3]= buf & 0x08;
	B[3]= B[3]>>2;
        B[4]= buf&0x10;
	B[4]= B[4]>>4;
	buff=B[0]|B[1]|B[2]|B[3]|B[4];
	buff=buff&0x1f;
	if (ctbuf==0x00)
	{
	 portd_wbuf = portd_wbuf | buff;
	 buff=buff|0xe0;
	 portd_wbuf = portd_wbuf & buff;
	 PORTD = portd_wbuf;
	}
	else if (ctbuf==0x01)
	{
	 portb_wbuf = portb_wbuf | buff;
	 buff=buff|0xe0;
	 portb_wbuf = portb_wbuf & buff;
	 PORTB = portb_wbuf;
	}
}

/**********************************************************
** 功能说明:  adc数据的采集输出
** 输入参数:  无
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐         创建时间:不详
***********************************************************/
uchar adc_read(uchar buf)
{
	uchar adcbuf;
	ADCON1 = 0x00;
	buf = buf & 0x07;
	buf = buf << 3;
	ADCON0 = buf | 0x41;
	delay_Tad(5);
	ADGO = 0x01;
	while(ADGO)
	{
		;
	}
	#if defined(_16F77)
		adcbuf = ADRES;
	#endif
	#if defined(_16F877A)
		adcbuf = ADRESH;
	#endif
	ADON = 0x00;
	ADIF = 0x00;
	return adcbuf;
} 
/**********************************************************
** 功能说明:  控制数据数模转换函数(ad5302)
** 输入参数:  uchar	addr	信道号选择(0为A信道,1为B信道)
	      	 uchar	buf	    要转换的数值
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐         创建时间:2004/11/26
***********************************************************/
void DAC(uchar addr1,uchar buf)
{
	union buf_union dabuf;
	int k;
	uchar buf2;
	TRISC2 = 0;
	SSPSTAT = 0x40;             
	SSPCON  = 0x21;//采用Fosc/16
	if(buf>250)
	{
		buf=250;
	}
	buf2 = addr1<<3;
	dabuf.buf2[1] = buf2;
	dabuf.buf2[0] = buf;
     dabuf.buf1=dabuf.buf1<<4;
     	portc_wbuf = portc_wbuf | 0x04;//CS=1
	PORTC = portc_wbuf;
	portc_wbuf = portc_wbuf & 0xfb;//CS=0
	PORTC = portc_wbuf;
	SSPIF = 0;
	for(k = 1;k >= 0; k--)
	{
		SSPBUF = dabuf.buf2[k];
		while(SSPIF == 0)
		{
			;
		}
		SSPIF = 0;
	}
	portc_wbuf = portc_wbuf | 0x04;//CS=1
	PORTC = portc_wbuf;

}
/**********************************************************
** 功能说明:  低噪放过功率告警(D)
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐         创建时间:2004/11/26.
***********************************************************/
//void CHECK_ALM()
//{       
//	lan_buf=adc_read(0);
//	if(lan_buf2>(Prmter1.max*256/5))
//	if(lan_buf>(Prmter1.max))
//	  {
//	  	Prmter1.alm = 0x01;
//	  }
//	  else
//	  {
//	  	Prmter1.alm = 0x00;
//	  }
//	 lan_buf = 0;
 //  	wrom(lanalmadd,Prmter1.alm);        
//}
/**********************************************************
** 功能说明:  上行输出功率检测
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐         创建时间:2004/04/21
***********************************************************/
void CHECK_PWR()
{
	uchar PWR_adc;
	PWR_adc=adc_read(0);
	pwr_buf[1]=PWR_adc;
        pwr_cnt++;
    if(pwr_buf[0]<pwr_buf[1])
   	{
   		pwr_buf[0]=pwr_buf[1];
   	}
    if(pwr_cnt>=PWR_CNT)
    {
        Prmter1.PWRU = pwr_buf[0]; 
		pwr_cnt = 0x00;	
		pwr_buf[0] = 0x00; 
		Prmter1.PWR=Prmter1.PWRU/5-50+Prmter1.POFFSET1 ;
    }     

}

/**********************************************************
** 功能说明:  上行功率控制深度检测和过功率告警检测
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐\      创建时间:2004/11/26
***********************************************************/

void CHECK_ctr()
{
   uchar i;
   uchar D;
   uchar buf1;
   uchar buf2;
   uchar buf3;
   uchar buf4;
 //  uchar buf;
   D = adc_read(3);
    //Prmter1.ctr = D;
    Prmter1.CTRU = D;
   //  wrom(ctruadd,Prmter1.CTRU);
   //Prmter1.ctr = data[D];	//查表		
   //Prmter1.ctr = data[82];	//查表	
  // wrom(pwrctradd,Prmter1.ctr);
      if(D<45)
      {
      	Prmter1.ctr = 0;
      }
      else if((D>=45)&&(D<51))
      {
      	Prmter1.ctr = 1;
      }
      else if((D>=51)&&(D<101))
		{
			for(i=0;i<9;i++)
			{
				buf1=51+5*i;
				buf2=buf1+3;
				buf3=54+5*i;
				buf4=buf3+2;
      			if((D>=buf1)&&(D<buf2))
      			{
      				Prmter1.ctr =2+i<<1+Prmter1.CTRBB;
      				
      			}
      			if((D>=buf3)&&(D<buf4))
      			{
      				Prmter1.ctr =3+i<<1+Prmter1.CTRBB;
      				
      			}
     		 }
		}
          //************************告警判断
       if((D >= 101)&&(Prmter1.ctr>20))//过功率告警检测
	  {
	  	Prmter1.alm = 0x01;//告警
	  	Prmter1.ctr=20;
	  	
	  }
	  else
	  {
	  	Prmter1.alm = 0x00;//不告警
	  }
}
/**********************************************************
** 功能说明:  +7V电压检测
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐         创建时间:2004/11/26
***********************************************************/
void CHECK_v7()
{
	union buf_union V7BUF;
    uchar V7_adc;
    V7_adc=adc_read(1);
    v7_buf[1]=V7_adc;
    v7_cnt++;
    if(v7_buf[0]<v7_buf[1])
    {
     v7_buf[0]=v7_buf[1];
    }
    if(v7_cnt>=V7_CNT)
    {
     Prmter1.v7U = v7_buf[0]; 
     v7_cnt = 0x00;	
     v7_buf[0] = 0x00;
    // wrom(v7uadd,Prmter1.v7U);
     V7BUF.buf1=Prmter1.v7U<<1;
     Prmter1.v7L =V7BUF.buf2[0];
     Prmter1.v7H = V7BUF.buf2[1];
     //wrom(v7add,Prmter1.v7L);
    }
}
 
/**********************************************************
** 功能说明: 温度检测
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐         创建时间:2004/04/20
***********************************************************/

⌨️ 快捷键说明

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