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

📄 ad.c

📁 ICETEK-LF2407-A板和教学实验箱使用说明书及开发板的所有实验例程
💻 C
字号:
#include "2407c.h"                    
#include "math.h"
#define ADCNUMBER 256

void interrupt gptime1(void);	/* 中断服务程序,用于设置保存标志 */
void ADInit(void);		/* 初始化A/D转换模块和通用定时器1 */

ioport unsigned char port0008;	/* I/O端口用于设置ICETEK-2407-A板上指示灯 */
unsigned int uWork,uWork1,nADCount,nLed,*pResult1,*pResult2;
int nNewConvert,nWork;
unsigned int nADCIn0[ADCNUMBER];	/* 存储区1,保存通道ADCIN0的转换结果,循环保存 */
unsigned int nADCIn1[ADCNUMBER];	/* 存储区2,保存通道ADCIN1的转换结果,循环保存 */
unsigned int nADCIn2[ADCNUMBER];
// for LCD control
#define LCDDELAY 1
#define LCDCMDTURNON 0x3f
#define LCDCMDTURNOFF 0x3e
#define LCDCMDSTARTLINE 0xc0
#define LCDCMDPAGE 0xb8
#define LCDCMDVERADDRESS 0x40
#define LCDLEFTPAGE 0
#define LCDRIGHTPAGE 1
#define LCDDATABYTE 1
#define LCDDATAWORD 2
#define STRINGREVERSE 1
#define STRINGNOREVERSE 0
#define T46uS		0x0d40
#define SCANCODE_0 0x70
#define SCANCODE_1 0x69
#define SCANCODE_2 0x72
#define SCANCODE_3 0x7A
#define SCANCODE_4 0x6B
#define SCANCODE_5 0x73
#define SCANCODE_6 0x74
#define SCANCODE_7 0x6C
#define SCANCODE_8 0x75
#define SCANCODE_9 0x7D
#define SCANCODE_Del 0x49
#define SCANCODE_Enter 0x5A
#define SCANCODE_Plus 0x79
#define SCANCODE_Minus 0x7B
#define SCANCODE_Mult 0x7C
#define SCANCODE_Divid 0x4A
#define SCANCODE_Num 0x77
#define SOUNDBUFFERLENGTH 128
void FFT(float dataR[128],float dataI[128]);
#define pi 3.1415926
#define X0_b 16
#define Y0_b 32
#define X0_t 16
#define Y0_t 16
void Delay(unsigned int nTime);		// 延时子程序
void TurnOnLCD();			// 打开显示
void LCDCLS();				// 清除屏幕显示内容
void Gpio_select(void);
void error(int);
void program_stop();
char ConvertScanToChar(unsigned char cScanCode);
void RefreshLEDArray();			// 刷新显示
void SetLEDArray(int nNumber);		// 修改显示内容
unsigned int uWork,bLCD,nScanCode,nMode,bShowAD;
int nModeAD;
unsigned int w[128];
float sin_tab[128],cos_tab[128];
float fDataR[128],fDataR1[128],fDataI[128];
interrupt void adc_isr(void);

int var1 = 0;
int var2 = 0;
int var3 = 0;
int test_count = 0;
int Test_flag = 0;
int Test_var  = 0;
int Test_status[32];
int jishu=0;
int jishu1=0;
unsigned int uPort8000;
int LoopCount;
int ConversionCount;
int Position;
int nBW=0;//常写0,写1是反写液晶屏。
unsigned char cKey,cOldKey;
int ad1,ad2;
unsigned int bBreak;
/*fir参数*/
#define PI 3.1415926
#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
/*低通滤波器系数可滤掉1k以上的波形,保留1k一下的波形*/
float fHn[FIRNUMBER]={
  -0.00124732,
-0.00085553,
-0.00000000,
 0.00234685,
 0.00725004,
 0.01548579,
 0.02724576,
 0.04195686,
 0.05827566,
 0.07427416,
 0.08778367,
 0.09682141,
 0.10000000,
 0.09682141,
 0.08778367,
 0.07427416,
 0.05827566,
 0.04195686,
 0.02724576,
 0.01548579,
 0.00725004,
 0.00234685,
-0.00000000,
-0.00085553,
-0.00124732
};
/*高通滤波器系数可滤掉1k以下的波形,保留1k以上的波形*/
float fLn[FIRNUMBER]={
-0.031,-0.021,-0.000,0.025, 0.047, 0.054,
 0.038, 0.000,-0.058,-0.126,-0.189,-0.233,
 1.000,-0.233,-0.189,-0.126,-0.058, 0.000,
 0.038, 0.054, 0.047, 0.025,-0.000,
-0.021,-0.031
};
float fXn[FIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
float fIn[256],fOut[256];
int nIn,nOut;
float FIR();
float FIR1();
float InputWave();
int j,a=0,nAD;
main()
{   
	asm(" CLRC 	SXM");	/* 清标志,关中断 */
	asm(" CLRC 	OVM");
	asm(" CLRC 	CNF");

	pResult1=RESULT0;
	pResult2=RESULT1;
	nNewConvert=0;
	
	*WDCR=0x6f;
	*WDKEY=0x5555;
	*WDKEY=0xaaaa;	/* 关闭看门狗中断 */
	*SCSR1=0x81fe;	/* 打开所有外设,设置时钟频率为40MHz */
	uWork=(*WSGR);	/* 设置I/O等待状态为0  */
	uWork&=0x0fe49;
	(*WSGR)=uWork;
	ADInit();	/* 初始化A/D相关设备 */

	*IMR=3;		/* 使能定时器中断 */
	*IFR=0xffff;	/* 清所有中断标志    */
	asm(" clrc INTM");	/* 开中断 */         
	while ( 1 )
	{
		if ( nNewConvert )	/* 如果保存标志置位,以下开始转换和保存转换结果 */
		{
			nNewConvert=0;		/* 清保存标志 */
			uWork=(*pResult1);	/* 取ADCINT0通道转换结果 */
			uWork>>=6;		/* 移位去掉低6位 */
			nADCIn0[nADCount]=uWork;/* 保存结果 */
			uWork=(*pResult2);	/* 取ADCINT1通道转换结果 */
			uWork>>=6;		/* 移位去掉低6位 */
			nADCIn1[nADCount]=uWork;/* 保存结果 */
			nADCount++;
			
			if ( nADCount>=ADCNUMBER )	/* 缓冲区满后设置指示灯闪烁 */
			{
				nADCount=0;             /* 中断位置 */
				nWork++;
				nOut=0;nIn=0;
				for ( nAD=0;nAD<256;nAD++ )
				{
							fInput=InputWave();
							fIn[nIn]=fInput;
							nIn++; 
							nIn%=256;
		                    fOutput=FIR();
		                    fOut[nOut]=fOutput;
		                    nADCIn2[nAD]=fOut[nOut]/3;
		                    nOut++;
		                    
				}
			}
		}
	}	
}               

void ADInit(void)       /* 初始化设置 */
{
	int i;

	for ( i=0;i<ADCNUMBER;i++ )	/* 缓冲区清0 */
		nADCIn0[i]=nADCIn1[i]=0;
	port0008=0;			/* 关指示灯 */
		
	*ADCTRL1= 0x2f40;	/* 设置连续转换模式 */
	*MAXCONV = 0x1;		/* 每次完成转换两个通道 */
	*CHSELSEQ1=0xc4;	/* 转换次序,先ADCIN0,再ADCIN1 */
	*ADCTRL2= 0x2000;    	/* 启动转换 */
	nADCount=nLed=nWork=0;
	;
	
				/* 以下设置通用定时器参数 */
	*EVAIMRA = 0x80;	/* 使能T1PINT */
	*EVAIFRA = 0xffff;	/* 清中断标志 */
	*GPTCONA = 0x0100;	
	*T1PR    = 2000;	/* 保存结果周期=1000*25ns=25us=40KHz */
	*T1CNT   = 0;		/* 计数器从0开始计数 */
	*T1CON   = 0x1040;	/* 连续增计数方式,启动计数器 */
	
}

void interrupt gptime1(void)
{
   uWork1=(*PIVR);
   switch ( uWork1 )
   {  
   		case 0x27:
   		{
			nNewConvert=1;	/* 设置保存标志 */
			(*EVAIFRA)=0x80;/* 清中断标志位 */
			port0008^=0x1;
   		   	break;
   		}
   }
}                       


float FIR()
{   
	float fSum;
	fSum=0;
	for ( j=0;j<FIRNUMBER;j++ )
	{
		fSum+=(fXn[j]*fHn[j]);
	}
	return(fSum);
}

float FIR1()
{   
	float fSum;
	fSum=0;
	for ( j=0;j<FIRNUMBER;j++ )
	{
		fSum+=(fXn[j]*fLn[j]);
	}
	return(fSum);
}

float InputWave()
{  int i;
	for ( i=FIRNUMBER-1;i>0;i-- )
		fXn[i]=fXn[i-1];
	fXn[0]=(nADCIn0[nAD]+nADCIn1[nAD])/2.0;
	return(fXn[0]);
}

⌨️ 快捷键说明

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