欢迎光临~啄木鸟电子科技

软件设计

软件:FFT 算i法



#include <stc12c5a60s2.h>//"stc12c5620ad.h"
#include<intrins.h>
#define LongToBin(n) (((n>>21)&0x80)|((n>>18)&0x40)|((n>>15)&0x20)|((n>>12)&0x10)|((n>>9)&0x08)|((n>>6)&0x04)|((n>>3)&0x02)|((n)&0x01))
#define BIN(n) LongToBin(0x##n##)
#define uchar  unsigned char
#define uint  unsigned int
#define SAMPLE_NUM 64
#define NUM_2_LOG 6
#define FFT_OUT_MIN 1
#define FFT_OUT_MAX	11
uchar code BRTable[SAMPLE_NUM] ={
 0, 32, 16, 48, 8, 40, 24, 56,4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 
 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57,5, 37, 21, 53, 13, 45, 
 29, 61,3, 35, 19, 51, 11, 43, 27, 59,7, 39, 23, 55, 15, 47, 31, 63};
char code sin_tabb[SAMPLE_NUM] = {
 0 ,12 ,25 ,37 ,49 ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 ,127 ,126 ,125 ,
 122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,0 ,-12 ,-25 ,-37 ,-49 ,-60 ,
 -71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,-127 ,-126 ,-125 ,-122 ,-117 
 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12  }; 
                                  
char code cos_tabb[SAMPLE_NUM] = {
127 ,126 ,125 ,122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,0 ,-12 ,-25 ,
-37 ,-49 ,-60 ,-71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,-127 ,-126 ,-125 ,
-122 ,-117 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12 ,0 ,12 ,25 ,37 ,49 
,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 };
uchar a[64];
uchar keep,keepnum,anum,timernum,timernum2,lednum3,Ltime;//用于分离

/*加入数组用于显示相应led灯数目*/
uchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制

int xdata FftReal[SAMPLE_NUM];
int xdata FftImage[SAMPLE_NUM];

xdata unsigned char num[128];
xdata unsigned char temp[128];

sbit p37=P3^7;
sbit p36=P3^6;
sbit p35=P3^5;
sbit p34=P3^4;

sbit p07=P0^7;
sbit p06=P0^6;
sbit p05=P0^5;
sbit p04=P0^4;
sbit p03=P0^3;
sbit p02=P0^2;
sbit p01=P0^1;
sbit p00=P0^0;

sbit p27=P2^7;
sbit p26=P2^6;
sbit p25=P2^5;
sbit p24=P2^4;
sbit p23=P2^3;
sbit p22=P2^2;
sbit p21=P2^1;
sbit p20=P2^0;

sbit key=P3^3;
sbit zh=P3^0;

void delay(unsigned char a)
{ 
	unsigned int i;
	while(--a)
		for(i=0;i<50;i++);  				   
}
void timerinit()//定时器 初始化函数
{
	 TMOD=0x11;
	 TH0=(65536-2048)/256;
	 TL0=(65536-2048)%256;

	 TH1=(65536-50000)/256;
	 TL1=(65536-50000)%256;

	 EA=1;
	 ET0=1;
	 TR0=1;

	 ET1=0;
	 TR1=0;
}

void FFT_process()			  //下落迟滞
{
	unsigned char i;
	for(i=0;i<14;i++)
	{	
		if(a[i] < temp[i])
		{
			num[i]++;
			if(num[i] == 1)
			{
				if(temp[0]==0&&temp[1]==0&&temp[2]==0&&temp[3]==0&&temp[4]==0&&temp[5]==0&&temp[6]==0&&temp[7]==0&&temp[8]==0&&temp[9]==0&&temp[10]==0&&temp[11]==0&&temp[12]==0&&temp[13]==0);
				else
				{
					a[i] = --temp[i];
					num[i] = 0;
				}
			}
		}
		else num[i] = 0;		
	}
}

void disp()
{
	timernum++;
	if(timernum==15) timernum=1;
	P2=0x00;//显示前先关闭

	p37=1;
	p36=1;
	p35=1;
	p34=1;

	P0=0Xff;
	FFT_process();
	switch(timernum)
	{
		case 1:anum=a[0];break;//
		case 2:anum=a[1];break;//
		case 3:anum=a[2];p37=0;break;
		case 4:anum=a[3];p36=0;break;
		case 5:anum=a[4];p35=0;break;
		case 6:anum=a[5];p34=0;break;
		case 7:anum=a[6];p07=0;break;
		case 8:anum=a[7];p06=0;break;
		case 9:anum=a[8];p05=0;break;
		case 10:anum=a[9];p04=0;break;
		case 11:anum=a[10];p03=0;break;
		case 12:anum=a[11];p02=0;break;//
		case 13:anum=a[12];p01=0;break;//
		case 14:anum=a[13];p00=0;break;//
	}
	P2=lednum[anum];
	delay(2);
}

uchar STC_ADC()		   //!!根据数据手册写一个ad读取函数
{												 
     uchar i;
     ADC_RES   = 0;
     ADC_RESL  = 0;
	 ADC_CONTR = BIN(10001000);
	 i=3;
     while(i--);
     while (1)                      
     {
         if (ADC_CONTR & BIN(10000))       
     	 { 
  	  		 break;
  	 	 }
     }
     ADC_CONTR = BIN(10000000);
  	 return( ADC_RESL<<2) ;
}
short sqrt_16( unsigned long M)   
{
    unsigned int N, i;
    unsigned long tmp, ttp; 
    if( M == 0 )             
        return 0;
    
    N = 0;
    
    tmp = ( M >> 30 );        
    M <<= 2;
    if( tmp > 1 )            
    {
        N ++;               
        tmp -= N;
    }
    
    for( i=15; i>0; i-- )   
    {
        N <<= 1;           
        
        tmp <<= 2;
        tmp += (M >> 30);  
        
        ttp = N;
        ttp = (ttp<<1)+1;
        
        M <<= 2;
        if( tmp >= ttp )    
        {
            tmp -= ttp;
            N ++;
        }       
    }
    
    return N;
}
void FFT()
{
	register    uchar i,bb,j,k,p,max;
	register short TR,TI,temp;
    unsigned long ulReal;                             
    unsigned long ulImage;   
                                                                 
	for(i=0; i<SAMPLE_NUM;i++)	  //此处可以加入自动增益
	{
		FftReal[BRTable[i]] = STC_ADC();//使显示保持在一定范围内
        FftImage[i] = 0;		
	} 
    
    for( i=1; i<=NUM_2_LOG; i++)                          
    { 
        bb=1;
        bb <<= (i-1);                                      
        for( j=0; j<=bb-1; j++)                            
        { 
            p=1;
            p <<= (NUM_2_LOG-i);            
            p = p*j;
            for( k=j; k<SAMPLE_NUM; k=k+2*bb)               
            { 
                TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];
                FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
                FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);
                FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);
                FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7); 
                
                FftReal[k]  >>= 1;             
                FftImage[k]  >>= 1; 
                FftReal[k+bb]  >>= 1;                 
                FftImage[k+bb]  >>= 1;                                                                 
            }  
        }
    }
	max=0;
    for( i=0; i<14; i++)
    {  
        ulReal = FftReal[i+1];
        ulReal *= ulReal;
        ulImage = FftImage[i+1];
        ulImage *= ulImage;
        
        a[i] = sqrt_16( ulReal + ulImage );   //修改
                         
        if( a[i] < FFT_OUT_MIN ) //    
            a[i] = 0;//修改
        else
          a[i] = a[i]-FFT_OUT_MIN;    
		  
        if( a[i] >max)
             max =a[i];		                 
    }

    if(max>8) //11
    {
       max/=8;	
        for( i=0; i<14; i++) //输出a的5个分离数值
        {      
             a[i]/=max;
        }  
    }
}             

void dh1()
{
	P0=0XF7;
	P2=0X3C;	
	delay(10);

	P0=0XEF;
	P2=0X7E;	
	delay(10);

	P0=0XDF;
	P2=0X3F;	
	delay(10);

	P0=0XBF;
	P2=0X7E;	
	delay(10);

	P0=0X7F;
	P2=0X3C;	
	delay(10);
}

void dh2()
{
	P3=0XFF;

	P0=0XFD;//P01
	P2=0XFF;	
	delay(10);

	P0=0XFB;//P02
	P2=0X01;	
	delay(10);

	P0=0XF7;//P03
	P2=0XFF;	
	delay(10);

	P0=0XEF;//P04
	P2=0X00;	
	delay(10);

	P0=0XDF;//P05
	P2=0X01;	
	delay(10);

	P0=0XBF;//P06
	P2=0X01;	
	delay(10);

	P0=0X7F;//P07
	P2=0XFF;	
	delay(10);

	P0=0XFF;
	P3=0XFF;//P34
	P2=0X00;	
	delay(10);

	
	P3=0XDF;//P35
	P2=0X81;	
	delay(10);

	P3=0XBF;//P36
	P2=0XFF;	
	delay(10);

	P3=0X7F;//P37
	P2=0X81;	
	delay(10);
}

xdata char z0=0x52;
xdata char z1=0x91;
xdata char z2=0xA4;
xdata char z3=0x51;
xdata char z4=0xA4;
xdata char z5=0x49;
xdata char z6=0x2A;
xdata char z7=0x54;
xdata char z8=0x49;
xdata char z9=0x45;
xdata char z10=0x25;
xdata char z11=0x92;
void dh3()
{
	P3=0XFF;

	P0=0XFE;//P00
	P2=z0;	
	delay(10);

	P0=0XFD;//P01
	P2=z1;	
	delay(10);

	P0=0XFB;//P02
	P2=z2;	
	delay(10);

	P0=0XF7;//P03
	P2=z3;	
	delay(10);

	P0=0XEF;//P04
	P2=z4;	
	delay(10);

	P0=0XDF;//P05
	P2=z5;	
	delay(10);

	P0=0XBF;//P06
	P2=z6;	
	delay(10);

	P0=0X7F;//P07
	P2=z7;	
	delay(10);

	P0=0XFF;

	P3=0XEF;//P34
	P2=z8;	
	delay(10);
	
	P3=0XDF;//P35
	P2=z9;	
	delay(10);

	P3=0XBF;//P36
	P2=z10;	
	delay(10);

	P3=0X7F;//P37
	P2=z11;	
	delay(10);
}

void dh4()
{
	P3=0XFF;

	P0=0XFB;//P02
	P2=0X20;	
	delay(10);

	P0=0XF7;//P03
	P2=0X40;	
	delay(10);

	P0=0XEF;//P04
	P2=0X24;	
	delay(10);

	P0=0XDF;//P05
	P2=0X02;	
	delay(10);

	P0=0XBF;//P06
	P2=0X24;	
	delay(10);

	P0=0X7F;//P07
	P2=0X40;	
	delay(10);

	P0=0XFF;

	P3=0XEF;//P34
	P2=0X20;	
	delay(10);
}
uchar date;
xdata char h=0,v=0,v1=0,dd=0;
void pp()
{
	if(date<=15 && date>2)//1
	{	
		h=1;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;		
	}

	if(date<=30 && date>15)//2
	{	
		h=2;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;	
	}
	
	if(date<=45 && date>30)//3
	{
		h=3;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
	}
	if(date<=60 && date>45)//4
	{
		h=4;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
		p03=0;		
	}
	if(date<=75 && date>60)	//5
	{
		h=5;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
		p03=0;
		p04=0;		
	}
	if(date<=90 && date>75)//6
	{
		h=6;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
		p03=0;
		p04=0;
		p05=0;	
	}
	if(date<=105 && date>90)//7
	{
		h=7;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
		p03=0;
		p04=0;
		p05=0;
		p06=0;		
	}
	if(date<=130 && date>105)//8
	{
		h=8;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
		p03=0;
		p04=0;
		p05=0;
		p06=0;
		p07=0;		
	}
	if(date<=145 && date>130)//9
	{
		h=9;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
		p03=0;
		p04=0;
		p05=0;
		p06=0;
		p07=0;
		p34=0;	
	}
	if(date<=160 && date>145)//10
	{
		h=10;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
		p03=0;
		p04=0;
		p05=0;
		p06=0;
		p07=0;
		p34=0;
		p35=0;	
	}
	if(date<=175 && date>160)//11
	{
		h=11;
		if(v1<h)v1=h;
		if(v<h)v=h;
		p00=0;
		p01=0;
		p02=0;
		p03=0;
		p04=0;
		p05=0;
		p06=0;
		p07=0;
		p34=0;
		p35=0;
		p36=0;	
	}
	if(date<=190 && date>175)//12
	{
		h=12;
		if(v1<h)v1=h;	
		if(v<h)v=h;		
		p00=0;
		p01=0;
		p02=0;
		p03=0;
		p04=0;
		p05=0;
		p06=0;
		p07=0;
		p34=0;
		p35=0;
		p36=0;
		p37=0;	
	}
}

char xiao=0;
void main()
{
	P2M0=0xff;//  BIN(11111111);//P2组设置为推挽输出
	P2M1=0x00;	  
	P3M0=0xff;//  BIN(11111111);//P3组设置为推挽输出
	P3M1=0x00;
	P1M0=0x00;
	P1M1=0x01;
 	P1ASF =1;	   //设置P1.0为AD口
    AUXR1 =BIN(100);

	keep=0;
	keepnum=0;

	timerinit();//定时器初始化

	timernum=3;//从3开始
	timernum2=0;
    while(1)
	{
		if(zh==1)
		{
			if(key==0)
			{
				delay(5);
				if(key==0)
				{
					while(key==0);
					xiao++;
					if(xiao==1){ET0=0;TR0=0;}
					if(xiao==3){ET1=1;TR1=1;}
					if(xiao==5){xiao=0;ET0=1;TR0=1;ET0=1;TR0=1;}
				}
			}
		    if(xiao==0) FFT();
		    if(xiao==1)	dh1();
		    if(xiao==2)	dh2();
		    if(xiao==3)	dh3();
		    if(xiao==4)	dh4();		
		}

		if(zh==0)
		{
			TR1=0;
//			if(key==0)
//			{
//				delay(5);
//				if(key==0)
//				{
//					while(key==0);
//					dd++;
//					if(dd==2)dd=0;
//				}
//			}

			P2=0XE7;
			date=STC_ADC();
			pp();
			delay(10);
		}
	}
}
xdata int t=0,t2,t3=0;
void timer0() interrupt 1
{
	unsigned char i;
	
	if(zh==1)
	{	
		t++;
		if(t == 24)
		{
			for(i=0;i<14;i++)temp[i] = a[i];
			t = 0;
		}
	
	 	disp();	
		TH0=(65536-800)/256;	
		TL0=(65536-800)%256;	
	}

	if(zh==0)
	{
		t3++;
	    TL0 = (65536-10000)/256;        //设置定时初值
	    TH0 = (65536-10000)%256;        //设置定时初值

		if(t3==4)
		{
			t3=0;
	
//			t2++;
//			if(t2==10)
//			{
//				t2=0;
//				if(v1==0);
//				else v1--;	
//			}
	
			if(v==0);
			else v--;
		}
		if(v==12){;}	
		if(v==11){p37=1;}
		if(v==10){p37=1;p36=1;}
		if(v==9) {p37=1;p36=1;p35=1;}
		if(v==8) {p37=1;p36=1;p35=1;p34=1;}
		if(v==7) {p37=1;p36=1;p35=1;p37=1;p07=1;}
		if(v==6) {p37=1;p36=1;p35=1;p37=1;p07=1;p06=1;}	
		if(v==5) {p37=1;p36=1;p35=1;p37=1;p07=1;p06=1;p05=1;}
		if(v==4) {p37=1;p36=1;p35=1;p37=1;p07=1;p06=1;p05=1;p04=1;}
		if(v==3) {p37=1;p36=1;p35=1;p37=1;p07=1;p06=1;p05=1;p04=1;p03=1;}
		if(v==2) {p37=1;p36=1;p35=1;p37=1;p07=1;p06=1;p05=1;p04=1;p03=1;p02=1;}	
		if(v==1) {p37=1;p36=1;p35=1;p37=1;p07=1;p06=1;p05=1;p04=1;p03=1;p02=1;p01=1;}	
		if(v==0) {p37=1;p36=1;p35=1;p37=1;p07=1;p06=1;p05=1;p04=1;p03=1;p02=1;p01=1;p00=1;}
		
//		if(dd==0)
//		{
//			if(v1==12){;}	
//			if(v1==11){p37=0;}
//			if(v1==10){p37=1;p36=0;}
//			if(v1==9) {p37=1;p36=1;p35=0;}
//			if(v1==8) {p37=1;p36=1;p35=1;p34=0;}
//			if(v1==7) {p37=1;p36=1;p35=1;p34=1;p07=0;}
//			if(v1==6) {p37=1;p36=1;p35=1;p34=1;p07=1;p06=0;}	
//			if(v1==5) {p37=1;p36=1;p35=1;p34=1;p07=1;p06=1;p05=0;}
//			if(v1==4) {p37=1;p36=1;p35=1;p34=1;p07=1;p06=1;p05=1;p04=0;}
//			if(v1==3) {p37=1;p36=1;p35=1;p34=1;p07=1;p06=1;p05=1;p04=1;p03=0;}
//			if(v1==2) {p37=1;p36=1;p35=1;p34=1;p07=1;p06=1;p05=1;p04=1;p03=1;p02=0;}	
//			if(v1==1) {p37=1;p36=1;p35=1;p34=1;p07=1;p06=1;p05=1;p04=1;p03=1;p02=1;p01=0;}	
//			if(v1==0) {p37=1;p36=1;p35=1;p34=1;p07=1;p06=1;p05=1;p04=1;p03=1;p02=1;p01=1;p00=0;}		
//		}
	}
}
xdata char t1=0;
void timer1() interrupt 3
{
	TH1=(65536-50000)/256;	
	TL1=(65536-50000)%256;
	t1++;
	if(t1==5)
	{
		t1=0;
		z0=_cror_(z0,1);
		z1=_cror_(z1,1);
		z2=_cror_(z2,1);
		z3=_cror_(z3,1);
		z4=_cror_(z4,1);
		z5=_cror_(z5,1);
		z6=_cror_(z6,1);
		z7=_cror_(z7,1);
		z8=_cror_(z8,1);
		z9=_cror_(z9,1);
		z10=_cror_(z10,1);
		z11=_cror_(z11,1);
	}							
	
}

上一个:电阻 色环 识别 下一个:SO12864 LCD12864

联系我们

联系人:客服在线

手机:全工:13903011251

电话:李R:13530006400

邮箱:729986191@qq.com

地址: GUANGDONG PROVINCE

用手机扫描二维码关闭
二维码