#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); } }
联系人:客服在线
手机:全工:13903011251
电话:李R:13530006400
邮箱:729986191@qq.com
地址: GUANGDONG PROVINCE