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

📄 cdma800.c.bak

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

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

}


void init()
{
	init_mcu();	
	init_menu();
	init_serial();
	init_eeprom();
	//CHECK_TEMP();
	//init_sign_ctl();

}
void init_mcu()
/********************************************************************
 初始化项目:
	1、WDT
 	2、ADC
 	3、SSP(只初始化端口方向,其他的在具体使用的时候初始化)
 	4、TMR1
 	5、USART
 	6、中断资源
 	7、端口方向
********************************************************************/
{
		//char x;
      // x=-2;
		delay_unit(250);
		TRISA  = 0x2f; //initialize the direction of the ports
		TRISB  = 0xd0; 
		TRISC  = 0x83;
		TRISD  = 0x20;
		TRISE  = 0x07;
		porta_wbuf = 0x00;
		portb_wbuf = 0x00;
		portc_wbuf = 0x04;
		portd_wbuf = 0x00;//modify
		porte_wbuf = 0x00;
		
//		TMR1L  = 0x00; //initialize TMR1,65.6ms
//		TMR1H  = 0x00;
//		T1CON  = 0x00;//未用
		
		SPBRG  = 0x0c; //initialize USART baud = 9600 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;
}
/**********************************************************
** 功能说明:  初始化模块内部参数函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐        创建时间:2005-06-06
***********************************************************/
void init_menu()
{
	dog_soft = 0;
	dog();
	Prmter1.ATT = rrom(attadd); 
	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.PC = rrom(pcadd);
	Prmter1.PCU_L = rrom(pcuadd);
	Prmter1.PCU_H = rrom(pcuadd+1);	
	Prmter1.BUTTON1= rrom(but1add); 
	Prmter1.POFFSET1=rrom(poff1add);
	Prmter1.POFFSET2=rrom(poff2add);
	Prmter1.POFFSET3=rrom(poff3add);
//	Prmter1.ID_L = MOD_ID_L;
//	Prmter1.ID_H = MOD_ID_H;
//	Prmter1.PROTL_ETN = 0x08;
	chushi=0;
		Prmter1.ADDR = rrom(mod_add_add);
	tempcheck=0;
	tran_flag=0x00;//转义标志,=0为没有转义,=1为转义过了
	headend_flag=0x00;
}
/**********************************************************
** 功能说明:  初始化串口数组函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void init_serial()
{
	auto uchar 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;		
}
/**********************************************************
** 功能说明:  初始化看门狗函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void dog()
{
	asm("CLRWDT");
	OPTION = 0x8f;	
}
/**********************************************************
** 功能说明:  延时函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void delay_unit(uint buf)
{
	auto uint i;
	for(i = 0;i < buf ;i++)
	{
		asm("nop");
	}
}
/**********************************************************
** 功能说明:  延时函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇        创建时间:2004-11-16
***********************************************************/
void delay_Tad(uchar j)  
{
	auto uchar i;
	for(i=0;i<j;i++)
	{
		asm("nop");
		asm("nop");
		asm("nop");
	}	
}	
/**********************************************************
** 功能说明:  初始化eeprom函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐        创建时间:2005-7-16
***********************************************************/
void init_eeprom(void)
{
    uchar j;
	uint i;
	TRISC0 = 0;
	TRISC1 = 0;
	err_eeprom=0;
	j = rrom(0x07ff); 
	if(j!=0xaa)
	{
		for(i=0;i<0x07ff;i++)
		{
			wrom(i,0x00);
			dog();	
		}
		wrom(0x07ff,0xaa);		
	}

}	
/**********************************************************
** 功能说明:  模块检测函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2004/12/13
*********************************************************/
void sign_collect()
{
	dog();
	CHECK_TEMP();//温度检测
	CHECK_POF();//输出功率检测
	
	CHECK_POR();//反向输出功率检测
	CHECK_CTR();//过功率检测\控制深度检测
	CHECK_v28v();//28V检测
	CHECK_ID1();//推动级电流检测id4
	CHECK_ID2();//末级I电流检测id5
	CHECK_ID3();//末级II电流检测id6
	
}
/**********************************************************
** 功能说明:  模块控制参数初始化函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2005/10/25
*********************************************************/
void init_sign_ctl()
{
	if(Prmter1.BUTTON1==0)
	{
	DAC(2,0,0);//推动极第二个管子第二级栅压
	DAC(1,0,0);//末级第一个管子栅压
	DAC(0,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);
	}
	init_vgsandpcu(3 ,5,Prmter1.PCU_H,Prmter1.PCU_L);//功放输出功率
	init_att(1 ,1,Prmter1.ATT);
}
/**********************************************************
** 功能说明:  输出功率1、2和四个栅压控制初始化控制函数
** 输入参数:  CHANNEL   类型:uchar  :AD5318转换管道号
			  tempnumb   类型:uchar  :温度补偿第几个参数
			  buf_H		类型:uchar  :数值的高字节
			  buf_L 	类型:uchar  :数值的低字节
** 输出参数:
** 返 回 值:  无
** 引用函数:
** 创 建 人: 陈璐          创建时间:2005/09/04
*********************************************************/
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-2;
	Prmter1.ACTVPL[numb]=vbuf.buf2[0];
	Prmter1.ACTVPH[numb]=vbuf.buf2[1];
	DAC(channel,vbuf.buf2[1],vbuf.buf2[0]);	
return;
}



/**********************************************************
** 功能说明:  增益1、2控制初始化控制函数
** 输入参数:  tempnumb   类型:uchar  :温度补偿第几个参数
			  attnumb   类型:uchar  :标称值补偿第几个参数
			  attbuf	类型:uchar  :衰减数值
** 输出参数:
** 返 回 值:  无
** 引用函数:
** 创 建 人: 陈璐          创建时间:2005/09/01
*********************************************************/
void init_att(uchar tempnumb ,uchar attnumb,uchar attbuf)//
{
		Prmter1.GCUTPBC=TEMP(tempnumb);
		Prmter1.GCUBC=ATTBU(attbuf,attnumb);
		//Prmter1.FQGCUBC=FREQBU(fr/2,fqnumb);
		dog();

	attbuf=attbuf+Prmter1.GCUTPBC+Prmter1.GCUBC;
	if(attbuf>=0x80)//衰减<0.
	{
		attbuf=0;
	}
	if(attbuf>=63)//衰减不可以超过31.5DB.
	{
		attbuf=63;
	}
	Prmter1.ACTATT=attbuf;
	ATT(attbuf);

return;
}
/**********************************************************
** 功能说明:  增益实际值补偿函数
** 输入参数:  attin     类型:uchar   :标称值
	      attnb    类型:uchar   :=1,代表第1个增益,=2,代表第2个增益等
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2005/06/09
*********************************************************/
char ATTBU(char attin,uchar attnb)
{
	uchar i;
	char buf;
	buf=0;//如果比较没有结果,则返回0
	for (i=0;i<bcnumb;i++)
	{
		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,则为没有补偿值
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2005/06/07
*********************************************************/
uchar FREQBU(uchar freqin,uchar freqnb)
{
	uchar i;
	uchar buf;
	uchar P[2];//EEPROM中信道值1byte
	buf=0;//如果比较没有结果,则返回0
	
	for (i=0;i<fnumb;i++)//频率
	{
		 P[0]=rrom(freqd+i);

		 if (i<(fnumb-1))
		 {
		 	P[1]=rrom(freqd+i+1);
		 }
		 else
		 {
		 	P[1]=P[0];
	   	 }
		
	    if (freqin==P[0])
		{
			B[0]=rrom(freqcszd+pn*i+freqnb-1);
 			buf=B[0];
 			break;
 		}
	    else if((freqin>P[0])&&(freqin<P[1]))
	    {   
	     	B[0]=rrom(freqcszd+pn*i+freqnb-1);
		 	B[1]=rrom(freqcszd+pn*(i+1)+freqnb-1);
            if (B[1]>B[0])
            {
	     	B[2]=B[0]+(((B[1]-B[0])*(freqin-P[0]))/(P[1]-P[0]));	
			}
			else
			{
	     	B[2]=B[0]-(((B[0]-B[1])*(freqin-P[0]))/(P[1]-P[0]));	
			}
	     	buf=B[2];
	     	break;	 
	     }      
	}	
	return buf;
}
/**********************************************************
** 功能说明:  温度补偿函数(温补参数占1个字节,补偿电压为mV单位,增益为DB/2单位等)
** 输入参数: // buf3     类型:uchar   :buf3=1,表示温补参数占1个字节;buf3=2,表示温补参数占2个字节
	     tempnb    类型:uchar   :在温补表中是第几个参数,=1,是第1个参数;=2,第2个参数
	    // buf7     类型:uchar   :在tn中参数是第几个字节开始的参数
	 //     buff:    类型:uchar   :=0:温度补偿函数是△值,=1:温度补偿函数是实际值
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 陈璐          创建时间:2005/06/09
*********************************************************/
uchar TEMP(uchar tempnb)
{
	uchar i;
	uchar buf;
	char T[2];//EEPROM?D???è?μ
	uchar buff;
	uchar buf1;
	uchar buf2;
	uchar buf3;
	buf=0;//è?1?±è????óD?á1?£??ò·μ??0
	buf3=0;

	for (i=0;i<tpnumb;i++)
	{
		dog();	
		T[0]=rrom(tempd+i);

		if(i<tpnumb-1)
		{
		T[1]=rrom(tempd+i+1);
		}
		else
		{
		T[1]=T[0];
		}
	    if (Prmter1.TEMP==T[0])
		{
			B[0]=rrom(tempcszd+tn*i+tempnb-1);
			 buf=B[0];
 		  	break;				     
	    }
if ((Prmter1.TEMP>T[0])&&(Prmter1.TEMP<T[1]))
{
	buf3=1;
}
if ((Prmter1.TEMP>T[0])&&(Prmter1.TEMP>T[1])&&(T[1]<0x80)&&(T[0]>0x80))
{
		buf3=1;
}
		if(buf3==1)
	    {
	         B[0]=rrom(tempcszd+tn*i+tempnb-1);
			 B[1]=rrom(tempcszd+tn*(i+1)+tempnb-1);
			 buff=B[1]-B[0];
			 if (buff<0x80)
			 {
			 	buf1=(Prmter1.TEMP-T[0]);
			 	buf2=T[1]-T[0];
			 	buf1=(B[1]-B[0])*buf1;
			 	buf1=buf1/buf2;
			 	buf1=buf1;
			 	B[2]=B[0]+buf1;
			}
			else
			 {
			 	buf1=(Prmter1.TEMP-T[0]);
			 	buf2=T[1]-T[0];
			 	buf1=(B[0]-B[1])*buf1;
			 	buf1=buf1/buf2;
			 	buf1=buf1;
			 	B[2]=B[0]-buf1;
			}
			 
	      	buf=B[2];     	
	        break;
	    }
	  		        	
	}

	       
return buf;
}
/**********************************************************
** 功能说明:  模拟SPI方式设置衰减函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
** 创 建 人: 汤勇          创建时间:2004/12/13
*********************************************************/
void ATT(uchar buf1)
{
	uchar i;
	RCIE=0;
	CREN=0;
	T1CON=0x00;
//	if(buf1>0x80)
//	{
//		buf1=0x00;
//	}
//	if(buf1>0x3f)
//	{
//		buf1=0x3f;
//	}

	buf1 = buf1 << 2;
	portb_wbuf = portb_wbuf & 0xf3;//clock & LE置低电平
	PORTB = portb_wbuf;
	for(i=6;i>=1;i--)
	{
		if(buf1&0x80)//衰减值的设置
		{
			portb_wbuf = portb_wbuf | 0x02;//RB1
			PORTB = portb_wbuf;
		}
		else
		{
			portb_wbuf = portb_wbuf & 0xfd;
			PORTB = portb_wbuf;
		}
		portb_wbuf = portb_wbuf | 0x04;//clock置高电平
		PORTB = portb_wbuf;	
		_nop();
		_nop();
		portb_wbuf = portb_wbuf & 0xfb;//clock置低电平
		PORTB = portb_wbuf;	
		_nop();
		_nop();
		buf1 = buf1<< 1;
	}
	_nop();
	portb_wbuf = portb_wbuf | 0x08;//LE置高电平
	PORTB = portb_wbuf;
	_nop();
	portb_wbuf = portb_wbuf & 0xf7;//LE置低电平
	PORTB = portb_wbuf;
	T1CON=0x31;
	CREN=1;
	RCIE=1;
}
/**********************************************************
** 功能说明:  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)

⌨️ 快捷键说明

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