📄 analysisrs232.c
字号:
#include "port.h"
#include "function.h"
#include "Exvariable.h"
#include "HeadFileRs232.h"
#include "MATH.h"
//填写48口状态表
void AnalysisRs232(void)
{
// 运行参数1、运行参数2上来自上位机指令
// 查询功放低噪放的状态
//功放:输出功率、驻波比、温度、ALC值、ATT值、功放开关
//低噪放:输出功率(单独一条指令完成)、ALC值、ATT值
unsigned int time;
PageTemp=SFRPAGE;
//校验接收完的RS232数据
if(!Security( &Rs485RxBuffer, LenDataRs232 ,LenFrExDataRs232))
{
AnalyseUpMachineFlag=0;
AnalysisFlag=0;
return;
}
TempBuffer=&Rs485RxBuffer[30];
TranBuffRs485 = &Rs485RxBuffer[40];
CountT0=0x0f;
switch (Commands)
{
case 0x21:
case 0xec:
StateTableRs485.count=0x03;
//检测功率
MeasurePower();
SendToModuleFlag=1;
break;
//设置模块ATT
case 0x35:
//将向485口发送的数据存入485状态表中的备份缓冲区
//存上行低噪放ATT值
*( TempBuffer++ )= Rs485RxBuffer[ 12+1];
//存上行功放ALC值
*( TempBuffer++ )= Rs485RxBuffer[ 12+5];
//存下行功放ATT值
*( TempBuffer++ )= Rs485RxBuffer[ 12+4];
//存下行功放ALC值
*( TempBuffer++ )= Rs485RxBuffer[ 12+8];
StateTableRs485.count=0x04;
SendToModuleFlag=1;
break;
//查看模块
case 0xeb:
//这一部分代码在初始化时已经运行过了,
//置位接收完成
//向上位机发送回馈信息
StateTableRs485.RecCompleteRs485=1;
break;
//控制下行功放开关
case 0x34:
*( TempBuffer )=( Rs485RxBuffer[12+1]&0x40)?0x01:0x00;
StateTableRs485.count=0x01;
SendToModuleFlag=1;
break;
//复位指令: 1.单片机程序设置告警使能全部有效
//2.单片机程序设置查询和告警电话为15个0x20
//3.单片机程序设置直放站编号和设备编号全为0
case 0xff:
case 0x10:
//在EEPROM中存直放站编号和设备号
SFRPAGE=CONFIG_PAGE;
Rs485RxBuffer[6]=0x00;
fEepromWriteSA(&Rs485RxBuffer[6],0x0015,0x05);
WriteDisable();
for(time=0;time<4500;time++);
StateTableRs485.RecCompleteRs485=1;
break;
//直放站初始化代码
//直放站设置初始化向导(1/6)---直放站编号
case 0xd0:
//直放站设置初始化向导(1/6)---直放站编号(没有特权指令)
case 0x30:
//在EEPROM中存直放站编号和设备号
SFRPAGE=CONFIG_PAGE;
fEepromWriteS(&Rs485RxBuffer[6],0x0015,0x05);
WriteDisable();
for(time=0;time<4500;time++);
StateTableRs485.RecCompleteRs485=1;
break;
//直放站设置初始化向导(3/6)----通讯参数
case 0x31:
break;
//直放站设置初始化向导(4/6)-----告警使能
case 0x32:
SFRPAGE=CONFIG_PAGE;
fEepromWrite(&Rs485RxBuffer[12+2],0x0041);
WriteDisable();
for(time=0;time<4500;time++);
StateTableRs485.RecCompleteRs485=1;
break;
//直放站设置初始化向导(5/6)----功率门限
case 0x33:
break;
//直放站设置初始化向导(3/6)----通讯参数(没有特权指令)
case 0xd:
break;
default:
//如果命令号不在分析的范围内,
//置位AnalysisFlag标志,不处理这条指令,
//程序允许接收上位机的下一条指令
AnalysisFlag=0x00;
break;
}
//分析上位机指令标志
AnalyseUpMachineFlag=0;
SFRPAGE=PageTemp;
}
void TransferToModule(void)
{
// 监控盘在初始化时
//向组合模块发送指令查询模块地址
//当运行到0x098,0x00以后,发送的指令和以前有所变化
unsigned char i;
switch(Commands)
{
// 运行参数1、运行参数2上来自上位机指令
// 查询功放低噪放的状态
//功放:输出功率、驻波比、温度、ALC值、ATT值、功放开关
//低噪放:输出功率(单独一条指令完成)、ALC值、ATT值
case 0x21:
case 0xec:
switch(StateTableRs485.count)
{
case 0x03:
Rs485RxBuffer[1]=type_lna;//模块地址
i=MODULEADDRESS_lna;
Rs485RxBuffer[2]=MODULEADDRESS_lna;
Rs485RxBuffer[3]=0x11;//命令号
Rs485RxBuffer[5]=0x00;//命令体长度
TransmitAck();
break;
case 0x02:
Rs485RxBuffer[1]=type_pa;//模块地址
Rs485RxBuffer[2]=MODULEADDRESS_pa;
Rs485RxBuffer[3]=0x11;//命令号
Rs485RxBuffer[5]=0x00;//命令体长度
TransmitAck();
break;
case 0x01:
Rs485RxBuffer[1]=type_det;//模块地址
Rs485RxBuffer[2]=MODULEADDRESS_lna;
Rs485RxBuffer[3]=0x11;//命令号
Rs485RxBuffer[5]=0x00;//命令体长度
TransmitAck();
break;
default:
break;
}
break;
//设置模块ATT
case 0x35:
switch(StateTableRs485.count)
{
case 4:
//设置LNA ATT
// if(FindLna)
// {
TempBuffer=&Rs485RxBuffer[30];
Rs485RxBuffer[1]=type_lna;//模块地址
Rs485RxBuffer[2]=MODULEADDRESS_lna;
Rs485RxBuffer[3]=0x20;//命令号
Rs485RxBuffer[5]=0x01;//命令体长度
Rs485RxBuffer[6]=*( TempBuffer);
Rs485RxBuffer[6]&=0x7f;
TransmitAck();
/* }
else
{
TempBuffer=&Rs485RxBuffer[30];
TempBuffer++;
StateTableRs485.count--;
SendToModuleFlag=0x01;
}*/
break;
case 3:
//设置LNA ALC
// if(FindLna)
// {
Rs485RxBuffer[1]=type_lna;//模块地址
Rs485RxBuffer[2]=MODULEADDRESS_lna;
Rs485RxBuffer[3]=0x23;//命令号
Rs485RxBuffer[5]=0x01;//命令体长度
Rs485RxBuffer[6]=*( TempBuffer+1);
Rs485RxBuffer[6]&=0x7f;
TransmitAck();
/* }
else
{
TempBuffer++;
StateTableRs485.count--;
SendToModuleFlag=0x01;
}*/
break;
case 2:
// if(FindPa)
// {
StateTableRs485.count=0x01;
Rs485RxBuffer[1]=type_pa;//模块地址
Rs485RxBuffer[2]=MODULEADDRESS_pa;
Rs485RxBuffer[3]=0x20;//命令号
Rs485RxBuffer[5]=0x01;//命令体长度
Rs485RxBuffer[6]=*( TempBuffer+2);
Rs485RxBuffer[6]&=0x7f;
TransmitAck();
/* }
else
{
TempBuffer++;
StateTableRs485.count--;
SendToModuleFlag=0x01;
StateTableRs485.RecCompleteRs485=0x01;
}*/
break;
case 0x01:
// if(FindPa)
// {
StateTableRs485.count=0x01;
Rs485RxBuffer[1]=type_pa;//模块地址
Rs485RxBuffer[2]=MODULEADDRESS_pa;
Rs485RxBuffer[3]=0x23;//命令号
Rs485RxBuffer[5]=0x01;//命令体长度
Rs485RxBuffer[6]=*( TempBuffer++);
Rs485RxBuffer[6]&=0x7f;
TransmitAck();
/* }
else
{
TempBuffer++;
StateTableRs485.count--;
SendToModuleFlag=0x01;
}*/
}
break;
//查看模块
case 0xeb:
//这一部分功能在初始化时已经实现了
break;
//控制功放开关
case 0x34:
Rs485RxBuffer[1]=type_pa;//模块地址
Rs485RxBuffer[2]=MODULEADDRESS_pa;
Rs485RxBuffer[3]=0x22;//命令号
Rs485RxBuffer[5]=0x01;//命令体长度
Rs485RxBuffer[6]=*(TempBuffer);
TransmitAck();
break;
case 0x01:
Rs485RxBuffer[3]=0x11;//命令号
Rs485RxBuffer[5]=0x00;//命令体长度
Rs485RxBuffer[1]=Rs485RxBuffer[30];
Rs485RxBuffer[2]=Rs485RxBuffer[31];
TransmitAck();
break;
default:
//如果命令号不在分析的范围内,
//置位AnalysisFlag标志,不处理这条指令,
//程序允许接收上位机的下一条指令
AnalysisFlag=0x01;
break;
}
}
void TransmitAck(void)
{
// 将命令打包,并发送
unsigned char CrcH, CrcL, CommandLen;
PageTemp=SFRPAGE;
SFRPAGE=CONFIG_PAGE;
EnRs485=0x01;
Rs485RxBuffer[0] = FrameStartRs485;
Rs485RxBuffer[4] =0x00;//应答标志填0
CommandLen = Rs485RxBuffer[5];
Crc1021((Rs485RxBuffer + 1), (CommandLen + 5), &CrcH, &CrcL); // 对命令字段进行CRC校验
Rs485RxBuffer[6 + CommandLen] = CrcL;
Rs485RxBuffer[7 + CommandLen] = CrcH;
Rs485RxBuffer[8 + CommandLen] =FrameEndRs485;
Delay(300);
Rs485ReadPointer = 0;
Rs485SendLen = 8 + CommandLen + 1;
TDR = Rs485RxBuffer[Rs485ReadPointer++];
T0Init();
SFRPAGE=CONFIG_PAGE;
LampRecUp=0x01;
LampSendModule=0x00;
SFRPAGE=PCA0_PAGE;
CCF1=1;
SFRPAGE=PageTemp;
}
void T0Init(void)
{
PageTemp=SFRPAGE;
SFRPAGE=TIMER01_PAGE;
TMOD|= 0x01; // Configure Timer 0 interrupt
CKCON|= 0x02; // Timer 0 derived from SYSCLK /48
TH0 =0xC5; // Timer 0 initial value
TL0 =0x92; // 65ms
TF0=0;
TR0 = 1; // Start Timer 1
IE|=0x02; //Enable Time 0 interrupt
// ET0=0;
SFRPAGE=PageTemp;
}
void Delay(unsigned int TimerConst)
{
unsigned int i;
for (i = 0; i < TimerConst; i++)
{
;
}
}
void MeasurePower(void)
{
unsigned char PV,i; unsigned int T1549VAL1,T1549VAL2;
bit power=0x01;
T1549VAL1=ReadAD1549();
T1549VAL1=ReadAD1549();//延时再读
T1549VAL1=ReadAD1549();//延时再读
T1549VAL1=0;
power=1;
while(power)
{
T1549VAL1 = ReadAD1549();
T1549VAL2=ReadAD1549();
if(abs(T1549VAL1-T1549VAL2)<0x10)
power=0;
}
//AD8313功率检测出电压范围0.7---2.0
//经TLC1549电压放大( Vo=4Vs-3Vi; Vs取1.7)以后,电压范围0.8---4.7
//步进是0.06,应该转化对Vi的计算Vi=(4Vs-Vo)/3
//PV= (((T1549VAL1*5/1023)-0.8)/0.06)+50-65;
PV=((((6.8-(T1549VAL1*5/1023))/3)-0.8)/0.06)+50-65;
Rs485RxBuffer[49]=PV;
}
unsigned int ReadAD1549(void)
{
unsigned char i,j;
unsigned int dataout = 0;
//P3 use at all page
ADCLE=0x01;
ADCDOUT = 1;
ADCCLK = 0;
ADCCS = 0;
for (j = 0;j <= 10; j++);
for (i = 0; i < 10;i++)
{
ADCCLK = 1;
dataout <<=1;
if (ADCDOUT == 1)
{
dataout |= 0x0001;
}
ADCCLK = 0;
}
ADCCS = 1;
return dataout;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -