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

📄 analysisrs232.c

📁 it is code for briging up_machtion to down machtion,it s functions act protol changing and comunica
💻 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 + -