找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2312|回复: 0
打印 上一主题 下一主题
收起左侧

音频光立方程序(傅里叶变换)

[复制链接]
跳转到指定楼层
楼主
小灯可以随着音频闪烁(傅里叶变换)

自行利用序列点亮小灯
#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;
}
完整程序见附件



音频光立方程序.rar

3.61 KB, 下载次数: 37, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表