小燈可以隨著音頻閃爍(傅里葉變換)
51hei圖片20191230093540.jpg (4.92 MB, 下載次數: 20)
下載附件
2019-12-30 09:36 上傳
自行利用序列點亮小燈
#include <STC12C5A60S2.H>
#define uchar unsigned char
#define uint unsigned int
sbit Y1=P2^0;//紅
sbit Y2=P2^1;//綠
sbit R1=P2^2;//藍
sbit R2=P2^3;//紅
sbit B1=P2^4;//綠
sbit B2=P2^5;//藍
sbit G1=P2^6;//紅
sbit G2=P2^7;//綠
sbit AK=P1^0;//外部音源
sbit BK=P1^2;//內部音源
sbit ABL=P0^3;//亮度
char data menu,out,amenu,sa,bb,num,cheng,yanse,liangdu; //menu按鍵左, out按鍵右, amenu按鍵中,
//sa串口中斷, bb延時變量, num頻譜顯示, //cheng行掃描變量,yanse顏色控制, liangdu亮度控制
char yp=1;
uint yinpin;
void timer0init(void) //初始化函數特殊功能寄存器配置
{
B1=0;
B2=1;
G1=0;
G2=1;
R1=1;
R2=0;
Y1=1;
Y2=0;
TMOD=0X12;
//EX0=1; //外部中斷0開
//ET0=1; //定時器0中斷開
//EX1=0; //
ET1=1;//定時器1開中斷
EA=1; //總中斷打開
//TH1=0x10;
//TL1=0x00;
IPH|=0X01;
PX0=1;
IT0=1;
P1M0=0X7F;
P1M1=0X80;
P0M0=0xf8; //P0口開漏輸出
P0M1=0xf0;
P3M0=0x00; //P0口準雙向輸出
P3M1=0X00;
P2M0=0x00; //P2口準雙向輸出
P2M1=0X00;
}
/*************************************************************************************************************************/
void delay(int i)// 延時 bb速度控制
{
char b;
while (i--)
{
b=bb;
while(b--);
}
}
/*************************************************************************************************************************/
/******************************************74HC595數據發送函數************************************************************/
/*************************************************************************************************************************/
sbit SH_CP = P3^4; //SCK
sbit ST_CP = P3^3;//RCK
sbit DS = P3^5;//SER
void initial595() //列掃描74HC595初始化
{
SH_CP = 0;
ST_CP = 0;
DS = 0;
}
/**********************************************************************************************************************/
/*******************************************************************************************************************************/
void sendbyte1(unsigned int num1,unsigned int num2,unsigned int num3,unsigned int num4) //列掃描74HC595輸出
{
unsigned char i=0;
for(i=0;i<8;i++)
{
DS = num1&0x01; //發送最低位
SH_CP = 1;
SH_CP = 0; //移位寄存器移位
num1=num1>>1; //數據移位
}
for(i=0;i<8;i++)
{
DS = num2&0x01; //發送最低位
SH_CP = 1;
SH_CP = 0; //移位寄存器移位
num2 = num2>>1; //數據移位
}
for(i=0;i<8;i++)
{
DS = num3&0x01; //發送最低位
SH_CP = 1;
SH_CP = 0; //移位寄存器移位
num3 = num3>>1; //數據移位
}
for(i=0;i<8;i++)
{
DS = num4&0x01; //發送最低位
SH_CP = 1;
SH_CP = 0; //移位寄存器移位
num4 = num4>>1; //數據移位
}
}
/*音柱編碼*/
uchar code BRTable[64] ={ 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[64] = { 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[64] = {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 };
char data c[8];//用于存儲5個不同頻率的幅值
char data b[8];//用于使音譜柱形顯示的平滑
int xdata Real[64];//實部
int xdata Image[64];//虛部
/*音柱編碼*/
uchar code tuku1[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,};//音頻顯示方式1
uchar code tuku2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};//音頻顯示方式3
uchar code tuku3[]={0x00,0x10,0x18,0x38,0x3c,0x7c,0x7e,0xff,};//音頻顯示方式3
uchar code table1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//音頻顯示頻段1
uchar code table2[]={
0Xe0,0Xe0,0Xe0,0xe0,0Xe0,0Xe0,0Xe0,0Xe0,
0X07,0X07,0X07,0X07,0X07,0X07,0X07,0X07
};//音頻顯示頻段2
uchar code table3[]={
0Xf0,0Xe0,0Xc0,0x80,0X00,0X00,0X00,0X00,
0X03,0X07,0X0e,0x1c,0X38,0X70,0Xe0,0Xc0,
0X00,0X00,0X00,0X00,0X01,0X03,0X07,0X0f
};//音頻顯示頻段3
uchar code table4[]={
0Xc0,0Xc0,0X00,0x00,0X00,0X00,0X00,0X00,
0X00,0X00,0X30,0x30,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X0c,0X0c,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X03
}; //音頻顯示頻段4
uchar code table5[]={
0Xc0,0Xc0,0X00,0x00,0X00,0X00,0X00,0X00,
0X18,0X18,0X00,0x00,0X00,0X00,0X00,0X00,
0X03,0X03,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X03,0X03,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X03
}; //音頻顯示頻段5
uchar code table6[]={
0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,
0Xc0,0Xc0,0X00,0x00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0xc0,0Xc0,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0xc0,0Xc0,
0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X18,
0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X03
}; //音頻顯示頻段6
uchar code table7[]={
0X00,0X00,0X00,0x00,0X00,0X00,0X00,0X01,
0X00,0X00,0X00,0x00,0X00,0X00,0X03,0X03,
0X00,0X00,0X00,0X00,0X00,0X07,0x04,0X04,
0X00,0X00,0X00,0X00,0X0f,0X08,0X08,0X08,
0X00,0X00,0X00,0X1f,0X10,0X10,0X10,0X10,
0X00,0X00,0X2f,0x20,0x20,0X20,0X20,0X20,
0X00,0X7f,0X40,0x40,0x40,0X40,0X40,0X40
}; //音頻顯示頻段7
uchar code table8[]={
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
}; //音頻顯示頻段8
int STC_ADC() //啟動ADC轉換讀取數據后返回值
{
uchar i;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR=0x88;
i=3;
while(i--);
while(1)
{
if(ADC_CONTR&0x10) //判斷A轉換完成
break;
}
ADC_CONTR=0x80; //AD電源打開
return(ADC_RESL+ADC_RES<<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;
}
完整程序見附件
|