📄 main_zkf.c
字号:
//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)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -