找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 47378|回复: 45
收起左侧

自制音乐频谱-带源码 带视频

  [复制链接]
ID:70481 发表于 2014-12-17 14:27 | 显示全部楼层 |阅读模式
      看到论坛上有很多朋友做了音乐频谱,感觉很炫,于是也模仿着做了一个。在制作过程中,从网上查了很多资料,得到很多帮助。我要非常感谢那些辛勤付出的网友们,是你们无私的付出让我们可以站在更高的起点奔跑。诗经有云:投我以木桃,报之以琼瑶。如果一味的索取,泉源也会枯竭。故将我制作的所有资料传上来,以作为对那些帮助过我的网友的答谢,也希望看到此贴的人能将此一做法传承下去, 为论坛贡献自己的一份力量。
效果图:
13522824s55zclb0codj9u.jpg.thumb.jpg
视频:

这个作品的制作可以分为三个过程:1、焊接LED点阵;2、设计控制电路;3、编程
所谓音乐频谱就是将音乐的各个频率分量显示出来,LED点阵的水平轴代表各个频率,竖直轴代表强度。从下面的图中可以看出,该点阵大小为16*30(本来要做16*32,限于万用板大小只能容下30列)。每两列为一组,共15组,由于是阴极接在一起,姑且称之为共阴极组;同理,每一行的阳极接在一起,称为共阳极组,共16组。
点阵接线图:
135545dpedu8zp8svluud7.png.thumb.jpg
正面:
135218c18sjhpsszlblhp2.jpg.thumb.jpg
(围成圆圈的灯是七彩快闪LED,只要接上电源,其颜色自动变换。)
背面:
1352248mbwfvxwbslw4wsk.jpg.thumb.jpg
从图中可以看到,所有的阴极线(15根)、阳极线(16根) 都用排针引出来,再用杜邦线就可以和控制板相连。
控制电路图:
135338rm7f9jujcr94fzjr.png.thumb.jpg
单片机用的是ATMEGA324PA(内部晶振,8MHZ),只用到通用IO功能,移植到其他单片机上也很方便。基本控制思路:扫描。每一时刻只让一个共阴极组接地,其它接高电平,从左至右依次选通每个共阴极组。每次选中共阴极组后,需要对其阳极写入数据,由于有16行,需要写入两个字节。假如以上方为高字节,我想让选中的共阴极组下面的9行灯亮,则应往阳极段写入的两个字节为:0x01,0xff。控制电路采用了4个锁存器74HC573,2个ULN2803(八路达林顿管,其实是一个8路反向器,可以承受大电流 ) 。左边两个573用来对阳极写入数据,右边两个573和2803接在一起,用来选通共阴极组。4个573的数据输入端都连到一起,接在单片机的PB口。573还有一个选通端LE,当其为高电平时,可以对其写入数据,低电平时输出锁存。将其作为片选(SS0,SS1,SS2,SS3)依次接单片机PA0,PA1,PA2,PA3。每次只让一个片选为1,就可以对每个573分开写入数据了。
最后说说编程。用了一个声音模块采集声音,声音模块 原理为:麦克接收声音,OUT端输出声音信号波形。OUT端接在单片机的PA7(AD转换端口)上。程序的循环中,先进行32次AD采样,得到32(必须是2的n次方)个采样值,做快速傅里叶变换,得到32个频率的强度,由于是前后对称的,只取其前15个频率的强度,经过幅值调整(调为0~16),在15个共阴极组上依次显示出来。

评分

参与人数 1黑币 +15 收起 理由
_4061N_ + 15 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:70481 发表于 2014-12-17 14:42 | 显示全部楼层
1、<main.c>
主函数(AD转换,FFT变换)
  1. #define   F_CPU  8  //可定义为你所用的晶振频率(单位Mhz)
  2. #include <ioavr.h>
  3. #include "delay.h"
  4. #include "data.h"
  5. #include "display.h"
  6. #define DATA PORTB
  7. #define SS0 PORTA_Bit0
  8. #define SS1 PORTA_Bit1
  9. #define SS2 PORTA_Bit2
  10. #define SS3 PORTA_Bit3
  11. #define pi 3.141592654
  12. #include<math.h>//要调入数学(和谐)运算的头文件
  13. //定义复数结构
  14. struct compx
  15. {
  16.   float real;
  17.   float imag;
  18. };
  19. //定义复数乘法
  20. struct compx EE(struct compx a,struct compx b)
  21. {
  22.   struct compx c;
  23.   c.real=a.real*b.real-a.imag*b.imag;
  24.   c.imag=a.real*b.imag+a.imag*b.real;
  25.   return(c);
  26. }
  27. //定义复数求模
  28. float cmplxabs(struct compx a)
  29. {
  30.   float b;
  31.   b=sqrt(a.real*a.real+a.imag*a.imag);
  32.   return(b);
  33. }
  34. //FFT子程序
  35. //入口:复数数组指针和点数。
  36. //出口:原复数数组,取模后为强度,可用于频谱。
  37. void FFT(struct compx *xin,unsigned int N)
  38. {
  39.   int f,m,nv2,nm1,i,k,j=1,l;
  40.   int le,lei,ip;
  41.   struct compx v,w,t;
  42.   nv2=N/2;
  43.   f=N;
  44.   for(m=1;(f=f/2)!=1;m++);
  45.   nm1=N-1;
  46.   for(i=1;i<=nm1;i++)
  47.   {
  48.     if(i<j)
  49.       {
  50.         t=xin[j-1];
  51.         xin[j-1]=xin[i-1];
  52.         xin[i-1]=t;
  53.       }
  54.     k=nv2;
  55.     while(k<j){j=j-k;k=k/2;}
  56.     j=j+k;
  57.   }
  58.   /* FFT*/
  59.   for(l=1;l<m;l++)
  60.   {
  61.     le=(int)pow(2.0,l);
  62.     lei=le/2;
  63.     v.real=1.0;v.imag=0.0;
  64.     w.real=cos(pi/lei);w.imag=-sin(pi/lei);
  65.     for(j=1;j<=lei;j++)
  66.     {
  67.       for(i=j;i<=N;i+=le)
  68.       {
  69.         ip=i+lei;
  70.         t=EE(xin[ip-1],v);
  71.         xin[ip-1].real=xin[i-1].real-t.real;
  72.         xin[ip-1].imag=xin[i-1].imag-t.imag;
  73.         xin[i-1].real=xin[i-1].real+t.real;
  74.         xin[i-1].imag=xin[i-1].imag+t.imag;
  75.       }
  76.       v=EE(v,w);
  77.     }
  78.   }
  79. }
  80. void ADC_Init()
  81. {
  82.   ADCSRA=0xE3;//ADC使能,开始转换,自动触发转换,中断bit3,8分频
  83.   ADCSRB=0x00;//自由转换模式
  84.   ADMUX=0x47;//基准电压Internal 1.1V Voltage,通道0 4n通道n
  85. }
  86. char s[15][2]={0};
  87. void start()
  88. {
  89.   flash2(1);
  90.   flash4(1);
  91.   flash5(5);
  92. }
  93. void end()
  94. {
  95.   scroll(67,word,1);
  96.   flash2(1);
  97.   while(1)xiaolian(5);
  98. }
  99. char counter=0;
  100. #pragma vector=TIMER1_OVF_vect
  101. __interrupt void TIMER1_OVF_ISR()
  102. {
  103.   TCNT1=0;//8.4s
  104.     counter++;
  105.   if(counter==28)
  106.     end();
  107. }
  108. void TIMER1_INIT()//TIMER1 16位定时器
  109. {
  110.   TCNT1=0;
  111.   TIMSK1=0x01;//T1溢出中断使能
  112.   SREG=0x80;//总中断使能
  113.   TCCR1A=0x00;
  114.   TCCR1B=0x05;//1024分频,开始计数
  115. }
  116. struct compx ss[32];
  117. char w=0,bar[15]={0};
  118. unsigned int t,tL,tH;
  119. void main()
  120. {
  121.   PORTA=0x00;
  122.   DDRA=0x0f;  
  123.   PORTB=0x00;
  124.   DDRB=0xFF;
  125.   ADC_Init();
  126.   start();
  127.   TIMER1_INIT();
  128.   while(1)
  129.   {   
  130.     tL=ADCL;
  131.     tH=ADCH<<8;
  132.     t=tH+tL;
  133.     ss[w].real=(float)t;//采样结果送实部,注意数据类型转换
  134.     ss[w].imag=0;
  135.     w++;
  136.     for(char i=1;i<10;i++)refresh(bar);
  137.     if(w==32)
  138.     {
  139.       w=0;
  140.       clear();
  141.       FFT(ss,32);
  142.       unsigned int sum;
  143.       for(char i=1;i<=15;i++)sum+=cmplxabs(ss);
  144.       sum/=15;//平均值
  145.       for(char i=0;i<=14;i++)
  146.       {
  147.         char temp=(char)(cmplxabs(ss[i+1])/250);
  148.         if(temp>16)temp=16;
  149.         if(bar>temp)
  150.           bar-=1;
  151.         else
  152.         {
  153.           bar=temp;
  154.         }
  155.       }
  156.     }
  157.   }
  158. }
复制代码
回复

使用道具 举报

ID:70481 发表于 2014-12-17 14:43 | 显示全部楼层
2、<dasplay.c>
底层驱动函数、动画显示函数、刷新函数

  1. #define   F_CPU  8 //可定义为你所用的晶振频率(单位Mhz)#include <ioavr.h>
  2. #include "delay.h"
  3. #include "data.h"
  4. #define DATA PORTD
  5. #define SS0 PORTA_Bit0
  6. #define SS1 PORTA_Bit1
  7. #define SS2 PORTA_Bit2
  8. #define SS3 PORTA_Bit3
  9. void clear()
  10. {
  11.       PORTA&=0XF0;
  12.       PORTD=0X00;
  13.       PORTA|=0X03;//SS0,SS1
  14.       PORTA&=0XF0;
  15. }
  16. void clear_all()//全部清除
  17. {
  18.   for(char i=0;i<15;i++)
  19.   {
  20.     s[0]=0;
  21.     s[1]=0;
  22.   }
  23. }
  24. void refresh(char *p)//刷新频谱
  25. {
  26.   char k=0,tempU,tempD;
  27.     k=0;

  28.     PORTA&=0XF0;
  29.     PORTD=0X00;
  30.     PORTA|=0X02;//SS1  
  31.     for(char i=0;i<=6;i++)
  32.     {
  33.       tempU=0;tempD=0;  
  34.       if(p[k]>8)
  35.       {
  36.         for(char j=0;j<p[k]-8;j++)tempU+=(1<<j);
  37.         tempD=0xff;
  38.       }
  39.       else
  40.       {
  41.         tempU=0;
  42.         for(char j=0;j<p[k];j++)tempD+=(1<<j);
  43.       }

  44.       PORTA&=0XF0;
  45.       PORTD=0X00;
  46.       PORTA|=0X0c;//SS2,SS3         

  47.       PORTA&=0XF0;
  48.       PORTD=(1<<i);
  49.       PORTA|=0X01;//SS0              

  50.       PORTA&=0XF0;
  51.       PORTD=tempD;
  52.       PORTA|=0X04;//SS2 下8行   

  53.       PORTA&=0XF0;
  54.       PORTD=tempU;
  55.       PORTA|=0X08;//SS3  上8行   
  56.       //delay_ms(500);
  57.       k++;
  58.     }   

  59.     delay_us(30);
  60.     PORTA&=0XF0;
  61.     PORTD=0X00;
  62.     PORTA|=0X0c;//SS2,SS3

  63.     PORTA&=0XF0;
  64.     PORTD=0X00;
  65.     PORTA|=0X01;//SS0   
  66.     for(char i=0;i<=7;i++)
  67.     {
  68.       tempU=0;tempD=0;
  69.       if(p[k]>8)
  70.       {
  71.         for(char j=0;j<p[k]-8;j++)tempU+=(1<<j);
  72.         tempD=0xff;
  73.       }
  74.       else
  75.       {
  76.         tempU=0;
  77.         for(char j=0;j<p[k];j++)tempD+=(1<<j);
  78.       }           

  79.       PORTA&=0XF0;
  80.       PORTD=0X00;
  81.       PORTA|=0X0c;//SS2,SS3                    

  82.       PORTA&=0XF0;
  83.       PORTD=(1<<i);
  84.       PORTA|=0X02;//SS1     

  85.       PORTA&=0XF0;
  86.       PORTD=tempD;
  87.       PORTA|=0X04;//SS2  下8行  
  88.       delay_us(10);

  89.       PORTA&=0XF0;
  90.       PORTD=tempU;
  91.       PORTA|=0X08;//SS3 上8行     
  92.       k++;
  93.     }
  94.     delay_us(30);
  95.   }
  96. }
  97. void show(char p[15][2])//显示图片
  98. {
  99.   char k=0;
  100.     k=0;

  101.     PORTA&=0XF0;
  102.     PORTD=0X00;
  103.     PORTA|=0X02;//SS1  
  104.     for(char i=0;i<=6;i++)
  105.     {         
  106.       PORTA&=0XF0;
  107.       PORTD=0X00;
  108.       PORTA|=0X0c;//SS2,SS3         

  109.       PORTA&=0XF0;
  110.       PORTD=(1<<i);
  111.       PORTA|=0X01;//SS0

  112.       PORTA&=0XF0;
  113.       PORTD=p[k][0];
  114.       PORTA|=0X08;//SS3  上8行

  115.       PORTA&=0XF0;
  116.       PORTD=p[k][1];
  117.       PORTA|=0X04;//SS2 下8行            
  118.       k++;
  119.     }        
  120.     PORTA&=0XF0;
  121.     PORTD=0X00;
  122.     PORTA|=0X0c;//SS2,SS3

  123.     PORTA&=0XF0;
  124.     PORTD=0X00;
  125.     PORTA|=0X01;//SS0   
  126.     for(char i=0;i<=7;i++)
  127.     {        

  128.       PORTA&=0XF0;
  129.       PORTD=0X00;
  130.       PORTA|=0X0c;//SS2,SS3                    

  131.       PORTA&=0XF0;
  132.       PORTD=(1<<i);
  133.       PORTA|=0X02;//SS1

  134.       PORTA&=0XF0;
  135.       PORTD=p[k][0];
  136.       PORTA|=0X08;//SS3  上8行

  137.       PORTA&=0XF0;
  138.       PORTD=p[k][1];
  139.       PORTA|=0X04;//SS2 下8行   
  140.       k++;
  141.     }
  142.   }
  143. }

  144. void clear_dot(char x,char y)//x:0~14 y:0~15清除点
  145. {
  146.   if(y>=8)
  147.   {
  148.     s[x][0]&=~(1<<(y-8));
  149.   }
  150.   else
  151.   {
  152.     s[x][1]&=~(1<<y);
  153.   }
  154. }
  155. void set_dot(char x,char y)//x:0~14 y:0~15显示点
  156. {
  157.   if(y>=8)
  158.   {
  159.     s[x][0]|=1<<(y-8);
  160.   }
  161.   else
  162.   {
  163.     s[x][1]|=1<<y;
  164.   }
  165. }
  166. void set_dot(char x,char y,char q[15][2])//x:0~14 y:0~15
  167. {
  168.   if(y>=8)
  169.   {
  170.     q[x][0]|=1<<(y-8);
  171.   }
  172.   else
  173.   {
  174.     q[x][1]|=1<<y;
  175.   }
  176. }
  177. void rise(char p[15][2],char n)//n:1~15 图像上移n行
  178. {
  179.   unsigned int temp;
  180.   char q[15][2]={0};
  181.   for(char j=0;j<15;j++)
  182.   {
  183.     temp=(int)p[j][0]*256+p[j][1];
  184.     temp<<=n;
  185.     q[j][0]=temp/256;
  186.     q[j][1]=temp%256;
  187.   }
  188.   for(long i=0;i<300;i++)show(q);
  189.   clear();
  190. }
  191. void flash1(int t)//列右移
  192. {
  193.   for(int v=0;v<t;v++)
  194.   {
  195.     clear_all();
  196.     s[0][0]=0xff;
  197.     s[0][1]=0xff;
  198.     for(char j=0;j<15;j++)
  199.     {
  200.       s[(j+1)%15][0]=s[j][0];
  201.       s[(j+1)%15][1]=s[j][1];
  202.       s[j][0]=0x00;
  203.       s[j][1]=0x00;
  204.       for(long i=0;i<400;i++)show(s);
  205.     }
  206.   }
  207. }
  208. void flash2(long t)//缩小的圈
  209. {
  210.   signed char x=0,y=15;
  211.   for(int v=0;v<t;v++)
  212.   {
  213.     clear_all();
  214.     x=0;y=15;
  215.     for(char i=0;i<15;i++)
  216.     {
  217.       while(x<15-i)
  218.       {
  219.         set_dot(x,y);
  220.         x++;
  221.         for(int i=0;i<100;i++)show(s);
  222.       }
  223.       x--;
  224.       while(y>=i)
  225.       {
  226.         set_dot(x,y);
  227.         y--;
  228.         for(int i=0;i<100;i++)show(s);
  229.       }
  230.       y++;
  231.       while(x>=i)
  232.       {
  233.         set_dot(x,y);
  234.         x--;
  235.         for(int i=0;i<100;i++)show(s);
  236.       }
  237.       x++;
  238.       while(y<15-i)
  239.       {
  240.         set_dot(x,y);
  241.         y++;
  242.         for(int i=0;i<100;i++)show(s);
  243.       }
  244.       y--;
  245.     }
  246.   }
  247. }
  248. void xiaolian(int t)//笑脸
  249. {
  250.   for(int v=0;v<t;v++)
  251.   {
  252.     for(long i=0;i<5000;i++)show(xiaolian1);
  253.     for(long i=0;i<2000;i++)show(xiaolian2);
  254.   }
  255.   //for(long i=0;i<5000;i++)show(xiaolian1);
  256. }
  257. void flash3(long t)//“RUN”垂直落下
  258. {
  259.   for(int v=0;v<t;v++)
  260.   {
  261.     for(signed char i=15;i>=0;i--)rise(run,i);
  262.     for(long i=0;i<20000;i++)show(run);
  263.   }
  264. }
  265. void flash4(long t)//“RUN”笔画书写
  266. {
  267.   int dd=200;
  268.   for(int v=0;v<t;v++)
  269.   {
  270.     clear_all();
  271.     for(signed char i=15;i>=1;i--)
  272.     {
  273.       set_dot(0,i);
  274.       for(int i=0;i<dd;i++)show(s);
  275.     }
  276.     for(signed char i=1;i<=3;i++)
  277.     {
  278.       set_dot(i,15);
  279.       for(int i=0;i<dd;i++)show(s);
  280.     }
  281.     for(signed char i=14;i>=9;i--)
  282.     {
  283.       set_dot(3,i);
  284.       for(int i=0;i<dd;i++)show(s);
  285.     }
  286.     for(signed char i=3;i>=1;i--)
  287.     {
  288.       set_dot(i,9);
  289.       for(int i=0;i<dd;i++)show(s);
  290.     }
  291.     for(signed char i=8;i>=7;i--)
  292.     {
  293.       set_dot(1,i);
  294.       for(int i=0;i<dd;i++)show(s);
  295.     }
  296.     for(signed char i=7;i>=5;i--)
  297.     {
  298.       set_dot(2,i);
  299.       for(int i=0;i<dd;i++)show(s);
  300.     }
  301.     for(signed char i=5;i>=1;i--)
  302.     {
  303.       set_dot(3,i);
  304.       for(int i=0;i<dd;i++)show(s);
  305.     }
  306.     for(int i=0;i<2000;i++)show(s);
  307.     for(signed char i=15;i>=2;i--)
  308.     {
  309.       set_dot(5,i);
  310.       for(int i=0;i<dd;i++)show(s);
  311.     }  
  312.     for(signed char i=6;i<=7;i++)
  313.     {
  314.       set_dot(i,1);set_dot(i,2);
  315.       for(int i=0;i<dd;i++)show(s);
  316.     }  
  317.     for(signed char i=2;i<=15;i++)
  318.     {
  319.       set_dot(8,i);
  320.       for(int i=0;i<dd;i++)show(s);
  321.     }  
  322.     for(int i=0;i<2000;i++)show(s);
  323.     for(signed char i=15;i>=1;i--)
  324.     {
  325.       set_dot(10,i);
  326.       for(int i=0;i<dd;i++)show(s);
  327.     }
  328.     for(signed char i=13;i>=11;i--)
  329.     {
  330.       set_dot(11,i);
  331.       for(int i=0;i<dd;i++)show(s);
  332.     }  
  333.     for(signed char i=10;i>=7;i--)
  334.     {
  335.       set_dot(12,i);
  336.       for(int i=0;i<dd;i++)show(s);
  337.     }  
  338.     for(signed char i=6;i>=3;i--)
  339.     {
  340.       set_dot(13,i);
  341.       for(int i=0;i<dd;i++)show(s);
  342.     }   
  343.     for(signed char i=1;i<=15;i++)
  344.     {
  345.       set_dot(14,i);
  346.       for(int i=0;i<dd;i++)show(s);
  347.     }  
  348.     for(int i=0;i<2000;i++)show(s);
  349.   }
  350. }
  351. void scroll(char l,char p[][2],char t)//滚屏
  352. {
  353.   for(char j=0;j<l;j++)
  354.   {
  355.     for(int i=0;i<3200;i++)show(p);
  356.     p+=2;
  357.   }
  358. }
  359. void flash5(long t)//“RUN”闪烁
  360. {
  361.   for(int v=0;v<t;v++)
  362.   {
  363.     for(int i=0;i<1000;i++)show(run);
  364.     clear();
  365.     delay_ms(50);
  366.   }
  367. }
复制代码
回复

使用道具 举报

ID:70481 发表于 2014-12-17 14:43 | 显示全部楼层
3、<data.c>
存放需要显示的汉字字模

  1. char word[][2]=
  2. {
  3. 0x08,0x08,0x0b,0x30,0x08,0xc2,
  4. 0xff,0xff,0x08,0xc0,0x2b,0x30,
  5. 0x18,0x08,
  6. 0x00,0x00,
  7. 0x02,0x03,0xfa,0x7c,
  8. 0xaa,0x0c,0xab,0xfe,0xaa,0x63,
  9. 0xfa,0x63,0x02,0x01,0x00,0x01,//求是
  10. 0x00,0x00,

  11. 0x04,0x00,0x1b,0xff,0xe4,0x03,
  12. 0x33,0xc3,0x08,0x07,0x0f,0xf8,
  13. 0x00,0x02,0xff,0xff,
  14. 0x00,0x00,
  15. 0x32,0x48,0x2a,0x52,0xe7,0xff,
  16. 0x2a,0x50,0x32,0x48,0x0f,0xff,
  17. 0x12,0x00,0x23,0xff,0x42,0x00,//创新
  18. 0x00,0x00,0x00,0x00,0x00,0x00,

  19. 0x21,0x04,0xff,0xff,0x00,0x04,
  20. 0x3f,0xfa,0x65,0x12,0xa5,0x11,
  21. 0x3d,0xf1,
  22. 0x00,0x00,
  23. 0x00,0x01,0x08,0x08,
  24. 0x0b,0x30,0x08,0xc2,0xff,0xff,
  25. 0x08,0xc0,0x2b,0x30,0x18,0x08,//追求
  26. 0x00,0x00,

  27. 0x00,0x08,0x0f,0xc8,0x09,0x48,
  28. 0xf9,0x7f,0x49,0x48,0x4f,0xc8,
  29. 0x00,0x00,
  30. 0x02,0x0c,0x12,0x38,0xff,0xfc,
  31. 0x12,0x44,0x02,0x04,0x1f,0xfa,
  32. 0x10,0x92,0xff,0xe2,0x52,0x19,//卓越
  33. 0x00,0x00,0x00,0x00,0x00,0x00,

  34. 0x24,0x10,0x24,0x22,0x7f,0xff,
  35. 0x84,0x88,0x7f,0xf0,0x24,0x3e,
  36. 0x14,0xc3,
  37. 0x00,0x00,
  38. 0x08,0x00,0x3f,0xff,
  39. 0xc0,0x00,0x17,0xff,0x28,0x00,
  40. 0x20,0x00,0x20,0x02,0x3f,0xff,//我们
  41. 0x00,0x00,

  42. 0x02,0x03,0xfa,0x7c,
  43. 0xaa,0x0c,0xab,0xfe,0xaa,0x63,
  44. 0xfa,0x63,0x02,0x01,0x00,0x01,//是
  45. 0x00,0x00,

  46. 0xff,0xfe,0x83,0x80,0x82,0xe0,
  47. 0xfe,0x3e,0x00,0x00,0xff,0xfc,
  48. 0x00,0x06,0x00,0x06,0xff,0xfc,
  49. 0x00,0x00,0xff,0xfe,0x38,0x00,
  50. 0x07,0x80,0x00,0x78,0xff,0xfe,//RUN
  51. 0x00,0x00,0x00,0x00,

  52. 0x7f,0xfe,0x44,0x12,0x44,0x62,
  53. 0x44,0x8a,0x7f,0xfe,0x44,0x02,
  54. 0x7f,0xfe,0x00,0x00,0x7f,0xfe,
  55. 0x44,0x82,0x7b,0x0c,0x00,0x30,
  56. 0x7f,0xc0,0x00,0x30,0x00,0x0e,//团队

  57. 0x00,0x00,0x00,0x00,0x00,0x00,
  58. 0x00,0x00,0x00,0x00,0x00,0x00,
  59. 0x00,0x00,0x00,0x00,0x00,0x00,
  60. 0x00,0x00,0x00,0x00,0x00,0x00,
  61. 0x00,0x00,0x00,0x00,0x00,0x00,
  62. };
复制代码
回复

使用道具 举报

ID:70481 发表于 2014-12-17 14:44 | 显示全部楼层
本帖最后由 xiaoyao 于 2014-12-17 14:45 编辑

4、头文件 有好几个文件
(1)<delay.h>
#ifndef __IAR_DELAY_H#define __IAR_DELAY_H
#include <intrinsics.h>
#define   delay_us(x)   __delay_cycles ((unsigned long)(x * F_CPU))
#define   delay_ms(x)   __delay_cycles ((unsigned long)(x * F_CPU*1000UL))
#define   delay_s(x)    __delay_cycles ((unsigned long)(x * F_CPU*1000000UL))
#endif


(2)<data.h>
#ifndef __IAR_DATA_H
#define __IAR_DATA_H
extern char s[15][2];
extern char run[15][2];
extern char tuandui[15][2];
extern char chuanxin1[15][2];
extern char chuanxin2[18][2];
extern char qiushi[15][2];
extern char women[15][2];
extern char zhuiqiu[15][2];
extern char zhuoyue[15][2];
extern char xiaolian1[15][2];
extern char xiaolian2[15][2];
extern char word[][2];
#endif



(3)<display.h>
#ifndef __IAR_DISSPLAY_H
#define __IAR_DISPLAY_H
extern void refresh(char *p);
extern void clear_all();
extern void clear();
extern void show(char p[15][2]);
extern void refresh1(char *p);
extern void clear_dot(char x,char y,char q[15][2]);//x:0~14 y:0~15
extern void set_dot(char x,char y,char q[15][2]);//x:0~14 y:0~15
extern void clear_dot(char x,char y);//x:0~14 y:0~15
extern void set_dot(char x,char y);//x:0~14 y:0~15
extern void rise(char p[15][2],char n);//n:1~15
extern void flash1(int t);
extern void flash2(long t);
extern void xiaolian(int t);
extern void flash3(long t);
extern void flash4(long t);
extern void scroll(char l,char p[][2],char t);
extern void flash5(long t);
#endif

回复

使用道具 举报

ID:71697 发表于 2015-1-6 01:02 | 显示全部楼层
真好看  不知道搞小一点程序该怎么改
回复

使用道具 举报

ID:72901 发表于 2015-1-28 12:56 | 显示全部楼层
不错,值得学习。51hei有你更精彩!!
回复

使用道具 举报

ID:73711 发表于 2015-4-12 19:04 | 显示全部楼层
谢谢  分享  51单片机可以直接播放MP3文件吗
回复

使用道具 举报

ID:79481 发表于 2015-5-10 01:17 | 显示全部楼层
收藏备用!!!!!!!!!!!!!
回复

使用道具 举报

ID:79544 发表于 2015-5-10 19:38 | 显示全部楼层
牛人,学习啦!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:76502 发表于 2015-5-29 13:02 | 显示全部楼层
支持下         
回复

使用道具 举报

ID:72624 发表于 2015-5-31 19:02 | 显示全部楼层
太好了,就是不知道用64X16的灯板可以用吗
回复

使用道具 举报

ID:78841 发表于 2015-6-1 20:40 | 显示全部楼层
能换别的歌曲吗
回复

使用道具 举报

ID:81667 发表于 2015-6-1 22:11 | 显示全部楼层
牛气! 我们学校要这样的仿真实物!
回复

使用道具 举报

ID:92858 发表于 2015-11-28 12:40 | 显示全部楼层
楼主为啥不用74hc595和138
回复

使用道具 举报

ID:104503 发表于 2016-1-26 22:39 | 显示全部楼层
真心觉得不错
回复

使用道具 举报

ID:105742 发表于 2016-2-18 15:00 | 显示全部楼层
厉害,真想学
回复

使用道具 举报

ID:124243 发表于 2016-7-4 20:59 | 显示全部楼层
楼主技术不错哦   膜拜  学习学习  
回复

使用道具 举报

ID:138211 发表于 2016-9-1 22:35 | 显示全部楼层
来学习的,谢谢了!!1
回复

使用道具 举报

ID:136460 发表于 2016-9-5 09:10 | 显示全部楼层
膜拜  学习学习
回复

使用道具 举报

ID:136460 发表于 2016-9-5 09:11 | 显示全部楼层
真心觉得不错
回复

使用道具 举报

ID:134810 发表于 2016-9-20 16:46 来自手机 | 显示全部楼层
洋气,转换过程学习借鉴
回复

使用道具 举报

ID:130561 发表于 2016-9-22 18:08 | 显示全部楼层
很厉害啊
回复

使用道具 举报

ID:145058 发表于 2016-11-19 10:08 | 显示全部楼层
厉害,可以借鉴来学习了
回复

使用道具 举报

ID:151305 发表于 2016-12-13 10:44 | 显示全部楼层
楼主不如一起打包了给链接,谢谢
回复

使用道具 举报

ID:153777 发表于 2016-12-13 22:34 | 显示全部楼层
谢谢  分享  51单片机可以直接播放MP3文件吗
回复

使用道具 举报

ID:168651 发表于 2017-3-8 20:38 | 显示全部楼层
请问没有单片机开发板如何下载进去呢
回复

使用道具 举报

ID:175439 发表于 2017-5-10 17:21 | 显示全部楼层
厉害,学习学习
回复

使用道具 举报

ID:199490 发表于 2017-5-15 11:26 | 显示全部楼层
好厉害,长见识
回复

使用道具 举报

ID:257489 发表于 2017-12-5 08:52 来自手机 | 显示全部楼层
感谢分享。。。。。
回复

使用道具 举报

ID:283159 发表于 2018-4-18 16:05 | 显示全部楼层
xiaoyao 发表于 2014-12-17 14:44
4、头文件 有好几个文件
(1)
#ifndef __IAR_DELAY_H#define __IAR_DELAY_H

不错,程序有注释就好啦
回复

使用道具 举报

ID:292103 发表于 2018-5-16 21:35 来自手机 | 显示全部楼层
好程序,值得一试究竟啊!
回复

使用道具 举报

ID:281465 发表于 2018-5-19 15:57 | 显示全部楼层
大赞楼主,连线不容易啊
回复

使用道具 举报

ID:353235 发表于 2018-6-17 22:39 | 显示全部楼层
牛人,不错
回复

使用道具 举报

ID:33522 发表于 2018-7-9 16:38 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:471573 发表于 2019-1-22 12:39 | 显示全部楼层
很好的学习资料!
回复

使用道具 举报

ID:453838 发表于 2019-1-22 14:17 | 显示全部楼层
强迫症啊,这是全部代码吗?
回复

使用道具 举报

ID:566161 发表于 2019-6-18 21:29 | 显示全部楼层
请教一下大神哈。为什么说FFT转换求得的32个频率的强度是对称的
回复

使用道具 举报

ID:566621 发表于 2019-6-19 11:43 来自手机 | 显示全部楼层
感謝分享收獲許多
回复

使用道具 举报

ID:13396 发表于 2019-9-3 22:13 | 显示全部楼层
谢谢 ,分享.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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