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

📄 pmmain.c

📁 一端连续波功率计的显示程序的主程序
💻 C
📖 第 1 页 / 共 2 页
字号:

/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.2c Standard

Project : 
Version : 
Date    : 2005-4-16
Author  : JerryYoung                      
Company :                                 
Comments: 


Chip type           : ATmega128
Program type        : Application
Clock frequency     : 12.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 1024
*****************************************************/

#include <mega128.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>

#include "PMmain.h"       
#include "button.h"
#include "usart.h"
#include "MAX1282.h"
#include "DAC.h"
#include "LED.h"
#include "protocal.h"

unsigned int BAUD=9600;                //9600//波特率采用38400bps 
//UBRR0 设置参数,double speed 
unsigned int BAUD_SETTING;//=(unsigned int)((unsigned long)CRYSTAL/(8*(unsigned long)BAUD)-1);

extern ACK  *pACK;
extern STATE *pSTATE;
extern DATA *pDATA;
extern char dashPos;
//------------------------------------------
flash unsigned char MAX1282_CHANNEL[4]={0X01,0X05,0X02,0X06};//CHANNEL0~3
char startupString[]={"Welcome to use YAMEI PowerMeter 2422\n\r"};
BOOL flag_10ms=FALSE,flag_1s=FALSE,startZero=FALSE; 
unsigned char Mode=ZERO;
unsigned char Range=RANGE5;
unsigned int atten=10000;// 1, 10, 100, 1000, 10000 
unsigned int queue[MAX_MID_FILTER];//队列用于 中值滤波
unsigned int queue2[MAX_MID_FILTER2];//队列用于 中值滤波
unsigned int gZeroRef;
void main(void)
{
unsigned char i=0;
unsigned char point_pos=2;//小数点位置从右到左1,2,3,4,
						//0表示不显示小数点
unsigned char K;

unsigned int power_value,ndBmPower_value;
float fdBmPower_value=0.0,last_fPower_value,last_fdBmPower_value;

BOOL dBmIsNeg=FALSE,start_remote=FALSE;
unsigned int temp;
unsigned char smallCnt=0;
//usart
unsigned char command;

#asm("cli");
Port_Init();
Init_Unused();  
BAUD_SETTING=(unsigned int)((unsigned long)CRYSTAL/(8*(unsigned long)BAUD)-1);
Usart_Init(BAUD_SETTING);//setting baudrate  
SPIInit();  		//for max1282
Button_Init();
LED_Init();
DacInit();
#asm("sei"); 

//#if USART_ON==1
Usart_printf(startupString,sizeof(startupString));
//#endif
LED_dispNumber(2422,0);   
delay_ms(1000);
SetAtten(atten);
Light_LED(BULB_ZEROING);
LED_dispDash();
startZero=TRUE;
AutoZero2();
startZero=FALSE;
LED_dispAllDash();
//Light_LED(0) ;

delay_ms(20);


i=0;
while(TRUE)
	{

	 //if(flag_10ms==TRUE)
	 { 
	 {
	   //调整atten和range
	  //		  atten=    10000,		1000,		100,		10,	1
	  //对应RANGE=RANGE5,  RANGE4,  RANGE3, RANGE2,	RANGE1

	//如果采用方案二增加下面代码////////////
	//Range=RANGE5;/////////////////////////////////////////
	//atten=10000;///////////////////////////////////////////
	//SetAtten(atten);////////////////////////////////////////
	 ///////////////////////////////////////////////////// 
	 if(flag_1s==TRUE)
	 	{
	 	flag_1s=FALSE;
	 	ZeroEnable(); 
		//startZero=TRUE;
		//#asm("sei"); 
	 	//Light_LED(BULB_ZEROING);
		//AutoZero3();
		//Mode=WATT;
		//startZero=FALSE;
		//LED_dispAllDash();
		delay_ms(1);//时间可以改小点
		ZeroDisable(); 
	 	}
	 for(i=0;i<MAX_MID_FILTER;i++)
	 	{
	 	  power_value=Filter();//0~1000
		  power_value=FilterMid(power_value);
	 	}
	//temp=FilterAver();
	while(power_value<MIN_RANGE)
	{
		if(atten>=10)
			{
			Range--;
			atten=atten/10;
			SetAtten(atten);
		       //	WaitKey();///test
			}
		else 
			{
			
			break;
			}
		//delay_ms(10);
		 for(i=0;i<MAX_MID_FILTER;i++)
	 	{
	 	  power_value=Filter();//0~1000
		  power_value=FilterMid(power_value);
	 	}
		
	}
       //	while(temp>MAX_RANGE) 
	while((PINB.6==1)||(PINB.6==1)||(power_value>MAX_RANGE))
		{
		if(atten<=1000)
			{
			Range++;
			atten=atten*10;
			SetAtten(atten);
		       //	WaitKey();///test
			}
		else 
			{
			
			break;
			}
		for(i=0;i<MAX_MID_FILTER;i++)
	 	{
	  	power_value=Filter();//0~1000
		  power_value=FilterMid(power_value);
	 	}
		}

	  if(power_value<=90)  power_value=0;
	

 	  switch(Range)
	  	{
	  	case RANGE1://3//3uw~10uw
	  	power_value=Filter3(power_value);
		//if(power_value<220) ((unsigned long) power_value*(MAX_RANGE-10))/MAX_RANGE;
		if(power_value>220&&power_value<400) 
				power_value=(long int)((long int)power_value*316)/348;
		else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1065;
	
			break;
		case RANGE2:
			if(power_value>200&&power_value<400)
				power_value=(long int)((long int)power_value*316)/328;
			else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1065;
			break;
		case RANGE3:
			if(power_value>200&&power_value<400)
				power_value=(long int)((long int)power_value*316)/322;
			else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1062;
			break;
		case RANGE4:
			if(power_value>200&&power_value<400) 
				power_value=(long int)((long int)power_value*316)/322;
			else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1058;
			break;
		case RANGE5:
			if(power_value>200&&power_value<400)
			      power_value=(long int)((long int)power_value*316)/335;
			else if(power_value>800) power_value=(long int)((long int)power_value*1000)/1136;
			if(power_value>1100) Light_LED(BULB_OVERRANGE);
			break;
		default:break;
	  	} 

	  /////ctrl pin8,9,10
	  if(Range==RANGE1) CTR1();
	  else if(Range==RANGE2) CTR2();
	  else if(Range==RANGE3||Range==RANGE4||Range==RANGE5) CTR345();

	  
 //++++++++++++以下负责显示+++++++++++++++++++//
	 if(Mode==ZERO) 
	 	{ 
	 	ZeroEnable(); 
		startZero=TRUE;
		//#asm("sei"); 
	 	Light_LED(BULB_ZEROING);
		AutoZero2();
		Mode=WATT;
		startZero=FALSE;
		LED_dispAllDash();
		ZeroDisable(); 
	 	}
	 else if(Mode==WATT)  
	 	{
	 	if(Range==RANGE1) {point_pos=3;}
		else if(Range==RANGE4) {point_pos=3;}
		else if(Range==RANGE2||Range==RANGE5) point_pos=2;
		else if(Range==RANGE3) point_pos=4;
		
	 	LED_dispNumber(power_value,point_pos);
		
		if(Range==RANGE1||Range==RANGE2) //uW
			Light_LED(BULB_uW);
		else Light_LED(BULB_mW);
		//////////
	 	}
	 	
	 else if(Mode==dBm)
	 	{
	 	
	 	//fmwPower_value=(float)power_value/10.0;
	 	if(power_value==0)
	 		{
	 		LED_dispNumber(11000,0);
			continue;
	 		}
		else fdBmPower_value=10*log10((float)power_value);
		
		switch(Range)
			{
			case RANGE1:			//负dBm
				fdBmPower_value-=50;//-20-30
				//得到要显示的值
				if(fdBmPower_value<0) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					}
				else dBmIsNeg=FALSE;
				ndBmPower_value=(unsigned int)(10*fdBmPower_value);
				point_pos=2;
				break;
			case RANGE2:		//负dBm
				fdBmPower_value-=40;//-10-30
				//得到要显示的值
				if(fdBmPower_value<0) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					}
				else dBmIsNeg=FALSE;
				ndBmPower_value=(unsigned int)(10*fdBmPower_value);
				point_pos=2;
				
				break;
			case RANGE3:
				fdBmPower_value-=30;//
				//得到要显示的值
				if(fdBmPower_value<0) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					}
				else dBmIsNeg=FALSE;
				ndBmPower_value=(unsigned int)(100*fdBmPower_value);
				point_pos=3;
				break;
			case RANGE4:
				fdBmPower_value-=20;//
				//得到要显示的值
				if(fdBmPower_value<0) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					}
				else dBmIsNeg=FALSE;
				ndBmPower_value=(unsigned int)(100*fdBmPower_value);
				point_pos=3;
				
				break;
			case RANGE5:
				fdBmPower_value-=10;//
				//得到要显示的值
				if(fdBmPower_value<0) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					}
				else dBmIsNeg=FALSE;
				
				ndBmPower_value=(unsigned int)(100*fdBmPower_value);
				point_pos=3;
				break;
			default:break;
			}

		if(dBmIsNeg==TRUE)
			{
			LED_dispNumber(ndBmPower_value+10000,point_pos);//10000为显示-
			}
		else {
			LED_dispNumber(ndBmPower_value,point_pos);
			}

		Light_LED(BULB_dBm);
		}
	 else if(Mode==dBREF)
	 	{
	 	
	 	//fmwPower_value=(float)power_value/10.0;
	 	if(power_value==0)
	 		{
	 		LED_dispNumber(11000,0);
			continue;
	 		}
		else 
			{
			fdBmPower_value=10*log10((float)power_value);
			}
		fdBmPower_value-=last_fdBmPower_value;
		/*
		//=============
		switch(Range)
			{
		case RANGE1:
		fdBmPower_value-=50;//dBm
		break;
		case RANGE2:
		fdBmPower_value-=40;
		break;
		case RANGE3:
		fdBmPower_value-=30;
		break;
		case RANGE4:
		fdBmPower_value-=20;
		case RANGE5:
		fdBmPower_value-=10;
		break;
		default:break;
			}
		
		if(fdBmPower_value<=-10.00)
			{
			fdBmPower_value=(-1)*fdBmPower_value;
			dBmIsNeg=TRUE;
			ndBmPower_value=(unsigned int)(10*fdBmPower_value);
			point_pos=2;
			}
		else if(fdBmPower_value<0)
			{
			fdBmPower_value=(-1)*fdBmPower_value;
			dBmIsNeg=TRUE;
			ndBmPower_value=(unsigned long)(100*fdBmPower_value);
			point_pos=3;
			}
		else if((fdBmPower_value<50)&&(fdBmPower_value>=0))
			{
			dBmIsNeg=FALSE;
			ndBmPower_value=(unsigned long)(100*fdBmPower_value);
			point_pos=3;
			}
		//============
		
				
		*/
		switch(Range)
			{
			case RANGE1:			//负dBm
				fdBmPower_value-=50;//-20-30
				//得到要显示的值
				if(fdBmPower_value<-9.9999) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					ndBmPower_value=(unsigned int)(10*fdBmPower_value);
				point_pos=2;
					}
				else if(fdBmPower_value<0)
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					ndBmPower_value=(unsigned int)(100*fdBmPower_value);
					point_pos=3;
					}
				else {
					dBmIsNeg=FALSE;
					ndBmPower_value=(unsigned int)(100*fdBmPower_value);
					point_pos=3;
					}
				break;
			case RANGE2:		//负dBm
				fdBmPower_value-=40;//-10-30
				//得到要显示的值
				if(fdBmPower_value<-9.99999) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					ndBmPower_value=(unsigned int)(10*fdBmPower_value);
					point_pos=2;
					}
				else if(fdBmPower_value<0)
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					ndBmPower_value=(unsigned int)(100*fdBmPower_value);
					point_pos=3;
					}
				else if(fdBmPower_value>=0)
					{
					dBmIsNeg=FALSE;
					ndBmPower_value=(unsigned int)(100*fdBmPower_value);
					point_pos=3;
					}
				
				break;
			case RANGE3:
				fdBmPower_value-=30;//
				//得到要显示的值
				if(fdBmPower_value<0) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					}
				else dBmIsNeg=FALSE;
				ndBmPower_value=(unsigned int)(100*fdBmPower_value);
				point_pos=3;
				break;
			case RANGE4:
				fdBmPower_value-=20;//
				//得到要显示的值
				if(fdBmPower_value<0) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					}
				else dBmIsNeg=FALSE;
				ndBmPower_value=(unsigned int)(100*fdBmPower_value);
				point_pos=3;
				
				break;
			case RANGE5:
				fdBmPower_value-=10;//
				//得到要显示的值
				if(fdBmPower_value<0) 	
					{
					fdBmPower_value=(-1)*fdBmPower_value;
					dBmIsNeg=TRUE;
					}
				else dBmIsNeg=FALSE;
				
				ndBmPower_value=(unsigned int)(100*fdBmPower_value);
				point_pos=3;
				break;
			default:break;
			}

		if(dBmIsNeg==TRUE)
			{
			LED_dispNumber(ndBmPower_value+10000,point_pos);//10000为显示-
			}
		else {
			LED_dispNumber(ndBmPower_value,point_pos);
			}

		Light_LED(BULB_dBREF);
		}
	  }

	 
	  flag_10ms=FALSE;
	  
	 }
	
	K=getkey();
	if(K!=KEY_NULL) 
	{ 
	
	switch(K)
	{
	case KEY_ZERO:
		Mode=ZERO;
	break;
	case KEY_WATT_dBm:
		if(Mode==WATT) Mode=dBm;
		else if(Mode==dBm) Mode =WATT;
		else Mode=WATT;
	break;
	case KEY_dBREF:
		last_fPower_value=(float)power_value;
		last_fdBmPower_value=10*log10((float)power_value);
		switch(Range)
			{
		case RANGE1:
		last_fdBmPower_value-=50;//dBm
		break;
		case RANGE2:
		last_fdBmPower_value-=40;
		break;
		case RANGE3:
		last_fdBmPower_value-=30;
		break;
		case RANGE4:
		last_fdBmPower_value-=20;
		case RANGE5:
		last_fdBmPower_value-=10;
		break;
		default:break;
			}
		Mode=dBREF;
	break;
	default:break;
	}
	}
	//usart
	if(start_remote==FALSE)
		{
		if(Usart_getchar()==HEADER_R)
			{
			start_remote=TRUE;
			}
		}
	if(start_remote==TRUE)
		{
		command=Usart_getchar();
		if(command==TAIL1||command==TAIL2) start_remote=FALSE;
		else
			{
		switch(command&0XF0)
			{
			case CMD_REMOTE:
				pACK->header=HEADER_L;
				pACK->answer=CMD_REMOTE;
				pACK->valid=VALID;
				pACK->tail1=TAIL1;
				pACK->tail2=TAIL2;
				Usart_printf((unsigned char *) pACK, sizeof(ACK));
				
				break;
			case CMD_LOCAL:
				pACK->header=HEADER_L;
				pACK->answer=CMD_LOCAL;
				pACK->valid=VALID;
				pACK->tail1=TAIL1;
				pACK->tail2=TAIL2;
				Usart_printf((unsigned char *) pACK, sizeof(ACK));
				
				break;
			case CMD_SETBAUD:
				#asm("cli");
				if((command&0x0f)>0)
				{
				BAUD=(unsigned int)(command&0x0F)*2400;
				BAUD_SETTING=(unsigned int)((unsigned long)CRYSTAL/(8*(unsigned long)BAUD)-1);
				Usart_Init(BAUD_SETTING);
				}
				pACK->header=HEADER_L;
				pACK->answer=CMD_SETBAUD;
				pACK->valid=VALID;
				pACK->tail1=TAIL1;
				pACK->tail2=TAIL2;
				Usart_printf((unsigned char *) pACK, sizeof(ACK));
				
				#asm("sei");
				break;
			case CMD_ZERO:
				Mode=ZERO;
				
				pACK->header=HEADER_L;
				pACK->answer=CMD_ZERO;
				pACK->valid=VALID;
				pACK->tail1=TAIL1;
				pACK->tail2=TAIL2;
				Usart_printf((unsigned char *) pACK, sizeof(ACK));
				break;
			case CMD_WATT_OR_DB:

⌨️ 快捷键说明

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