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

📄 fft.c.svn-base

📁 单片机驱动32X64点阵资料
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
#include<STC12C5A60S2.H> 
#define uchar unsigned char
#define uint unsigned int  
#define  channel  0x00			  //设置AD通道为 P1.0
//----http://59tiaoba.taobao.com------------------qq:77554971-----------------------------------------------
#define ADC_POWER   (1<<7) 
#define ADC_SPEEDHH (0x03<<5) 
#define ADC_START   (1<<3) 
#define PADCH       (1<<5) 
#define ADC_FLAG    (1<<4) 

sbit  SDA_R=P0^7;	//下半屏红色数据
sbit  SDA_R_TOP=P0^4;//上半屏红色数据
sbit  SDA_G=P0^6;//下半屏绿色数据				
sbit  SDA_G_TOP=P0^5; 
sbit  STCP=P1^7;
sbit  SHCP=P1^6;

sbit resget=P2^0;			//时钟复位
sbit key_moda=P2^1;			//模式转换
sbit key_color=P2^2;			//时钟加
sbit key_Down=P2^3;			//时钟减
void Scan_Mode();
extern uchar byte_read(uint);
extern void sector_erase(uint);
extern void byte_program(uint, uchar);
uchar Mode=0;//模式
uchar color=0;
uchar Stop_time=0;
uchar stop=0;
uchar Move,Speed,linee;  //变量
uint zimuo;		                   //字模计数器
uchar BUFF[20];			           //缓存
uchar BUFF1[20];			           //缓存
uchar fractional_frequency=0;//分频
uchar code hanzi[];					    //汉字字模
uchar code hanzi1[];					    //汉字字模
uchar code sw[16]={0X00,0X08,0x04,0x0C,0X02,0X0A,0X06,0X0E,0X01,0X09,0X05,0X0D,0X03,0X0B,0X07,0X0F};/*16行段码*/
//---------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------
//放大128倍后的sin整数表(128)	
code char SIN_TAB[128] = { 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102, 

105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 

108, 105, 102, 98, 94, 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, 

-36, -42, -48, -54, -59, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, 

-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, 

-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6 };

//放大128倍后的cos整数表(128)
code char COS_TAB[128] = { 127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94, 

89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59, 

-65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -

126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80, 

-75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 

75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126 };

//采样存储序列表
code char LIST_TAB[128] = { 0, 64, 32, 96, 16, 80, 48, 112,
8, 72, 40, 104, 24, 88, 56, 120,
4, 68, 36, 100, 20, 84, 52, 116,
12, 76, 44, 108, 28, 92, 60, 124,
2, 66, 34, 98, 18, 82, 50, 114,
10, 74, 42, 106, 26, 90, 58, 122,
6, 70, 38, 102, 22, 86, 54, 118,
14, 78, 46, 110, 30, 94, 62, 126,
1, 65, 33, 97, 17, 81, 49, 113,
9, 73, 41, 105, 25, 89, 57, 121,
5, 69, 37, 101, 21, 85, 53, 117,
13, 77, 45, 109, 29, 93, 61, 125,
3, 67, 35, 99, 19, 83, 51, 115,
11, 75, 43, 107, 27, 91, 59, 123,
7, 71, 39, 103, 23, 87, 55, 119,
15, 79, 47, 111, 31, 95, 63, 127};


uchar COUNT=15,COUNT1=0,ADC_Count=0,LINE=15,G,T;
uchar i,j,k,b,p;                 
int Temp_Real,Temp_Imag,temp;                // 中间临时变量  
uint TEMP1;
uchar PWM;	
int xdata Fft_Real[128]; 
int xdata Fft_Image[128];               // fft的虚部 
uchar xdata LED_TAB2[64];				//记录 漂浮物 是否需要 停顿一下
uchar xdata LED_TAB[64];				//记录红色柱状 
uchar xdata LED_TAB1[64];				//记录 漂浮点
void show_start();
void DelayMs(void);
/*------------------------------------------------
                    发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
 	SBUF = dat;
 	while(!TI);
      TI = 0;
}
/*------------------------------------------------
                    发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
 	while(*s!='\0')// \0 表示字符串结束标志,
                //通过检测是否字符串末尾
  	{
  		SendByte(*s);
  		s++;
 	}
}

void FFT()
{     
	//uchar x;              
    for( i=1; i<=7; i++)                            /* for(1) */
    { 
        b=1;
        b <<=(i-1);                                       //碟式运算,用于计算 隔多少行计算 例如 第一极 1和2行计算,,第二级 
        for( j=0; j<=b-1; j++)                              /* for (2) */
        { 
            p=1;
            p <<= (7-i);            
            p = p*j;
            for( k=j; k<128; k=k+2*b)                /* for (3) 基二fft */
            { 
                Temp_Real = Fft_Real[k]; 
				Temp_Imag = Fft_Image[k]; 
				temp = Fft_Real[k+b];
                Fft_Real[k] = Fft_Real[k] + ((Fft_Real[k+b]*COS_TAB[p])>>7) + ((Fft_Image[k+b]*SIN_TAB[p])>>7);
                Fft_Image[k] = Fft_Image[k] - ((Fft_Real[k+b]*SIN_TAB[p])>>7) + ((Fft_Image[k+b]*COS_TAB[p])>>7);
                Fft_Real[k+b] = Temp_Real - ((Fft_Real[k+b]*COS_TAB[p])>>7) - ((Fft_Image[k+b]*SIN_TAB[p])>>7);
                Fft_Image[k+b] = Temp_Imag + ((temp*SIN_TAB[p])>>7) - ((Fft_Image[k+b]*COS_TAB[p])>>7);     
                // 移位.防止溢出. 结果已经是本值的 1/64               
              	Fft_Real[k] >>= 1;             
                Fft_Image[k] >>= 1; 
               	Fft_Real[k+b]  >>= 1;                 
                Fft_Image[k+b]  >>= 1; 
                                                                               
            }     
        } 
    } 
	Fft_Real[0]=Fft_Image[0]=0;		  //去掉直流分量
	//Fft_Real[63]=Fft_Image[63]=0;
    for(j=0;j<fractional_frequency;j++)											 
	{
		TEMP1=((((Fft_Real[j]* Fft_Real[j]))+((Fft_Image[j]*Fft_Image[j]))));//求功率
	
        if(TEMP1<4)
			TEMP1=0;
        else if(TEMP1<9)
			TEMP1=1;
        else if(TEMP1<16)
			TEMP1=2;
        else if(TEMP1<25)
			TEMP1=3;
        else if(TEMP1<36)
			TEMP1=4;
        else if(TEMP1<49)
			TEMP1=5;
        else if(TEMP1<64)
			TEMP1=6;
        else if(TEMP1<81)
			TEMP1=7;
        else if(TEMP1<100)
			TEMP1=8;
        else if(TEMP1<121)
			TEMP1=9;
        else if(TEMP1<144)
			TEMP1=10;
        else if(TEMP1<169)
			TEMP1=11;
        else if(TEMP1<196)
			TEMP1=12;
        else if(TEMP1<225)
			TEMP1=13;
        else if(TEMP1<256)
			TEMP1=14;
        else if(TEMP1<289)
			TEMP1=15;
        else if(TEMP1<324)
			TEMP1=16;
        else if(TEMP1<361)
			TEMP1=17;
        else if(TEMP1<400)
			TEMP1=18;
        else if(TEMP1<441)
			TEMP1=19;
        else if(TEMP1<484)
			TEMP1=20;
        else if(TEMP1<529)
			TEMP1=21;
        else if(TEMP1<576)
			TEMP1=22;
        else if(TEMP1<625)
			TEMP1=23 ;
        else if(TEMP1<676)
			TEMP1=24;
        else if(TEMP1<729)
			TEMP1=25;
        else if(TEMP1<784)
			TEMP1=26;
        else if(TEMP1<841)
			TEMP1=27;
        else if(TEMP1<900)
			TEMP1=28;
        else if(TEMP1<961)
			TEMP1=29;
        else if(TEMP1<1024)
			TEMP1=30;
        else 
			TEMP1=31;
	
	    if(TEMP1>(LED_TAB[j]))
			LED_TAB[j]=TEMP1;        
        if(TEMP1>(LED_TAB1[j]))
        {   
			LED_TAB1[j]=TEMP1;
            LED_TAB2[j]=12;  //12                                              //提顿速度=12
        }
	}
	/*x=((((Fft_Real[1]* Fft_Real[1]))+((Fft_Image[1]*Fft_Image[1])))>>5);
	for(j=0;j<fractional_frequency;j++)											 
	{																			  
		TEMP1=((((Fft_Real[j+1]* Fft_Real[j+1]))+((Fft_Image[j+1]*Fft_Image[j+1])))>>1);//求功率
		if(TEMP1>1)
			TEMP1--;
		else 
			TEMP1=0;
		if(TEMP1>31)
			TEMP1=31; 
		if(TEMP1>(LED_TAB[j]))
			LED_TAB[j]=TEMP1;	
		if(TEMP1>(LED_TAB1[j]))
		{   
			LED_TAB1[j]=TEMP1;
			LED_TAB2[j]=14;						//提顿速度=12
		}
	}*/   
    
}
void delay3ms(void)   //误差 -0.399999999834us
{
	unsigned char b,c;
	for(c=197;c>0;c--)
		for(b=24;b>0;b--);
			
}

void Init()
{  
	SCON = 0x50;
    //TMOD|= 0x20;
	BRT	   = 0xfb;  //0xfb: 18.432MHz,12T,SMOD=0,9600bps
	AUXR   |= 0x11;	// 使用独立波特率发生器
   	/* TH1  = 0xFB;
    TL1  = 0xFB;
    TR1  = 1; */
   	// ES   = 1;       //允許串口中斷
   	// PS = 1;         //"串行中断优先"
   	// PSH;
/*	CMOD=0X02;	  
	CL=0X00;
	CH=0X00;
 
	CCAPM0=0X42; //8位PWM输出
	CCAP0L=0x05;	 //C0
    CCAP0H=0x05;
	//CR=1;		   */
//-----------------------------------------------------------------------------------
     P1ASF = 0x01;                 //0000,0010, 将 P1.1 置成模拟口
	 P1M0 = 0x01;                				//0000,0001用于A/D转换的P1.x口,先设为开漏
	 P1M1 = 0x01;                				//0000,0001 P1.0先设为开漏。断开内部上拉电阻
    
     AUXR1 &=0xFB;                 //1111,1011, 令 ADRJ=0
	 
	 EADC=1;					   //AD中断打开
	 ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | channel;
				   //1110 1001   1打开 A/D (ADC_POWER)转换电源;11速度为70周期一次;
	    		   //0中断标志清零;1启动adc(ADC_START);001AD通道打开(这里为P1.1);
	
	SendByte(0x55);
	SendStr("32*64点阵频谱显示");
	//	delay3s();
 	show_start();
	//-----------------------------------------------------------------------------------
	//P1M0=P1M1=1;
	P2M0=1;
	TMOD=0X12;					   
	TH0=0xb0;      //                           				  
	TL0=0xb0;
	TH1=0xEE;												   
	TL1=0XC0;
	ET0=1;					       //定时器0 打开
	TR0=0;					   	   //关闭定时器
	ET1=1;
	TR1=1;
	PT1=0;
	PT0=1;
	IPH=PADCH;
	IP=PADC;						  //中断优先级
	EA=1;							//总中断打开 
/*******读取设置************************/
	Mode=byte_read(0);	  //上电从EEP读取模式  0 16分频 1 64分频
	Scan_Mode();
	color=byte_read(0X200);//上电从EEP读取颜色  0 红色柱状 绿色浮点    1 绿色柱状 红色浮点
	if(color>1)
		color=0;
}

/***********************发送移动的数据****************************/
void rxd_data(void)		            //串行发送数据
{
  	uchar s;
  	uchar inc,temp,k,temp1;
  
  	if(Move<8)
    	inc=0;
  	else 
    	inc=1;

⌨️ 快捷键说明

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