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

📄 signalmain.c

📁 61半做信号发生器
💻 C
字号:
/**************************************************************************/
/********			Signal Sourse         *********************************/
/*	Capable to output Sin, Square,and Triangular Wave Form
/*	IOB0-5 For Rotator Key1,Key2
/*	IOB2 As Ext1(Rising Edge) For PhaseA of Key1,IOB1 For PhaseB Of Key1,IOB0 For Key Of Key1
/*  IOB3 AS EXt2(Rising Edge) For PhaseA of Key2,IOB4 For PhaseB Of Key2,IOB5 For Key Of Key2
/*	IOB14 As CLK,IOB15 As Data For LCD
/*  IOB6 As BackLight Switch For LCD
/*	IOB9 As FSYNC,IOB10 As SCLK,IOB11 As SDATA,IOB12 As RESET,
/*	IOB13 As MCLK Select For AD9834,Low as 20M,High as 1M

/*************************************************************************/
#include "SPCE061.h"
#include "math.h"
/*************************************************************************/
#define DDS_CONTROL_LOW_WRITE		0x0000
#define DDS_CONTROL_HIGH_WRITE		0x1000
#define DDS_CONTROL_SIN				0x0000
#define DDS_CONTROL_TRIANGULAR		0x0002
#define DDS_CONTROL_SQUARE			0x0028

#define FREQUENCY_COEFFICIENT_1M		268.435456
#define FREQUENCY_COEFFICIENT_20M		13.4217728
#define CRYSTAL_1M_SELECT				*P_IOB_Data|=0x2000
#define CRYSTAL_20M_SELECT				*P_IOB_Data&=0xdfff

#define	FSYNC_SET			*P_IOB_Data|=0x0200
#define FSYNC_CLEAR			*P_IOB_Data&=0xfdff
#define SCLK_SET			*P_IOB_Data|=0x0400
#define SCLK_CLEAR			*P_IOB_Data&=0xfbff
#define DATA_SET			*P_IOB_Data|=0x0800
#define DATA_CLEAR			*P_IOB_Data&=0xf7ff
#define RESET_ON			*P_IOB_Data|=0x1000;
#define RESET_OFF			*P_IOB_Data&=0xefff;
/**************************************************************************/
/*	Overall Varibles Declearation *****************************************/
int Function=0;             // 0:WaveForm,1:HZ/KHZ,2:0.1f,3:1f,4:100f,5:10000f,6:0.1V,7:1V
int WaveForm=0;				//	0 As Sine Wave;	1 As Triangle Wave;	2 As Square Wave

int AmplitudeFrac=0;		// Fractional part of Frequency
int AmplitudeOne=5;			//	Integer part of Amplitude
double AmplitudeDB;			//	float fromat Amplitude
int AmplitudeDA;

int FrequencyRange=1;		//	0 As 1HZ-1KHZ;	2 As 1KHZ-2MHZ
int CrystalSelect=1;		// 	0 As 1MHZ;	1 As 20MHZ
int FrequencyFrac=0;		//  Fractional part of Frequency
int FrequencyOne=20;			//  0-99 part of Frequency
int FrequencyHundred=0;	//100-9900 part of Frequency
double  Frequency;		//  float format Frequency
long int FrequencyRegister;	//  Data Write into DDS

/* */
int WaveFormString[3][5]={{"正弦"},{"三角"},{"方波"}};
int FrequencyRangeString[2][3]={{"HZ"},{"K "}};
int FunctionPosition[7]={0x96,0x8f,0x8d,0x8c,0x8b,0x9d,0x9c};
/**************************************************************************/
/*	Sub Function Declearaiton */
/*DDS*/
void DDSInit(void);
void WordWriteDDS(int WordToWrite);
void FrequencyUpdate(void);
void WaveFormUpdate(void);
/*VGA*/
void DACInit(void);
void AmplitudeUpdate(void);
/*LCD*/
void lcd_init_usual(void);
void set_position(int position);
void chinese_series(int *series);
void code_write(int code);
void data_write(int data);

void DisplayInit(void);

/*Key */
void KeyInit(void);
void KeyIncreaseProsses(void);
void KeyDecreaseProsses(void);
/*Data Transform*/
int int_to_series(unsigned int data);
 
/**************************************************************************/
/*	Main Function	*/
void main(void)
{
	KeyInit();
	DisplayInit();
	DDSInit();
	DACInit();
	FrequencyUpdate();
	AmplitudeUpdate();
	__asm("IRQ ON");
	while(1)
	{
		*P_Watchdog_Clear=1;
    //	WordWriteDDS(DDS_CONTROL_WORD);
	}
}

/**************************************************************************/
/*	Interrupt Service	*/
void IRQ3(void)__attribute__((ISR));
void IRQ3(void)
{
	int i=*P_INT_Ctrl;
	__asm("IRQ OFF");
	if(*P_INT_Ctrl&0x0200)			//Ex2 for KeyFunction
	{
		*P_INT_Clear|=0x0200;
		if(*P_IOB_Data&0x0010)
		{
			Function++;
			if(Function>6)
			{
				Function=0;
			}
		}
		else
		{		
			Function--;
			if(Function<0)
			{
				Function=6;
			}
		}
	    code_write(FunctionPosition[Function]);	//Refresh disp
	}
	if(*P_INT_Ctrl&0x0100)			//Ex1 For KeySet
	{
		*P_INT_Clear|=0x0100;
		if(*P_IOB_Data&0x0002)
		{
			KeyDecreaseProsses();
		}
		else
		{
			KeyIncreaseProsses();
		}
	}
	*P_INT_Clear|=0x0300;
	__asm("IRQ ON");
}
/**************************************************************************/
/*	Sub Function Zone	*/
void KeyInit(void)
{
	*P_IOB_Data|=0x003f;
	*P_IOB_Attrib|=0x003f;
	*P_IOB_Dir&=0xffc0;			 //Set IOB0-5 As High-Pulled Input
	
	*P_INT_Ctrl|=0x0300;			//Open Ext1 and Ext2;
}
/**/
void KeyIncreaseProsses(void)
{
	switch(Function)
	{
		case 0:		//WaveForm Change
			WaveForm++;
			if(WaveForm>2)
			{
				WaveForm=0;
			}
			WaveFormUpdate();
			code_write(0x94);		//set position
			chinese_series(WaveFormString[WaveForm]); //Refresh WaveForm Disp
			break;
		case 1:		//Frequency Range Change
			FrequencyRange++;
			if(FrequencyRange>1)
			{
				FrequencyRange=0;
			}
			FrequencyUpdate();
			chinese_series(FrequencyRangeString[FrequencyRange]);
			code_write(0x8f);
			break;
		case 2:		//Frequency Frac increase
			FrequencyFrac++;
			if(FrequencyFrac>9)
			{
				FrequencyFrac=0;
			}
			FrequencyUpdate();
			data_write('.');
			data_write(FrequencyFrac+0x30);
			code_write(0x8d);
			break;
		case 3:		//Frequency one-99 part
			FrequencyOne++;
			if(FrequencyOne>99)
			{
				FrequencyOne=0;
			}
			FrequencyUpdate();
			data_write(FrequencyOne/10+0x30);
			data_write(FrequencyOne%10+0x30);
			code_write(0x8c);
	        break;
		case 4:		//Frequency 100-9900 part
			FrequencyHundred++;
			if(FrequencyHundred>99)
			{
				FrequencyHundred=0;
			}
			FrequencyUpdate();
			data_write(FrequencyHundred/10+0x30);
			data_write(FrequencyHundred%10+0x30);
			code_write(0x8b);
	        break;	
	    case 5:		//Amplitude Fractional part
	    	AmplitudeFrac++;
	    	if(AmplitudeFrac>9)
	    	{
	    		AmplitudeFrac=0;
	    	}
	    	AmplitudeUpdate();
	    	data_write('.');
	    	data_write(AmplitudeFrac+0x30);
	    	code_write(0x9d);
	    	break;
	    case 6:		//Amplitude Integer part
	    	AmplitudeOne++;
	    	if(AmplitudeOne>5)
	    	{
	    		AmplitudeOne=0;
	    	}
	    	AmplitudeUpdate();
	    	data_write(' ');
	    	data_write(AmplitudeOne+0x30);
	    	code_write(0x9c);
	    	break;
		default:break;
	}//switch(Function)
}
/**/
void KeyDecreaseProsses(void)
{
	switch(Function)
	{
		case 0:		//WaveForm Change
			WaveForm--;
			if(WaveForm<0)
			{
				WaveForm=2;
			}
			WaveFormUpdate();
			code_write(0x94);		//set position
			chinese_series(WaveFormString[WaveForm]); //Refresh WaveForm Disp
			break;
		case 1:		//Frequency Range Change
			FrequencyRange--;
			if(FrequencyRange<0)
			{
				FrequencyRange=1;
			}
			FrequencyUpdate();
			chinese_series(FrequencyRangeString[FrequencyRange]);
			code_write(0x8f);
			break;
		case 2:		//Frequency Frac increase
			FrequencyFrac--;
			if(FrequencyFrac<0)
			{
				FrequencyFrac=9;
			}
			FrequencyUpdate();
			data_write('.');
			data_write(FrequencyFrac+0x30);
			code_write(0x8d);
			break;
		case 3:		//Frequency one-99 part
			FrequencyOne--;
			if(FrequencyOne<0)
			{
				FrequencyOne=99;
			}
			FrequencyUpdate();
			data_write(FrequencyOne/10+0x30);
			data_write(FrequencyOne%10+0x30);
			code_write(0x8c);
	        break;
		case 4:		//Frequency 100-9900 part
			FrequencyHundred--;
			if(FrequencyHundred<0)
			{
				FrequencyHundred=99;
			}
			FrequencyUpdate();
			data_write(FrequencyHundred/10+0x30);
			data_write(FrequencyHundred%10+0x30);
			code_write(0x8b);
	        break;	
	    case 5:		//Amplitude Fractional part
	    	AmplitudeFrac--;
	    	if(AmplitudeFrac<0)
	    	{
	    		AmplitudeFrac=9;
	    	}
	    	AmplitudeUpdate();
	    	data_write('.');
	    	data_write(AmplitudeFrac+0x30);
	    	code_write(0x9d);
	    	break;
	    case 6:		//Amplitude Integer part
	    	AmplitudeOne--;
	    	if(AmplitudeOne<0)
	    	{
	    		AmplitudeOne=5;
	    	}
	    	AmplitudeUpdate();
	    	data_write(' ');
	    	data_write(AmplitudeOne+0x30);
	    	code_write(0x9c);
	    	break;
		default:break;
	}//switch(Function)
}
/*******************************/
void DisplayInit(void)
{
	lcd_init_usual();
	chinese_series(" Signal Sourse");
	code_write(0x90);				//Line 2
	chinese_series("波型: 正弦");
	code_write(0x88);
	chinese_series("频率: 0020.0  K");
	code_write(0x98);
	chinese_series("峰峰值:  5.0  V");
	code_write(0x96);
}
/*******************************/
/*******************************/
void DACInit(void)				//Init DAC
{
	*P_DAC_Ctrl=0x00;
	*P_ADC_Ctrl&=0xffbf;		//3.3mA
	//*P_ADC_Ctrl|=0x0040;
}
/*******************************/
void DDSInit(void)
{
	*P_IOB_Data&=0xc1ff;
	*P_IOB_Data|=0x1600;
	*P_IOB_Attrib|=0x3e00;
	*P_IOB_Dir|=0x3e00;          //Set IOB9-13 For DDS
}
/*******************************/
void WordWriteDDS(int WordToWrite)
{
	int i;
	SCLK_SET;
	FSYNC_CLEAR;
	for(i=0;i<16;i++)
	{
		SCLK_SET;
		if(WordToWrite&0x8000)
		{
			DATA_SET;
		}
		else
		{
			DATA_CLEAR;
		}
		SCLK_CLEAR;
		WordToWrite<<=1;
	}
	FSYNC_SET;
	SCLK_SET;
}
/******************************/
void FrequencyUpdate(void)
{
	int FrequencyLow,FrequencyHigh;
	Frequency=FrequencyFrac/10+FrequencyOne+FrequencyHundred*100;
	
	if(FrequencyRange==1)
	{
		Frequency*=1000;
	}
	
	if(Frequency<5000)
	{
		CRYSTAL_1M_SELECT;
		FrequencyRegister=Frequency*FREQUENCY_COEFFICIENT_1M;
	}
	else
	{
		CRYSTAL_20M_SELECT;
		FrequencyRegister=Frequency*FREQUENCY_COEFFICIENT_20M;
	}
	FrequencyLow=(FrequencyRegister&0x3fff)|0x4000;
	FrequencyHigh=((FrequencyRegister>>14)&0x3fff)|0x4000;
	
	WordWriteDDS(DDS_CONTROL_LOW_WRITE);
	WordWriteDDS(FrequencyLow);	
	WordWriteDDS(DDS_CONTROL_HIGH_WRITE);
	WordWriteDDS(FrequencyHigh);

	WaveFormUpdate();	
}
/******************************/
void WaveFormUpdate(void)
{
	if(WaveForm==0)
	{
		WordWriteDDS(DDS_CONTROL_SIN);
	}
	if(WaveForm==1)
	{
		WordWriteDDS(DDS_CONTROL_TRIANGULAR);
	}
	if(WaveForm==2)
	{
		WordWriteDDS(DDS_CONTROL_SQUARE);
	}
}
/******************************/
void AmplitudeUpdate(void)
{
	AmplitudeDB=20*log10(AmplitudeFrac+AmplitudeOne*10);
	if(Frequency>500000)
	{
		
	}
	AmplitudeDA=1024*(AmplitudeDB/40);
	*P_DAC2=AmplitudeDA<<6;
}
/******************************/

⌨️ 快捷键说明

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