#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