www.pudn.com > main_zkf.rar > main_zkf.c


#include "pic18.h" 
#include "math.h" 
/****************************************************************** 
端口定义 
******************************************************************/ 
/*control<2>=p3=A2_5=RD0 
control<1>=p4=A1_5=RD1 
control<0>=p7=A0_5=RD2 
control="000"时,控制上行衰减  
control="001"时,控制下行衰减 
control="010"时,控制BIAS,BIAS={data_in,2'b00} 
control="011"时,不检测 
data_in输入范围为0~31 
data_in<4>=p20=D4_5=RD7 
data_in<3>=p19=D3_5=RD6 
data_in<2>=p13=D2_5=RD5 
data_in<1>=p11=D1_5=RD4 
data_in<0>=p10=D0_5=RD3*/ 
//DA端口定义 
//A:末级功放偏压A2 
//B:末级功放偏压A1 
//C:末级功放偏压B2 
//D:末级功放偏压B1 
unsigned char display_buffer[]={0x00,0x00,0x00,0x00,0xff}; 
unsigned char number_table[]={'0','1','2','3','4','5','6','7','8','9'}; 
#define dacdata RE2 
#define dacclk  RE3  
#define dacload RE4 
#define dacldac RE5 
 
 
 
#define control_att_up 0x00 
#define control_att_dn  0x01  
#define control_bias 0x02         //010 
#define control_backward_bias 0x03 //011 
#define slot_number_inform 0x06  //110 
 
#define control_no_detect 0x04 //100 
#define control_only_up 0x05 //101 
 
 
 
 
 
#define delay_value 5000 
 
unsigned char B2=0;//末级功放偏压B2阈值 
unsigned char B1=0;//末级功放偏压B1阈值 
unsigned char A2=0;//末级功放偏压A2阈值 
unsigned char A1=0;//末级功放偏压A1阈值 
/****************************************************************** 
AD模块相关变量定义 
******************************************************************/ 
unsigned char AD_Flag=0;   //AD转换完成标志,AD_Flag=1表示有新的AD数据转换完成 
volatile unsigned int ADResult; 
volatile unsigned int ADResult12[12];//AD转换结果数组 
int ADResult0[3];//末级功放偏压B2 
int ADResult1[3];//末级功放偏压B1 
int ADResult2[3];//末级功放偏压A2 
int ADResult3[3];//末级功放偏压A1 
int ADResult4[3];//下行启动门限 
int ADResult5[3];//反射功率检测 
int ADResult6[3];//上行输出功率检测 
int ADResult7[3];//下行输入功率检测 
int ADResult8[3];//下行输出功率检测 
int ADResult9[3];//末级温度检测 
int ADResult10[3];//环境温度检测 
int ADResult11[3];//电源电压检测 
unsigned char ADCounter;//AD计数器 
/****************************************************************** 
串口通信模块相关变量定义 
******************************************************************/ 
unsigned char recdata;	//接收数据寄存器 
unsigned char SciReceiveFlag=0;	//=1表示接收到新数据,=0表示未接收到新数据  
unsigned char DownStartLevel;//下行启动电平 
unsigned char Ts0;//下行输入功率 
unsigned char Ts1;//下行输入功率 
unsigned char Ts2;//下行输入功率 
unsigned char Ts3;//下行输入功率 
unsigned char Ts4;//上行输入功率 
unsigned char Ts5;//上行输入功率 
unsigned char Ts6;//上行输入功率 
 
unsigned int Ts0_latch,Ts0_out_latch; //下行输入功率和输出功率锁存 
unsigned int Ts1_latch,Ts1_out_latch; //上行输入功率和输出功率锁存 
unsigned int Ts2_latch,Ts2_out_latch; //上行输入功率和输出功率锁存 
unsigned int Ts3_latch,Ts3_out_latch; //上行输入功率和输出功率锁存 
unsigned int Ts4_latch,Ts4_out_latch; //下行输入功率和输出功率锁存 
unsigned int Ts5_latch,Ts5_out_latch; //下行输入功率和输出功率锁存 
unsigned int Ts6_latch,Ts6_out_latch; //下行输入功率和输出功率锁存 
 
 
unsigned int Ts0_out_latch0; //下行输入功率和输出功率锁存 
unsigned int Ts1_out_latch0; //上行输入功率和输出功率锁存 
unsigned int Ts2_out_latch0; //上行输入功率和输出功率锁存 
unsigned int Ts3_out_latch0; //上行输入功率和输出功率锁存 
unsigned int Ts4_out_latch0; //下行输入功率和输出功率锁存 
unsigned int Ts5_out_latch0; //下行输入功率和输出功率锁存 
unsigned int Ts6_out_latch0; //下行输入功率和输出功率锁存 
 
unsigned int Ts0_out_latch1; //下行输入功率和输出功率锁存 
unsigned int Ts1_out_latch1; //上行输入功率和输出功率锁存 
unsigned int Ts2_out_latch1; //上行输入功率和输出功率锁存 
unsigned int Ts3_out_latch1; //上行输入功率和输出功率锁存 
unsigned int Ts4_out_latch1; //下行输入功率和输出功率锁存 
unsigned int Ts5_out_latch1; //下行输入功率和输出功率锁存 
unsigned int Ts6_out_latch1; //下行输入功率和输出功率锁存 
 
unsigned int Ts0_out_latch2; //下行输入功率和输出功率锁存 
unsigned int Ts1_out_latch2; //上行输入功率和输出功率锁存 
unsigned int Ts2_out_latch2; //上行输入功率和输出功率锁存 
unsigned int Ts3_out_latch2; //上行输入功率和输出功率锁存 
unsigned int Ts4_out_latch2; //下行输入功率和输出功率锁存 
unsigned int Ts5_out_latch2; //下行输入功率和输出功率锁存 
unsigned int Ts6_out_latch2; //下行输入功率和输出功率锁存 
 
unsigned int Ts0_out_latch3; //下行输入功率和输出功率锁存 
unsigned int Ts1_out_latch3; //上行输入功率和输出功率锁存 
unsigned int Ts2_out_latch3; //上行输入功率和输出功率锁存 
unsigned int Ts3_out_latch3; //上行输入功率和输出功率锁存 
unsigned int Ts4_out_latch3; //下行输入功率和输出功率锁存 
unsigned int Ts5_out_latch3; //下行输入功率和输出功率锁存 
unsigned int Ts6_out_latch3; //下行输入功率和输出功率锁存 
 
 
  unsigned char Att_total_up; //上行缩减总量=人为衰减+自动衰减 
  unsigned char Att_total_dn; //下行缩减总量=人为衰减+自动衰减 
 
 unsigned char Gain_dn; //下行增益,按照每次的时隙更新 
 unsigned char Gain_up; //上行增益,按照每次的时隙更新 
 
volatile unsigned char SW_latch;//Standing Wave  
volatile unsigned char address_right; 
 
 
    //设置值按照8bit整形存储,在串口通信时外送标准格式 
 
unsigned int Ts1_threhold = 0x004D; //上行功率门限1   --E2PROM位置0x11,大概0.7v 
unsigned int Ts2_threhold = 0x004D; //上行功率门限2   --E2PROM位置0x12 
unsigned int Ts3_threhold = 0x004D; //上行功率门限3   --E2PROM位置0x13 
 
unsigned int Ts4_threhold = 0x0311; //下行功率门限5   --E2PROM位置0x15 
unsigned int Ts5_threhold = 0x0311; //下行功率门限4   --E2PROM位置0x14 
 
 
unsigned int Ts6_threhold = 0x0311; //下行功率门限0   --E2PROM位置0x10 
 
unsigned int Ts0_threhold = 0x0011; //下行功率门限6   --E2PROM位置0x16 
 
 
#define below_threhold 0x0010 //实际应该是1dB 
#define over_threhold 0x0010 //实际应该是1dB  
 
unsigned int Ts4_low_threhold; //下行功率门限4   --E2PROM位置0x14 
unsigned int Ts5_low_threhold; //下行功率门限5   --E2PROM位置0x15 
unsigned int Ts6_low_threhold; //下行功率门限6   --E2PROM位置0x16 
unsigned int Ts0_low_threhold; //下行功率门限0   --E2PROM位置0x10 
 
 
 
unsigned char Att_manual_up = 0; //上行手动缩减量--E2PROM位置0x17 
unsigned char Att_manual_dn = 0; //下行手动缩减量 --E2PROM位置0x18 
 
unsigned char Forward_dn = 0; //us,下行同步开关前沿量--E2PROM位置0x19 
unsigned char Backward_dn = 0; //us,下行同步开关前沿量--E2PROM位置0x19 
 
unsigned char switch_in_shut = 0; 
 
 
unsigned char Open_threhold_dn = 0x2D; //下行同步启动门限量 --E2PROM位置0x20, 大概0.2v 
 
//unsigned char B2= 0x03;//末级功放偏压B2阈值  --E2PROM位置0x21 
//unsigned char B1= 0x03;//末级功放偏压B1阈值  --E2PROM位置0x22 
//unsigned char A2= 0x03;//末级功放偏压A2阈值  --E2PROM位置0x23 
//unsigned char A1= 0x03;//末级功放偏压A1阈值  --E2PROM位置0x24 
 
unsigned char Channel_Choice; //这个是指示当前的时隙位置 
unsigned char Channel_Choice_next; //这个是指示next时隙位置 
 
 
unsigned char uart_rec_data[2]={0,0};//,0,0,0,0,0,0}; 
unsigned char setup_data[2]; //这个是打算设置的数据 
 
unsigned char uart_send_data[9];   //这个数据需要和uart_send_tag_data配合组成串口发送数据 
//unsigned char uart_send_tag_data[2]; 
unsigned char recdata; 
unsigned char package_data_count =0; 
unsigned char data_width,end_data_width; 
unsigned char data_addr; //地址信息 
unsigned char r_w =0xff; ////对本系统读标志 
 
unsigned char INT0_Flag=0; //IO中断标志 
unsigned char INT0_att=0; 
unsigned char RC_flag=0; //UART中断标志 
unsigned char Att_value[7]={31,31,31,31,31,31,31};//时隙0至7的衰减量数组,这个为自动衰减量 
//unsigned char Att_signal[31]={0x00,0x01,0x02,0x03,31,31,31};//时隙0至7的衰减量数组,这个为自动衰减量 
 
 
unsigned char LastChannel=0;//上一次衰减的时隙 
 
unsigned char int_cnt=0; 
unsigned char state=0; 
/****************************************************************** 
IO中断相关变量定义 
******************************************************************/ 
//volatile unsigned char UpDownFlag;//上下行标志 
unsigned char UpDownFlag;//上下行标志 
/****************************************************************** 
函数声明 
******************************************************************/ 
void adc_initial(void); 
void Deal_AD(void); 
void uart_initial(void); 
//void uart_send(void); 
void dacdelay(unsigned int x); 
void dacck(void); 
void writedac(unsigned char dat,unsigned char channel,unsigned char rng); 
void INT0_initial(void); 
void data_converter(unsigned char *p,unsigned int value); 
void send_data(unsigned char *p); 
void send_adc12_data(void); 
void Compare(void); 
void Calculate(void); 
void SendPortD(unsigned char channel,unsigned char data); 
void Att(unsigned char channel, unsigned char data); 
void uart_rec_process (void); 
//eeprom_write(addr,data);第一个参数为地址,第二个参数为数据 
//eeprom_read(addr);参数为地址,返回值为数据 
 
main() 
{ 
	uart_initial();//串口初始化 
	adc_initial();//AD转换初始化 
	INT0_initial(); 
	TRISD=0X00;//设置D口为输出方式 
	TRISB=0XFF;//设置B口为输入方式,中断输入 
	PORTD=0; 
	TRISE=0x00;//设置E口为输出方式 
	 
	//eeprom_write(0x10,100);//往地址0x10写数据 
	//eeprom_read(0); 
	 
//Ts0_threhold     = eeprom_read(0x10); 
//Ts1_threhold     = eeprom_read(0x11); 
//Ts2_threhold     = eeprom_read(0x12); 
//Ts3_threhold     = eeprom_read(0x13); 
//Ts4_threhold     = eeprom_read(0x14); 
//Ts5_threhold     = eeprom_read(0x15); 
//Ts6_threhold     = eeprom_read(0x16); 
//Att_manual_up    = eeprom_read(0x17); 
//Att_manual_dn    = eeprom_read(0x18); 
//Forward_dn       = eeprom_read(0x19); 
//Backward_dn 
//Open_threhold_dn = eeprom_read(0x??); 
//B2  =   eeprom_read(0x??); 
//B1  =   eeprom_read(0x??); 
//A2  =   eeprom_read(0x??); 
//A1  =   eeprom_read(0x??);	 
	 
Att_value[1] = Att_manual_up;	//这个应该在串口接到手动修改时再进行一次 
Att_value[2] = Att_manual_up;	//这个应该在串口接到手动修改时再进行一次 
Att_value[3] = Att_manual_up;	//这个应该在串口接到手动修改时再进行一次 
Att_value[4] = Att_manual_dn;	//这个应该在串口接到手动修改时再进行一次 
Att_value[5] = Att_manual_dn;	//这个应该在串口接到手动修改时再进行一次 
Att_value[6] = Att_manual_dn;	//这个应该在串口接到手动修改时再进行一次 
Att_value[0] = Att_manual_dn;	//这个应该在串口接到手动修改时再进行一次 
 
 
	 
SendPortD (control_att_up,0x1f); //开机衰减成最大 
SendPortD (control_att_dn,0x1f); 
 
 
SendPortD (control_bias,Forward_dn); 
SendPortD (control_backward_bias,Backward_dn); 
 
	while(1) 
	{	 
 
 
		//TXREG1='2'; 
		//TXREG1=eeprom_read(0x10); 
 
	 //	if (AD_Flag==1) //表示AD转换完成 
	 //	{ 
		//	 
		//	 Deal_AD(); 
	 //		AD_Flag=0; //消除AD转换完成标志 
	 //	}	 
	 	//TXREG1=Att_value[6];  //Only for test for 下行输chu  
//SendPortD (control_att_up,Att_manual_up); //正常工作时初始衰减手动植 
//SendPortD (control_att_dn,Att_manual_dn);		 
		 
//if (ADResult12[4]> Open_threhold_dn)//下行启动门限   
//	{		 
			 
 
  	SendPortD (control_only_up,0x00); //表示打开下行同步功能,因为下行输入信号 
 
 
  
 // if(INT0_att == 1) 
 //   { 
 //   	//INT0IE = 0; 
 //   	 Att(Channel_Choice ,Att_value[Channel_Choice] ); 
 //   	//SendPortD (control_att_dn,Att_value[Channel_Choice]); 
 //   	//TXREG1=Channel_Choice; 
 //   	 
 //   	//INT0IE = 1; 
 //   	 
 //   	INT0_att = 0; 
 //   	} 
   
   Compare();  //DA结果处理主要部分 
 
		 
  //writedac(B2,2,1); //将功放偏流写入 
  //writedac(B1,3,1); 
  //writedac(A2,0,1); 
  //writedac(A1,1,1);  
 
   	 
 
//	} 
//	else  //下行启动门限没有达到 
//	  { 
//	  	SendPortD (control_only_up,0xff); //表示关闭下行同步功能,因为下行输入信号太弱 
//	  }	 
 
 //uart_rec_process(); //串口接收数据处理 
 
	} //while 
} 
/****************************************************************** 
** 函 数 名: interrupt HI_ISR() 
** 功能描述: 高优先级中断子程序----AD转换中断 
******************************************************************/ 
void interrupt HI_ISR() 
{ 
	unsigned char i =0; 
	     
if (RC1IF==1)					//RS232接收中断 
	{ 
 
		recdata=RCREG1; 			//接收数据并存储	 
		    //uart_rec_data[5]=uart_rec_data[4];  //移位寄存 
		    //uart_rec_data[4]=uart_rec_data[3]; 
       // uart_rec_data[3]=uart_rec_data[2]; 
       // uart_rec_data[2]=uart_rec_data[1]; 
		    uart_rec_data[1]=uart_rec_data[0];		     
		    uart_rec_data[0]=recdata;		 
	 
	 
		 
//		while (TX1IF== 0);        //Only for test  
// TXREG1=uart_rec_data[1];  //Only for test 
//    while (TX1IF== 0);        //Only for test	 
     
			RC1IF=0;					//清接收中断标志	 
			RC_flag = 1;	  		     
  }//if (RC1IF==1) 
 
else if(INT0IF==1)//外部中断0发生 
	{   
		 
		 
		TRISD=0XFF;//设置D口为输入方式 
		 
	  
 
	 	  	UpDownFlag=(PORTD&0xf8)>>3;//读取D口状态 
	 	  		 	  	UpDownFlag=(PORTD&0xf8)>>3;//读取D口状态 
	 	  		 	  		 	  	UpDownFlag=(PORTD&0xf8)>>3;//读取D口状态 
        Channel_Choice = UpDownFlag;  //记住当前时隙,去掉了第5位标示 
         
        state = UpDownFlag; 
 	         
	  
        	ADIE=1;//A/D转换中断允许 
	        ADCON0=ADCON0|0x02;//启动AD转换 
	       //  Att(Channel_Choice,Att_value[Channel_Choice] ); 
	          
	        //Compare(); 
        	INT0_Flag = 1; 
         
	        
    
	//	Txreg1=='2';	  
	   // while (TX1IF== 0);  
		//TXREG1=Channel_Choice;  //为了串口测试使用 
		// while (TX1IF== 0);	 
	// dacdelay(delay_value); 
	 
	 
/* 
    	int_cnt++; 
    	if(int_cnt==2) 
    	  int_cnt = 0; 
    	   	 
			 
			 
			  //TXREG1=int_cnt; 
			 
			if(int_cnt == 1) //奇数中断 
        { 
        	ADIE=1;//A/D转换中断允许 
	        ADCON0=ADCON0|0x02;//启动AD转换 
	        //Att(Channel_Choice,Att_value[Channel_Choice] ); 
	        //Compare(); 
        	INT0_Flag = 1;  
        } 
      else if(int_cnt == 0)  //偶数中断 
        {        	 
        	ADIE=0;//A/D转换中断禁止 
        	ADCON0=ADCON0&0xfd;//禁止AD转换 
        	//Att(Channel_Choice,0);        	 
        	 
        //	Channel_Choice_next = Channel_Choice + 1; 
        //	if(Channel_Choice_next == 7 ) 
        //	   Channel_Choice_next = 0; 
        	 
          //Att(Channel_Choice,Att_value[Channel_Choice] ); 
          //  TXREG1=Att_value[0];        	       	 
        	INT0_att = 1;  
        }	 
    
*/ 
     
 
      TRISD=0X00;//设置D口为输出方式 
//TXREG1=Channel_Choice;  
//SendPortD (slot_number_inform,Channel_Choice);     
//SendPortD (slot_number_inform,Channel_Choice);           
//Att(Channel_Choice ,Att_value[Channel_Choice] );         
       
		INT0IF=0; //清中断标志 
 
		 
	} 
} 
/****************************************************************** 
** 函 数 名: interrupt low_priority LOW_ISR() 
** 功能描述: 低高优先级中断子程序----串口接收中断 
******************************************************************/ 
void  interrupt low_priority LOW_ISR() 
{ 
	//INT0IE=0; 
	if(ADIF==1)    //AD转换完成 
	{ 
		ADIF=0;    //清中断标志 
		 Deal_AD(); 
		//send_adc12_data(); 
 
		AD_Flag=1; //置AD转换完成标志 
	} 
	//INT0IE=1; 
//TXREG1=uart_rec_data[0];  //Only for test 
//while (TX1IF== 0);        //Only for test 
//TXREG1=' ';               //Only for test 
//while (TX1IF== 0);		    //Only for test 
//recdata=recdata<<3; 
//PORTD=recdata|0x04; 
} 
 
/****************************************************************** 
** 函 数 名: Deal_AD(void) 功能描述: AD转换结果处理 
******************************************************************/ 
void Deal_AD(void) 
{ 
	// 
	// ADResult=ADRESL+(ADRESH<<8);    //读取并存储AD转换结果(10位,高6位为0) 
	// ADResult12[ADCounter]=ADResult;//保存AD转换结果,这里可以通过设置来达到模拟AD的目的 
	//  ADCounter++; 
	//  ADCON0=0x01|(ADCounter<<2);//通道选择 
	//  if (ADCounter==11) 
	//  { 
	//  	ADCounter=0; 
	//  } 
 
 
	//AD_Flag=0;        //AD转换完成标志清零 
	ADCON0=ADCON0&0xfd;//禁止AD转换 
	   ADCON0=0x01|0x20;//8通道,使能AD 
	   ADResult=ADRESL+(ADRESH<<8);    //读取并存储AD转换结果(10位,高6位为0) 
	   ADResult12[8]=ADResult;//保存AD转换结果,这里可以通过设置来达到模拟AD的目的 
	  
 
	ADCON0=ADCON0|0x02;//启动AD转换 
	 
		//  ADCON0= 0x20; //8通道,禁止AD 
        //		 while (TX1IF== 0);        //Only for test  
        //  TXREG1=ADCounter;  //Only for test for 下行输入	 
        	//	 while (TX1IF== 0);        //Only for test  
          // TXREG1=ADResult12[8];  //Only for test for 下行输chu 
         //    while (TX1IF== 0);        //Only for test	 
          
  //TXREG1=ADRESH;        
        	 
} 
/****************************************************************** 
** 函 数 名: adc_initial(void)
** 功能描述: AD初始化 
******************************************************************/ 
void adc_initial(void) 
{ 
	ADCounter=0;//AD转换次数清零 
	 
	 ADCON0=0x01|0x20;//8通道,使能AD 
	 //ADCON0=0x01;//选择0通道,打开AD转换 
	ADCON1=0;//VREF+=VDD,VREF-=VSS,AN0~AN11配置为模拟输入 
	ADCON2=0x89;//ADFM=1,AD结果右对齐;ACQT2:ACQT0=001,采样时间为2倍TAD; 
			   //ADCS2:ADCS0=001,AD转换时钟为Fosc/8 
//	ADIP=1;//设AD转换中断为高优先级中断 
  ADIP=0;//设AD转换中断为低优先级中断 
	ADIF=0;//清A/D中断标志 
	//ADIE=0;//A/D转换中断禁止 
	ADIE=1;//A/D转换中断允许   
	//ADCON0=ADCON0|0x02;//启动AD转换 
	ADCON0=ADCON0&0xfd;//禁止AD转换 
} 
 
 
void Compare(void) 
{ 
    
        //	 while (TX1IF== 0);        //Only for test  
        //TXREG1=ADResult12[4];  //Only for test for 下行输chu 
        //    while (TX1IF== 0);        //Only for test	    
      ////////////////////////////这里是处理部分///////////////////////// 
 
     
     
     if((INT0_Flag==1)&&(AD_Flag==1))  //这个是外部中断处理结束,并且AD转变完成 
        { //int_cnt = 1; 
        	        	ADCON0=ADCON0&0xfd;//禁止AD转换 
        	          ADIE=0;//A/D转换中断禁止 
        	INT0_Flag = 0; 
          AD_Flag=0; 
            TXREG1=Channel_Choice;  
           SendPortD (slot_number_inform,Channel_Choice); 
          SendPortD (slot_number_inform,Channel_Choice); 
         // Att(Channel_Choice ,Att_value[Channel_Choice] ); 
 
                    //ADCON0= ADCON0&0xfe; // 禁止AD 
                //   while (TX1IF== 0);        //Only for test  
          //Only for test for 下行输chu         	          
         //      while (TX1IF== 0);        //Only for test  	 
        	 
        //		 while (TX1IF== 0);        //Only for test  
        // TXREG1=Channel_Choice;  //Only for test for 下行输chu 
        //    while (TX1IF== 0);        //Only for test	  
           
           
           
          	if (Channel_Choice==1)  //上行,Ts1时隙 
          	  { 
          	    
          	   //Ts1_latch	= ADResult12[5]; //记住上行,Ts1时隙的输入数据 
          	   Ts1_out_latch = ADResult12[6]; //记住上行,Ts1时隙的输出数据 
          	   //Gain_up =  Ts1_out_latch /Ts1_latch;  //更新上行增益	    
          	       if(Ts1_out_latch < Ts1_threhold- below_threhold) 
          	         { 
          	         	if(Att_value[1]>0) 
          	            Att_value[1]--;  //第1时隙 
          	          //Att_total_up = Att_value[1]+ Att_manual_up; 
          	          //if(Att_total_up > 31) 
          	          //  Att_total_up = 31; 
          	         // Att(1,Att_total_up); //衰减TS1 
          	         }           	        
          	       else if(Ts1_out_latch > Ts1_threhold+ over_threhold) 
          	         { 
          	         	if(Att_value[1]<31)          	         	 
          	            Att_value[1]++;  //第1时隙 
          	          //Att_total_up = Att_value[1]+ Att_manual_up; 
          	          //if(Att_total_up > 31) 
          	          //  Att_total_up = 31; 
          	         // Att(1,Att_total_up); //衰减TS1 
          	         }  
        	//	 while (TX1IF== 0);        //Only for test  
          //TXREG1=Att_total_up;  //Only for test for 下行输chu 
          //   while (TX1IF== 0);        //Only for test	          	          
          	              	      
          	  }	 
           
          	 if (Channel_Choice==2)  //上行,Ts2时隙 
          	  { 
          	    
          	   //Ts2_latch	= ADResult12[5]; //记住上行,Ts2时隙的输入数据 
          	   Ts2_out_latch = ADResult12[6]; //记住上行,Ts2时隙的输出数据 
          	   //Gain_up =  Ts2_out_latch /Ts2_latch;  //更新上行增益 
          	       if(Ts2_out_latch < Ts2_threhold- below_threhold) 
          	         { 
          	         	if(Att_value[2]>0) 
          	            Att_value[2]--;  //第2时隙 
          	          //Att_total_up = Att_value[2]+ Att_manual_up; 
          	          //if(Att_total_up > 31) 
          	          //  Att_total_up = 31; 
          	         // Att(2,Att_total_up); //衰减TS2 
          	         }           	        
          	       else if(Ts2_out_latch > Ts2_threhold+ over_threhold) 
          	         { 
          	         	if(Att_value[2]<31)          	         	 
          	            Att_value[2]++;  //第2时隙 
          	         // Att_total_up = Att_value[2]+ Att_manual_up; 
          	         // if(Att_total_up > 31) 
          	         //   Att_total_up = 31; 
          	         // Att(2,Att_total_up); //衰减TS2 
          	         } 
        	//	 while (TX1IF== 0);        //Only for test  
          //TXREG1=Att_total_up;  //Only for test for 下行输chu 
          //   while (TX1IF== 0);        //Only for test	          	          
          	           
          	  }					 
          	 if (Channel_Choice==3)  //上行,Ts3时隙 
          	  { 
          	    
          	   //Ts3_latch	= ADResult12[5]; //记住上行,Ts3时隙的输入数据 
          	   Ts3_out_latch = ADResult12[6]; //记住上行,Ts3时隙的输出数据 
          	   //Gain_up =  Ts3_out_latch /Ts3_latch;  //更新上行增益	    
          	       if(Ts3_out_latch < Ts3_threhold- below_threhold) 
          	         { 
          	         	if(Att_value[3]>0) 
          	            Att_value[3]--;  //第3时隙 
          	          //Att_total_up = Att_value[3]+ Att_manual_up; 
          	          //if(Att_total_up > 31) 
          	          //  Att_total_up = 31; 
          	          //Att(3,Att_total_up); //衰减TS3 
          	         }           	        
          	       else if(Ts3_out_latch > Ts3_threhold+ over_threhold) 
          	         { 
          	         	if(Att_value[3]<31)          	         	 
          	            Att_value[3]++;  //第3时隙 
          	          //Att_total_up = Att_value[3]+ Att_manual_up; 
          	          //if(Att_total_up > 31) 
          	          //  Att_total_up = 31; 
          	          //Att(3,Att_total_up); //衰减TS3 
          	         }  
        	//	 while (TX1IF== 0);        //Only for test  
          //TXREG1=Att_total_up;  //Only for test for 下行输chu 
          //   while (TX1IF== 0);        //Only for test	          	   
          	   
          	  }			 
           if (Channel_Choice==4)  //下行,Ts4时隙 
          	  { 
  
          	         //  TXREG1=Att_value[4];   
          	   //Ts4_latch	= ADResult12[7]; //记住下行,Ts4时隙的输入数据      
          	    
          	   Ts4_out_latch = ADResult12[8]; //记住下行,Ts4时隙的输出数据 
          	   Ts4_out_latch1 = Ts4_out_latch0; 
               Ts4_out_latch2 = Ts4_out_latch1; 
               Ts4_out_latch3 = Ts4_out_latch2; 
          	  //Ts4_out_latch = (Ts4_out_latch0+Ts4_out_latch1+Ts4_out_latch2+Ts4_out_latch3)>>2; 
          	    
          	  // Gain_dn =  Ts4_out_latch /Ts4_latch;  //更新下行增益 
          	   //Gain_dn =  Ts4_out_latch /Ts4_latch;  //更新下行增益 
          	   //SW_latch = Ts4_out_latch / ADResult12[5]; //更新驻波比,注意这里应该使用ADResult12[5]来表示上行输入 
          	       if(Ts4_out_latch < Ts4_threhold- below_threhold) 
          	         { 
          	          	if(Att_value[4]>0) 
          	             Att_value[4]--;  //第4时隙 
          	         // Att_total_dn = Att_value[4]+ Att_manual_dn; 
          	         // if(Att_total_dn > 31) 
          	         //   Att_total_dn = 31; 
          	         // Att(4,Att_total_dn); //衰减TS4 
          	           
          	         // Att(4,0); //衰减TS0 
          	         }           	        
          	       else if(Ts4_out_latch > Ts4_threhold+ over_threhold) 
          	         { 
          	          	if(Att_value[4]<31)          	         	 
          	             Att_value[4]++;  //第4时隙 
          	         // Att_total_dn = Att_value[4]+ Att_manual_dn; 
          	         // if(Att_total_dn > 31) 
          	         //   Att_total_dn = 31; 
          	         // Att(4,Att_total_dn); //衰减TS4 
          	          
          	          //Att(4,31); //衰减TS0 
          	         }  
          	          
           	   //TXREG1=Att_value[4];  //Only for test for 下行输chu   
         
          	   //Att(4,Att_value[4]);  
          	        // Att(5,Att_value[5] ); 
          	  } 						 
           if (Channel_Choice==5)  //下行,Ts5时隙 
          	  { 
          	    
          	   if(Ts5_threhold- below_threhold > 0) 
          	      Ts5_low_threhold = Ts5_threhold- below_threhold; 
          	   else 
          	      Ts5_low_threhold = 0;          	    
          	    
          	   //Ts5_latch	= ADResult12[7]; //记住下行,Ts5时隙的输入数据 
          	    
           	   Ts5_out_latch = ADResult12[8]; //记住下行,Ts5时隙的输出数据 
          	   Ts5_out_latch1 = Ts5_out_latch0; 
               Ts5_out_latch2 = Ts5_out_latch1; 
               Ts5_out_latch3 = Ts5_out_latch2; 
          	  //Ts5_out_latch = (Ts5_out_latch0+Ts5_out_latch1+Ts5_out_latch2+Ts5_out_latch3)>>2;    	    
          	    
          	    
          	//   Gain_dn =  Ts5_out_latch /Ts5_latch;  //更新下行增益 
          	  // SW_latch = Ts5_out_latch / ADResult12[5]; //更新驻波比,注意这里应该使用ADResult12[5]来表示上行输入 
           	       if(Ts5_out_latch < Ts5_threhold- below_threhold) 
          	         { 
          	          	if(Att_value[5]>0) 
          	             Att_value[5]--;  //第5时隙 
          	         // Att_total_dn = Att_value[5]+ Att_manual_dn; 
          	         // if(Att_total_dn > 31) 
          	         //   Att_total_dn = 31; 
          	         // Att(5,Att_total_dn); //衰减TS5 
          	          
          	         // Att(5,0); //衰减TS0 
          	         }           	        
          	       else if(Ts5_out_latch > Ts5_threhold+ over_threhold) 
          	         { 
          	         	 if(Att_value[5]<31)          	         	 
          	             Att_value[5]++;  //第5时隙 
          	          //Att_total_dn = Att_value[5]+ Att_manual_dn; 
          	          //if(Att_total_dn > 31) 
          	          //  Att_total_dn = 31; 
          	          //Att(5,Att_total_dn); //衰减TS5 
          	            
          	           //Att(5,31); //衰减TS0 
          	         }  
          	      //TXREG1=Att_value[5];      
          	    //Att(5,Att_value[5] );  
          	      //Att(6,Att_value[6] ); 
          	        
          	  }					 
           if (Channel_Choice==6)  //下行,Ts6时隙 
          	  { 
          	  // Ts6_latch	= ADResult12[7]; //记住下行,Ts6时隙的输入数据 
   
          	    
          	    
            	 Ts6_out_latch = ADResult12[8]; //记住下行,Ts6时隙的输出数据 
          	   Ts6_out_latch1 = Ts6_out_latch0; 
               Ts6_out_latch2 = Ts6_out_latch1; 
               Ts6_out_latch3 = Ts6_out_latch2; 
          	  //Ts6_out_latch = (Ts6_out_latch0+Ts6_out_latch1+Ts6_out_latch2+Ts6_out_latch3)>>2;         	    
          	    
          	//   Gain_dn =  Ts6_out_latch /Ts6_latch;  //更新下行增益 
          	  // SW_latch = Ts6_out_latch / ADResult12[5]; //更新驻波比,注意这里应该使用ADResult12[5]来表示上行输入 
           	        if(Ts6_out_latch < Ts6_threhold- below_threhold) 
          	          { 
          	          	if(Att_value[6]>0) 
          	            Att_value[6]--;  //第6时隙 
          	         // Att_total_dn = Att_value[6]+ Att_manual_dn; 
          	         // if(Att_total_dn > 31) 
          	         //   Att_total_dn = 31; 
          	         // Att(6,Att_total_dn); //衰减TS6 
          	         
          	        // Att(6,0); //衰减TS0 
          	         }           	        
          	        else if(Ts6_out_latch > Ts6_threhold + over_threhold) 
          	          { 
          	          	if(Att_value[6]<31)          	         	 
          	             Att_value[6]++;  //第6时隙 
          	         // Att_total_dn = Att_value[6]+ Att_manual_dn; 
          	         // if(Att_total_dn > 31) 
          	         //   Att_total_dn = 31; 
          	         // Att(6,Att_total_dn); //衰减TS6  
          	         
          	        // Att(6,31); //衰减TS0 
          	         } 
          	      //TXREG1=Att_value[6];    
          	        
          	    //Att(6,Att_value[6] );      
          	     // Att(0,Att_value[0] );       
          	   
          	   
          	  }					 
           if (Channel_Choice==0)  //下行,Ts0时隙 
          	  { 
          	    
           	    //TXREG1=Att_value[0];   
          	    
          	   //dacdelay(delay_value); 
          	    
          	   //Ts0_latch	= ADResult12[7]; //记住下行,Ts0时隙的输入数据 
          	    
            	 Ts0_out_latch = ADResult12[8]; //记住下行,Ts0时隙的输出数据 
          	   Ts0_out_latch1 = Ts0_out_latch0; 
               Ts0_out_latch2 = Ts0_out_latch1; 
               Ts0_out_latch3 = Ts0_out_latch2; 
          	  //Ts0_out_latch = (Ts0_out_latch0+Ts0_out_latch1+Ts0_out_latch2+Ts0_out_latch3)>>2;            	    
          	    
          	    
          	  // Gain_dn =  Ts0_out_latch /Ts0_latch;  //更新下行增益 
          	   //Gain_dn =  Ts0_out_latch - Ts0_latch;  //更新下行增益 
          	  // SW_latch = Ts0_out_latch - ADResult12[5]; //更新驻波比,注意这里应该使用ADResult12[5]来表示上行输入 
           	       if(Ts0_out_latch < Ts0_threhold- below_threhold) 
          	         { 
          	          if(Att_value[0]>0) 
          	             Att_value[0]--;  //第0时隙 
          	          //Att_total_dn = Att_value[0]+ Att_manual_dn; 
          	          //if(Att_total_dn > 31) 
          	          //  Att_total_dn = 31; 
          	          //Att(0,Att_total_dn); //衰减TS0 
          	          
          	         // Att(0,0); //衰减TS0 
          	         }           	        
          	       else if(Ts0_out_latch > Ts0_threhold + over_threhold) 
          	         { 
          	         	 if(Att_value[0]<31)          	         	 
          	             Att_value[0]++;  //第0时隙 
          	          //Att_total_dn = Att_value[0]+ Att_manual_dn; 
          	          //if(Att_total_dn > 31) 
          	          //  Att_total_dn = 31; 
          	          //Att(0,Att_total_dn); //衰减TS0 
          	          
          	         // Att(0,31); //衰减TS0 
          	         }  
                //while (TX1IF== 0);        //Only for test  
               // TXREG1=Att_value[0];  //Only for test for 下行输chu   
                   //TXREG1=Ts0_out_latch; 	          
                // while (TX1IF== 0);        //Only for test  
      
        //       while (TX1IF== 0);        //Only for test            	   
            //Att(0,Att_value[0] );  
          	  }	 
       //INT0_Flag = 0;	 
        
         
	                  ADCON0=ADCON0|0x02;//启动AD转换 
        	          ADIE=1;//A/D转换中断允许 
       	  
		    } //if(INT0_Flag==1)	 
		 
 
 
//	if (ADResult12[5]>)//反射功率,上行输入功率 
	//if (ADResult12[6]>)//上行输出功率 
// 	if ((ADResult12[7]> Open_threhold_dn))//下行输入超过门限 
//  	if (ADResult12[8]>)//下行输出功率应该超过一定值,否则减小衰减 
	////待写////if (ADResult12[9]>)//末级温度 
	////待写////if (ADResult12[10]>)//环境温度 
	////待写////if (ADResult12[11]>)//电源电压 
} 
 
 
/****************************************************************** 
** 函 数 名: uart_initial(void) 
** 功能描述: 232串行通讯初始化子程序,设置低优先级中断接收,使能232收和发 
******************************************************************/ 
void uart_initial(void) 
{ 
	TXSTA1=0x04;		//选择异步高速方式传输8位数据 BRGH=1 
	RCSTA1=0x80;		//允许串行口工作使能SOEN=1,CREN=1 
	TRISC=TRISC|0X80;	//PIC18F6722:将RC7(RX)设置为输入方式 
	TRISC=TRISC&0Xbf;	//RC6(TX)设置为输出	 
	SPBRG1=0x47;		//11.0592M晶振时波特率为9600,Baundrate=11059200/[16(X+1)] 
	RC1IE=1;            //使能接收中断 
	IPEN=1;    			//使能中断优先级 
	INTCON=INTCON|0xc0; //GIE|PEIE;//开全局中断,开外围模块中断 
	PIR1=0x00;			//清中断标志 
	PIE1=PIE1|0x20;		//允许串行通讯接口接收中断使能 
//	RC1IP=0;			//设置SCI接收中断为低优先级中断  
RC1IP=1;			//设置SCI接收中断为高优先级中断  
	CREN1=1;			//允许串口接收数据 
	TXEN1=1;			//允许串口发送数据 
} 
 
/****************************************************************** 
** 函 数 名: uart_send(void)
** 功能描述: RS232中断发送子程序 
******************************************************************/ 
/*void uart_send(void) 
{ 
	while (TXIF==0);   //TXIF=0表示发送缓冲区不为空 
	TXREG= 
}*/ 
 
/****************************************************************** 
** 函 数 名: dacdelay(unsigned char x) 
** 功能描述: 延时函数 
******************************************************************/ 
void dacdelay(unsigned int x)  
{  
	unsigned int i;  
	for(i=0;i>1;//发送通道地址的高位 
	dacck(); 
	/*if (channel==1||channel==3) 
	{ 
		dacdata=1; 
	} 
	else 
	{ 
		dacdata=0; 
	}*/	 
	dacdata=channel&0x01;//发送通道地址的低位 
	dacck(); 
	dacdata=rng; 
	dacck(); 
	for (i=0; i<8; i++)  
	{ 
		if (ch&0x80) 
			dacdata=1; 
		else 
			dacdata=0; 
		ch=ch<<1;		 
		dacck(); 
	} 
	dacload=0; 
	dacdelay(2); 
	dacload=1; 
	dacdelay(2); 
} 
 
/****************************************************************** 
** 函 数 名: INT0_initial(void) 
** 功能描述: 外部中断0初始化函数 
******************************************************************/ 
void INT0_initial(void) 
{   //外部中断0总是处于高优先级 
	INT0IE=1; //使能外部INT0中断 
	INT0IF=0; //清中断标志 
	INTEDG0=1;//外部中断设为上升沿中断 
} 
 
//********************************************************************************** 
void data_converter(unsigned char *p,unsigned int value)            //数据变换 
{ 
  unsigned int m,n,j=0; 
  p[0]=number_table[value/1000]; 
  m=value%1000; 
  p[1]=number_table[m/100]; 
  n=m%100; 
  p[2]=number_table[n/10]; 
  j=n%10; 
  p[3]=number_table[j/1]; 
} 
 
//********************************************************************************** 
//串行口发送数组 
void send_data(unsigned char *p) 
{unsigned int n;  
  
 for(n=0;n<4;n++)//p[n]!=0xff;n++) 
   { 
   while (TX1IF== 0);        // TXIF=0表示发送缓冲区不为空 
   TXREG1 = p[n]; 
   } 
while (TX1IF== 0);        // TXIF=0表示发送缓冲区不为空  
TXREG1=' '; 
} 
 
void send_adc12_data(void) 
{ 
     data_converter(display_buffer,ADResult);  //数据变换 
     send_data(display_buffer);            //发送数据     
} 
void Calculate(void) 
{ 
	//eeprom_write(0,1); 
	//eeprom_read(0); 
} 
 
 
 
//////////////////////衰减函数/////// 
 
void Att(unsigned char channel, unsigned char data) 
{ 
   
   
	if (channel==1||channel==2||channel==3)//上行 
	{ 
		SendPortD (control_att_up,data); 
	} 
    else if (channel==0||channel==4||channel==5||channel==6)//下行 
	{ 
		SendPortD (control_att_dn,data); 
	} 
	 
} 
 
void SendPortD(unsigned char control_choice,unsigned char data) //FPGA与CPU之间的一般数据传递 
{ 
	PORTD=control_choice|(data<<3);		 
}	 
 
///////////////串口接收处理/////////////// 
void uart_rec_process (void)// 模拟发送设置数据包0x7E,0x03,0xff, 0x01, 0x04,0x44,0x00,Forward_dn,0x7E 
{                           // 模拟发送查询数据包0x7E,0x02,0xff, 0x01, 0x04,0x44,0x00,Forward_dn,0x7E 
	 
unsigned int n;	 
	 
	if(RC_flag ==1)	//串口接收中断处理结束 
{ 
	RC_flag = 0; 
	   
	  if(package_data_count == 0) 
	    { 
 	     if(uart_rec_data[0]==0x7E) //开始数据包 
		    { 
      	package_data_count = 1; 
      	uart_send_data[8] = uart_rec_data[0]; 
		    }  
		   else 
		    { 
      	package_data_count = 0; 
      	uart_send_data[8] =0; 
		    } 		      
		  } 
		else if(package_data_count == 1) 
		  {   
		  	 
		  	if(uart_rec_data[0]==0x02) //即出现1xxxxxxx,对本系统的读操作,即查询 
		  	  { 
		  	   r_w = 1;  //对本系统读标志 
		  	   uart_send_data[7] =uart_rec_data[0]; 
		  	   package_data_count ++; 
		  	    
		  	  }  
		  	else if (uart_rec_data[0]==0x03)  //设置 
		  	  { 
		  	   r_w = 0;  //对本系统写标志	 
		  	   uart_send_data[7] =uart_rec_data[0];	  	  	 
		  	   package_data_count ++; 
		  	    
		  	  } 
		  	else 
		  	 { 
		  	 	package_data_count = 0; 
		  	 	uart_send_data[7]=0; 
		  	 	r_w = 0xff; 
		  	 	}   	  	       
		  }	 
		   
		else if(package_data_count == 2) 
		  {  
		  	  
		  	if((uart_rec_data[0]==0xFF)&&(r_w==0))  
          { 
           //uart_send_data[6] =0;	  	  	 
		  	   package_data_count ++;	 
          } 
		  	else if((uart_rec_data[0]==0xFF)&&(r_w==1)) //上位机读取时也是FF 
          { 
           //uart_send_data[6] =0;	  	  	 
		  	   package_data_count ++;	 
          } 
        else 
         { 
 		  	 	package_data_count = 0; 
		  	 	uart_send_data[6] =0xaa; 
         	} 
		  }	 
		   
		else if(package_data_count == 3) 		 
		  {   
  	     data_width = uart_rec_data[0];  
  	     uart_send_data[5] =uart_rec_data[0];  //记住数据字节数 
  	     if(data_width > 2)      
  	       { 
 		  	   	uart_send_data[6] =0xaa; 	  //操作字节数超支     	  
  	       	 data_width = 0; 
  	       	}   
		  	package_data_count ++; 
		  	 
		  }			   
		   
		else if((package_data_count == 4)||(package_data_count == 5))  
		  { 
	  	   package_data_count++;          
		     uart_send_data[9-package_data_count]= uart_rec_data[0]; 
 
		  } 
		   
/*////////////////////////////----------------((package_data_count == 6) ||(package_data_count == 7))开始-----------------///////////////////////////////////*/		   
		  
		 else if((package_data_count == 6) ||(package_data_count == 7))		 
		  {  
	  	   package_data_count++; 
	  	    
/*////////////////////////////----------------读开始-----------------///////////////////////////////////*/		  	   
	  	    
		  	if(r_w==1)  //读 
		  	  {  
////////////这里是Forward_dn开始/////////////////// 	  		  	  	 
		  	  	if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x44)) 
		  	  	  { 
		  	  	  	uart_send_data[2]= 0; 
		  	  	  	uart_send_data[1]= Forward_dn; //只有一个字节的高位为全0		  	  	  	 
		  	   address_right= 1; 
		  	      } 
 	 
//////////////////////这里是Forward_dn截止//////////////// 
 
////////////这里是Backward_dn开始/////////////////// 	  		  	  	 
		  	 else	if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x45)) 
		  	  	  { 
		  	  	  	uart_send_data[2]= 0; 
		  	  	  	uart_send_data[1]= Backward_dn; //只有一个字节的高位为全0		  	  	  	 
		  	   address_right= 1; 
		  	      } 
 
//////////////////////这里是Backward_dn截止//////////////// 
 
////////////这里是控制上下行通道关闭开始/////////////////// 	  		  	  	 
		  	  else if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x46)) 
		  	  	  { 
		  	  	  	uart_send_data[2]= 0; 
		  	  	  	uart_send_data[1]= switch_in_shut; //只有一个字节的高位为全0		  	  	  	 
		  	   address_right= 1; 
		  	      } 
 
//////////////////////这里是控制上下行通道关闭截止//////////////// 
           
          else  
             { 
		  	   address_right= 0;   //读取数据地址错误          	 
             } 
 
		  	  }//(r_w==1) //读 
		  	   
/*////////////////////////////----------------读结束-----------------///////////////////////////////////*/ 
			  	   
/*////////////////////////////----------------写开始-----------------///////////////////////////////////*/	 
 
		  	   
		  	else if(r_w==0) //写 
		  	  {  
 
		  	  		uart_send_data[9-package_data_count]=uart_rec_data[0]; //只有一个字节的高位为全0 
		  	  	  setup_data[8-package_data_count]=uart_rec_data[0]; 
////////////这里是Forward_dn开始/////////////////// 	   
		  	if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x44)) 
		  	   { 
		  	   	if(package_data_count == 7) 
		  	   	  eeprom_write(0x19,0); //写入E2PROM 
		  	   	else if(package_data_count==8) 
		  	   	  { 
		  	   	  eeprom_write(0x19,uart_rec_data[0]); //写入E2PROM		 
		  	   	  Forward_dn= eeprom_read(0x19);		  	   	    	   	 
		  	   	  if(Forward_dn == uart_rec_data[0]) 
		  	  	  	  { 
		  	  	  	  uart_send_data[6] =0; 
		  	  	  	  SendPortD (control_bias,Forward_dn); 
		  	  	  	  } 
		  	  	  else 
		  	  	  	  { 
		  	  	  	  uart_send_data[6] =0xaa; 
		  	  	  	  } 
		  	   	  }  
		  	   address_right= 1; 
		  	   } 
		  	  	   
//////////////////////这里是Forward_dn截止//////////////// 
////////////这里是Backward_dn开始/////////////////// 	   
		  	else if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x45)) 
		  	   { 
		  	   	if(package_data_count == 7) 
		  	   	  eeprom_write(0x20,0); //写入E2PROM 
		  	   	else if(package_data_count==8) 
		  	   	  { 
		  	   	  eeprom_write(0x20,uart_rec_data[0]); //写入E2PROM		 
		  	   	  Forward_dn= eeprom_read(0x20);		  	   	    	   	 
		  	   	  if(Forward_dn == uart_rec_data[0]) 
		  	  	  	  { 
		  	  	  	  uart_send_data[6] =0; 
		  	  	  	  SendPortD (control_backward_bias,Backward_dn); 
		  	  	  	  } 
		  	  	  else 
		  	  	  	  { 
		  	  	  	  uart_send_data[6] =0xaa; 
		  	  	  	  } 
		  	   	  }  
		  	   address_right= 1; 
		  	   } 
  		  	  	   
//////////////////////这里是Backward_dn截止//////////////// 
 
////////////这里是控制上下行通道关闭开始/////////////////// 	   
		  	else if((uart_send_data[4]==0x04)&&(uart_send_data[3]==0x46)) 
		  	   { 
		  	   	if(package_data_count == 7) 
		  	   	  eeprom_write(0x21,0); //写入E2PROM 
		  	   	else if(package_data_count==8) 
		  	   	  { 
		  	   	  eeprom_write(0x20,uart_rec_data[0]); //写入E2PROM		 
		  	   	  switch_in_shut= eeprom_read(0x21);		  	   	    	   	 
		  	   	  if((switch_in_shut == uart_rec_data[0])&&((switch_in_shut == 0x00)||(switch_in_shut == 0xff))) 
		  	  	  	  { 
		  	  	  	  uart_send_data[6] =0; 
		  	  	  	  SendPortD (control_no_detect,switch_in_shut); 
		  	  	  	  } 
		  	  	  else 
		  	  	  	  { 
		  	  	  	  uart_send_data[6] =0xaa; 
		  	  	  	  } 
		  	   	  }  
		  	   address_right= 1; 
		  	   } 
	  	  	   
//////////////////////这里是控制上下行通道关闭截止//////////////// 
		  	else 
		  	  { 
		  	  	address_right = 0; //写入数据地址错误  
		  	  } 
		  	   
		  	  	 
		  	  }	//(r_w==0) //写 
 
/*////////////////////////////----------------写结束-----------------///////////////////////////////////*/ 
		  	  	  	   
		  } //(package_data_count == 6) ||(package_data_count == 7)	 
		   
/*////////////////////////////----------------((package_data_count == 6) ||(package_data_count == 7))结束-----------------///////////////////////////////////*/		   
		   
		   
		 else if(package_data_count == 8) 		 
		  { 
		  	 
 	     if(uart_rec_data[0]==0x7E) //结束数据包 
		    { 
 
      	uart_send_data[0] = 0x7E; 
		    }  
		   else 
		    { 
 
      	uart_send_data[6] =0xaa; 
      	uart_send_data[0] = 0x7E; 
		    }  
		    	 
      for(n=0;n<9;n++)//p[n]!=0xff;n++) 
           { 
           while (TX1IF== 0);        // TXIF=0表示发送缓冲区不为空 
           TXREG1 = uart_send_data[8-n]; 
           } 
        while (TX1IF== 0);        // TXIF=0表示发送缓冲区不为空 
         
        package_data_count = 0;  	  	   
		  } 
 
		   
		 while (TX1IF== 0);        //Only for test  
  TXREG1=package_data_count;  //Only for test 
     while (TX1IF== 0);        //Only for test 
        
} // if(RC1IF==0) 
	 
	 
	 
	} 
 
 
 
 
 
/******************************需要设置的参量**********************************************/     
//同步开关前沿量(前沿提前量) Forward_dn,读写整数(1) 
//同步开关后沿量 (后沿延时量)Backward_dn,读写整数(1) 
//下行输出过功率门限(启控电平  下行输出) Ts0_threhold,Ts4_threhold,Ts5_threhold,Ts6_threhold,读写有符号整数(2) 
//上行输出过功率门限 (启控电平  上行输出)Ts1_threhold,Ts2_threhold,Ts3_threhold,读写有符号整数(2) 
// 
//上行人为衰减(上行衰减)Att_manual_up,读写整数(1) 
//下行人为衰减(下行衰减)Att_manual_dn,读写整数(1) 
// 
//启动门限量 Open_threhold_dn,浮点数 ,读写(单位伏特) 
// 
//末级功放偏压 A1,A2,B1,B2, 写(滑条)浮点数 
// 
//末级功放偏压显示 A1_latch,A2_latch,B1_latch,B2_latch, 读(数据框)浮点数 
//下行输入功率电平:Ts0_latch, Ts4_latch,Ts5_latch,Ts6_latch,只读有符号整数(2) 
//下行输出功率电平:Ts0_out_latch, Ts4_out_latch,Ts5_out_latch,Ts6_out_latch,只读有符号整数(2) 
//上行输入功率电平:Ts1_latch, Ts2_latch,Ts3_latch,只读有符号整数(2) 
//上行输出功率电平:Ts1_out_latch, Ts2_out_latch,Ts3_out_latch,只读有符号整数(2) 
// 
//下行实际增益 Gain_dn,只读浮点数 
//下行驻波比值 SW_latch,只读浮点数 
// 
//电源电压  只读浮点数 (单位伏特) 
//环境温度  只读浮点数 
//末级温度  只读浮点数 
/****************************************************************************/