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

📄 main.c

📁 C8051F020的FFT程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Main.h"
#include "Lcd.h"
#include "Ad.h"
#include "Keyled.h"

#define POW_GATE 5       //门限
#define SamplRate 39800
#define pi 3.14159

sfr16 ADC0     = 0xbe;                 // ADC0 data

	/*
	int16(1024 * cos(n*pi/512)) n = 0:511
	*/
	int code COSMT[]={
		1024,1024,1024,1024,1024,1024,1023,1023,1023,1022,1022,1022,1021,1021,1020,1020,1019,1018,1018,1017,1016,1016,1015,1014,1013,1012,1011,1010,1009,1008,1007,
		1006,1004,1003,1002,1000,999,998,996,995,993,992,990,989,987,985,983,982,980,978,976,974,972,970,968,966,964,962,960,958,955,953,951,948,946,944,941,939,936,
		934,931,928,926,923,920,917,915,912,909,906,903,900,897,894,891,888,885,882,878,875,872,868,865,862,858,855,851,848,844,841,837,834,830,826,822,819,815,811,
		807,803,799,796,792,788,784,779,775,771,767,763,759,755,750,746,742,737,733,729,724,720,715,711,706,702,697,692,688,683,678,674,669,664,659,654,650,645,640,
		635,630,625,620,615,610,605,600,595,590,584,579,574,569,564,558,553,548,543,537,532,526,521,516,510,505,499,494,488,483,477,472,466,460,455,449,443,438,432,
		426,421,415,409,403,398,392,386,380,374,369,363,357,351,345,339,333,327,321,315,309,303,297,291,285,279,273,267,261,255,249,243,237,230,224,218,212,206,200,
		194,187,181,175,169,163,156,150,144,138,132,125,119,113,107,100,94,88,82,75,69,63,57,50,44,38,31,25,19,13,6,0,-6,-13,-19,-25,-31,-38,-44,-50,-57,-63,-69,-75,
		-82,-88,-94,-100,-107,-113,-119,-125,-132,-138,-144,-150,-156,-163,-169,-175,-181,-187,-194,-200,-206,-212,-218,-224,-230,-237,-243,-249,-255,-261,-267,-273,
		-279,-285,-291,-297,-303,-309,-315,-321,-327,-333,-339,-345,-351,-357,-363,-369,-374,-380,-386,-392,-398,-403,-409,-415,-421,-426,-432,-438,-443,-449,-455,
		-460,-466,-472,-477,-483,-488,-494,-499,-505,-510,-516,-521,-526,-532,-537,-543,-548,-553,-558,-564,-569,-574,-579,-584,-590,-595,-600,-605,-610,-615,-620,
		-625,-630,-635,-640,-645,-650,-654,-659,-664,-669,-674,-678,-683,-688,-692,-697,-702,-706,-711,-715,-720,-724,-729,-733,-737,-742,-746,-750,-755,-759,-763,
		-767,-771,-775,-779,-784,-788,-792,-796,-799,-803,-807,-811,-815,-819,-822,-826,-830,-834,-837,-841,-844,-848,-851,-855,-858,-862,-865,-868,-872,-875,-878,
		-882,-885,-888,-891,-894,-897,-900,-903,-906,-909,-912,-915,-917,-920,-923,-926,-928,-931,-934,-936,-939,-941,-944,-946,-948,-951,-953,-955,-958,-960,-962,
		-964,-966,-968,-970,-972,-974,-976,-978,-980,-982,-983,-985,-987,-989,-990,-992,-993,-995,-996,-998,-999,-1000,-1002,-1003,-1004,-1006,-1007,-1008,-1009,
		-1010,-1011,-1012,-1013,-1014,-1015,-1016,-1016,-1017,-1018,-1018,-1019,-1020,-1020,-1021,-1021,-1022,-1022,-1022,-1023,-1023,-1023,-1024,-1024,-1024,
		-1024,-1024
	};
	/*
	int16(1024 * sin(n*pi/1024)) n = 0:1023
	*/
	int code SINMT[]={
		0,3,6,9,13,16,19,22,25,28,31,35,38,41,44
		,47,50,53,57,60,63,66,69,72,75,78,82,85,
		88,91,94,97,100,103,107,110,113,116,119,
		122,125,128,132,135,138,141,144,147,150,
		153,156,160,163,166,169,172,175,178,181,
		184,187,191,194,197,200,203,206,209,212,
		215,218,221,224,227,230,234,237,240,243,
		246,249,252,255,258,261,264,267,270,273,
		276,279,282,285,288,291,294,297,300,303,
		306,309,312,315,318,321,324,327,330,333,
		336,339,342,345,348,351,354,357,360,363,
		366,369,371,374,377,380,383,386,389,392,
		395,398,401,403,406,409,412,415,418,421,
		424,426,429,432,435,438,441,443,446,449,
		452,455,458,460,463,466,469,472,474,477,
		480,483,485,488,491,494,497,499,502,505,
		507,510,513,516,518,521,524,526,529,532,
		535,537,540,543,545,548,550,553,556,558,
		561,564,566,569,572,574,577,579,582,584,
		587,590,592,595,597,600,602,605,607,610,
		613,615,618,620,623,625,628,630,632,635,
		637,640,642,645,647,650,652,654,657,659,
		662,664,666,669,671,674,676,678,681,683,
		685,688,690,692,695,697,699,702,704,706,
		708,711,713,715,717,720,722,724,726,729,
		731,733,735,737,739,742,744,746,748,750,
		752,755,757,759,761,763,765,767,769,771,
		773,775,777,779,782,784,786,788,790,792,
		794,796,798,799,801,803,805,807,809,811,
		813,815,817,819,821,822,824,826,828,830,
		832,834,835,837,839,841,843,844,846,848,
		850,851,853,855,857,858,860,862,863,865,
		867,868,870,872,873,875,877,878,880,882,
		883,885,886,888,889,891,893,894,896,897,
		899,900,902,903,905,906,907,909,910,912,
		913,915,916,917,919,920,922,923,924,926,
		927,928,930,931,932,934,935,936,937,939,
		940,941,942,944,945,946,947,948,950,951,
		952,953,954,955,957,958,959,960,961,962,
		963,964,965,966,967,968,969,970,971,972,
		973,974,975,976,977,978,979,980,981,982,
		983,983,984,985,986,987,988,989,989,990,
		991,992,993,993,994,995,996,996,997,998,
		998,999,1000,1000,1001,1002,1002,1003,1004,1004,1005,1006,1006,1007,1007,1008,
		1008,1009,1009,1010,1010,1011,1011,1012,1012,1013,1013,1014,1014,1015,1015,1016,
		1016,1016,1017,1017,1017,1018,1018,1018,1019,1019,1019,1020,1020,1020,1020,1021,
		1021,1021,1021,1022,1022,1022,1022,1022,1023,1023,1023,1023,1023,1023,1023,1024,
		1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,
		1024,1024,1024,1024,1023,1023,1023,1023,1023,1023,1023,1022,1022,1022,1022,1022,
		1021,1021,1021,1021,1020,1020,1020,1020,1019,1019,1019,1018,1018,1018,1017,1017,
		1017,1016,1016,1016,1015,1015,1014,1014,1013,1013,1012,1012,1011,1011,1010,1010,
		1009,1009,1008,1008,1007,1007,1006,1006,1005,1004,1004,1003,1002,1002,1001,1000,
		1000,999,998,998,997,996,996,995,994,993,993,992,991,990,989,989,988,987,986,985,
		984,983,983,982,981,980,979,978,977,976,975,974,973,972,971,970,969,968,967,966,
		965,964,963,962,961,960,959,958,957,955,954,953,952,951,950,948,947,946,945,944,
		942,941,940,939,937,936,935,934,932,931,930,928,927,926,924,923,922,920,919,917,
		916,915,913,912,910,909,907,906,905,903,902,900,899,897,896,894,893,891,889,888,
		886,885,883,882,880,878,877,875,873,872,870,868,867,865,863,862,860,858,857,855,
		853,851,850,848,846,844,843,841,839,837,835,834,832,830,828,826,824,822,821,819,
		817,815,813,811,809,807,805,803,801,799,798,796,794,792,790,788,786,784,782,779,
		777,775,773,771,769,767,765,763,761,759,757,755,752,750,748,746,744,742,739,737,
		735,733,731,729,726,724,722,720,717,715,713,711,708,706,704,702,699,697,695,692,
		690,688,685,683,681,678,676,674,671,669,666,664,662,659,657,654,652,650,647,645,
		642,640,637,635,632,630,628,625,623,620,618,615,613,610,607,605,602,600,597,595,
		592,590,587,584,582,579,577,574,572,569,566,564,561,558,556,553,550,548,545,543,
		540,537,535,532,529,526,524,521,518,516,513,510,507,505,502,499,497,494,491,488,
		485,483,480,477,474,472,469,466,463,460,458,455,452,449,446,443,441,438,435,432,
		429,426,424,421,418,415,412,409,406,403,401,398,395,392,389,386,383,380,377,374,
		371,369,366,363,360,357,354,351,348,345,342,339,336,333,330,327,324,321,318,315,
		312,309,306,303,300,297,294,291,288,285,282,279,276,273,270,267,264,261,258,255,
		252,249,246,243,240,237,234,230,227,224,221,218,215,212,209,206,203,200,197,194,
		191,187,184,181,178,175,172,169,166,163,160,156,153,150,147,144,141,138,135,132,
		128,125,122,119,116,113,110,107,103,100,97,94,91,88,85,82,78,75,72,69,66,63,60,57
		,53,50,47,44,41,38,35,31,28,25,22,19,16,13,9,6,3
	};
//----------------外部变量声明------------------
extern unsigned int AD_Index;//AD采样游标

//---------------内部函数声明
void SYSCLK_Init( void );//时钟初始化
void PORT_Init( void );  //配置端口
void Timer0_Init (void); //时钟0  
void Timer3_Init (void);  //采样定时

void StartANA(void);   //一次完整分析
void ReapeatDis_F(void);
void ReapeatDis_A(void);
// -------------------------------------FFT region---------------------------
struct compx          //复杂类型 中间计算用
{ 
	long int real;
	long int imag;
}compx ;

struct compx_S        //  简单类型
{ 
	int real;
	int imag;
}compx_S ;

struct compx_S EE(struct compx_S b1,struct compx b2);  //复数乘
void FFT(struct compx_S *xin,int N);			//FFT
void Change(struct compx_S *new,unsigned int T[]);		//变换 1024  ---》 2048
unsigned int xdata result[1024];					//FFT结果 功率值
unsigned int xdata result_LAST[1024];					//FFT结果 功率值 上一次
struct compx_S xdata signal[1025];     //s[1025] 为 求 共轭对称用 共存放了 2048 个有效点
void sort_S(unsigned int A[],int n,unsigned int DEX[]);//排序
unsigned int POW_Index[1024];      //排序后索引
unsigned int POW_Index_LAST[1024];      //排序后索引

//----------------全局变量声明------------------
tWord For1S = 400;   //400*2.5 = 1000 ms   PCA模块
tByte Count25ms = 10;  //延时功能模块
tByte KeyValue = 0;    //键值

unsigned char bdata State = 0x00; //系统状态

sbit IsDist = State^0;   //是否失真度
sbit FREQSel = State^1;  //0  为100HZ 1 为20HZ
sbit IsANA = State^2;    //这个5秒过程是否分析过 是否已经分析过
sbit IsHold = State^4;   //是否暂停显示      只有暂停显示的时候 可以参看原来的记录
sbit IsHDC = State^5;    //是否有直流分量
sbit ISNSCR = State^6;   //是否需要清平
sbit ISLast = State^7;   //是否显示的上一次的值

unsigned char SECEND = 0; //控制的时钟依据

unsigned char DispalyIndex; //显示游标
unsigned char DispalyIndex_OLD; //上一次的显示游标

unsigned long int POW_ALL; //总功率
unsigned long int POW_OTHER; //谐波功率

unsigned int FRANGE;      //失真度

void main(void)
{
	unsigned int i;
	WDTCN = 0xde;
	WDTCN = 0xad;           //关看门狗
	
	SYSCLK_Init();
	PORT_Init();
	Timer0_Init();
	Timer3_Init();
	ADC_Init();

	EA=1;					//开总中断
	

	//Init VALUE
	DispalyIndex = 0;
	DispalyIndex_OLD = 0;

	//Lcdmain();				//欢迎

	Hd7279_Init();
	Test7279(0);
	
	
	StartANA();

	_nop_();

	while(1)
	{
		if(IsDist)
		{
			StartANA();
			if(POW_Index[0] == 0)         //有直流分量
			{
				i = 2;
				IsHDC = 1;
			}
			else
			{
				i = 1;
				IsHDC = 0;
			}
			for(i; i < 25;i ++)
				POW_OTHER += result[i];
			
			FRANGE = POW_OTHER * 1000 / result[IsHDC];  //选择除
				
			ReapeatDis_F();
		}
		else
		{
			if(SECEND == 5)
			{
				SECEND = 0;
				IsANA = 0;  //又一个五秒开始
				if(!IsHold)
					ReapeatDis_A(); //显示
			}
			if((SECEND == 3) && (IsANA == 0))
			{
				IsANA = 1;
				if(!IsHold)         //这样暂停中将会不分析
					StartANA();
			}
			if(DispalyIndex_OLD != DispalyIndex)
			{
				DispalyIndex_OLD = DispalyIndex;
				ReapeatDis_A(); //显示
			}
		}
		//Delay25ms(5);
	}

}

void StartANA(void)
{
	unsigned int i;
	P30 = 0;
	
	/*-----------赋值给上一次----------*/
	for(i = 0;i < 1024; i ++)
	{
		result_LAST[i] = result[i];
		POW_Index_LAST[i] = POW_Index[i];
	}


	AD_Index = 0; //初始设为零



	ReadIn();


/*
	for(i=0;i < 2048; i = i + 2)
	{
		//signal[i/2].real = 4096 *  sin(pi*i / 2);       //偶数项      1024 时  相当于 1 V  4096 * 3 -- 14 位

		//signal[i/2].imag = 4096 *  sin(pi*(i+1) / 2);		//技术项

		signal[i/2].real = 4096   ;    //偶数项      1024 时  相当于 1 V  4096 * 3 -- 14 位

		signal[i/2].imag = - 4096;		//技术项
	}
*/	
	
	for(i = 0 ;i < 1024;i ++)
		POW_Index[i] = i;      //初始化索引表

	
	FFT(signal,501);          //RESULT --> signal
	

	Change(signal , result);			   //求功率
	sort_S(result , 1024 , POW_Index);     //排序
	P30 = 1;

	
}


//内部函数实现
void SYSCLK_Init( void )
{
   int i;                              
   OSCXCN = 0x67;                      // 打开外部22.1184MHz的晶体
   for (i=0; i < 256; i++) ;           
   while (!(OSCXCN & 0x80)) ;          // 等待外部晶体稳定
   OSCICN = 0x88;                      // 使用外部晶体作为系统时钟 是能始终丢失检测
                                       
//	OSCICN = 0x07;   				   //或者使用内部16MHz 精确度不高
}

void Timer0_Init (void)  //2.5ms         //定时运行程序的
{
   	CKCON|=0x8;
   	TMOD|=0x1;    	//16位
   	TR0 = 0;                         	
   	TH0 = (-SYSCLK/400) >> 8;    		// 2.5ms
   	TL0 = -SYSCLK/400;
   	TR0 = 1;   	//开始 Timer0
   	IE|= 0x2; 
}
void Timer3_Init (void)
{
	EIE2 |= 0x01;         //允许中断
	EIP2 |= 0x01;         //优先级升高

	TMR3CN  = 0x02;       //禁止中 CLK = SYSCLK

	TMR3RLL = -SYSCLK / SamplRate; 	
    TMR3RLH = (-SYSCLK / SamplRate) >> 8;

    TMR3H = (-SYSCLK / SamplRate) >> 8;   
    TMR3L = -SYSCLK / SamplRate;
}

void Timer3_ISR(void) interrupt 14
{
	TMR3CN &= (~0x80);  //清除中断标志
	AD0INT = 0;			//清除标志
	while (AD0INT == 0);

	if(AD_Index % 2)
		signal[AD_Index / 2].imag = ADC0;
	else

⌨️ 快捷键说明

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