📄 ad.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 + -