找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机频谱显示制作8*24

  [复制链接]
跳转到指定楼层
楼主
是我早期的作品了,看见大家需要,就发上来供大家参考制作。


  1. #include <STC12C5A60S2.h>
  2. #include<intrins.h>
  3. #define SAMPLE_NUM 128
  4. #define LOG 6
  5. #define TIME 2048           //中断
  6. #define FFT_OUT_MIN 0
  7. #define FFT_OUT_MAX        7        
  8. #define OFF L1=L2=L3=L4=L5=L6=L7=L8=L9=L10=L11=L12=L13=L14=L15=L16=L17=L18=L19=L20=L21=L22=L23=L24=1;
  9. #define ADC_POWER   0x80            //ADC power control bit
  10. #define ADC_FLAG    0x10            //ADC complete flag
  11. #define ADC_START   0x08            //ADC start control bit
  12. #define LED P2         ////阳极接P2口
  13. #define pwm 9

  14. //#define ADC_SPEEDLL 0x00            //420 clocks
  15. //#define ADC_SPEEDL  0x20            //280 clocks
  16. #define ADC_SPEEDH  0x40            //140 clocks
  17. //#define ADC_SPEEDHH 0x60            //70 clocks
  18. //采样存储序列表
  19. unsigned char code BRTable[SAMPLE_NUM] ={

  20. 0, 64, 32, 96, 16, 80, 48, 112,
  21. 8, 72, 40, 104, 24, 88, 56, 120,
  22. 4, 68, 36, 100, 20, 84, 52, 116,
  23. 12, 76, 44, 108, 28, 92, 60, 124,
  24. 2, 66, 34, 98, 18, 82, 50, 114,
  25. 10, 74, 42, 106, 26, 90, 58, 122,
  26. 6, 70, 38, 102, 22, 86, 54, 118,
  27.    15, 79, 47, 111, 31, 95, 63, 127,
  28. 14, 78, 46, 110, 30, 94, 62, 126,
  29. 1, 65, 33, 97, 17, 81, 49, 113,
  30. 9, 73, 41, 105, 25, 89, 57, 121,
  31. 5, 69, 37, 101, 21, 85, 53, 117,
  32. 13, 77, 45, 109, 29, 93, 61, 125,
  33. 3, 67, 35, 99, 19, 83, 51, 115,
  34. 11, 75, 43, 107, 27, 91, 59, 123,
  35. 7, 71, 39, 103, 23, 87, 55, 119,
  36. };
  37. char code sin_tabb[SAMPLE_NUM] = {
  38. 0, 6, 12, 18, 24, 30, 36, 42,
  39. 48, 54, 59, 65, 70, 75, 80, 85,
  40. 89, 94, 98, 102,105, 108, 112, 114,
  41. 117, 119, 121, 123, 124, 125, 126, 126,
  42. 126, 126, 126, 125, 124, 123, 121, 119,
  43. 117, 114, 112, 108, 105, 102, 98, 94,
  44. 89, 85, 80, 75, 70, 65, 59, 54,
  45. 48, 42, 36, 30, 24, 18, 12, 6,
  46. 0, -6, -12, -18, -24, -30,
  47. -36, -42, -48, -54, -59, -65, -70, -75,
  48. -80, -85, -89, -94, -98, -102, -105, -108,
  49. -112, -114, -117, -119, -121, -123, -124, -125,
  50. -126, -126, -126, -126, -126, -125, -124, -123,
  51. -121, -119, -117, -114, -112, -108, -105, -102,
  52. -98, -94, -89, -85, -80, -75, -70,
  53. -65, -59, -54, -48, -42, -36, -30,
  54. -24, -18, -12, -6};  

  55. char code cos_tabb[SAMPLE_NUM] = {127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94,

  56. 89, 85, 80, 75, 70, 65, 59, 54, 48, 42, 36, 30, 24, 18, 12, 6, 0, -6, -12, -18, -24, -30, -36, -42, -48, -54, -59,

  57. -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -

  58. 126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -89, -85, -80,

  59. -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6, 0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70,

  60. 75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126};
  61. xdata unsigned char result[128];
  62. xdata unsigned char temp[128];
  63. xdata unsigned char num[128];
  64. unsigned char anum,timernum,timernum2,lednum3,Ltime,t;//用于分离
  65. unsigned char lednum[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7的显示数组  P2组控制
  66. int xdata FftReal[SAMPLE_NUM];
  67. int xdata FftImage[SAMPLE_NUM];
  68.                                   ////开机显示字符************/////
  69. unsigned char code musicdisplay[]={
  70.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  71.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  72.                 0x3C,0x6E,0xED,0xFD,0xFD,0xED,0x6E,0x3C,
  73.                   0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00,//H
  74.                 0x00,0x1F,0x24,0x44,0x24,0x1F,0x00,0x00,//A
  75.                 0x00,0x7F,0x48,0x48,0x48,0x30,0x00,0x00,//P
  76.                 0x00,0x7F,0x48,0x48,0x48,0x30,0x00,0x00,//P
  77.                 0x00,0x70,0x08,0x07,0x08,0x70,0x00,0x00,//Y

  78.                 0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00,//N
  79.                 0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00,//E
  80.                 0x00,0x7C,0x02,0x07,0x1F,0x07,0x02,0x7C,//W

  81.                 0x00,0x70,0x08,0x07,0x08,0x70,0x00,0x00,//Y
  82.                 0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00,//E
  83.                 0x00,0x1F,0x24,0x44,0x24,0x1F,0x00,0x00,//A
  84.                 0x00,0x7F,0x48,0x4C,0x4A,0x31,0x00,0x00,//R
  85.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  86.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  87.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  88. };



  89. /////////// 列扫描端口
  90. sbit L24=P0^2;
  91. sbit L23=P0^1;
  92. sbit L22=P0^0;
  93. sbit L21=P1^3;
  94. sbit L20=P1^4;
  95. sbit L19=P1^5;
  96. sbit L18=P1^6;
  97. sbit L17=P1^7;

  98. sbit L16=P3^0;
  99. sbit L15=P3^1;
  100. sbit L14=P3^2;
  101. sbit L13=P3^3;
  102. sbit L12=P3^4;
  103. sbit L11=P3^5;
  104. sbit L10=P3^6;
  105. sbit L9=P3^7;

  106. sbit L8=P4^4;
  107. sbit L7=P4^5;
  108. sbit L6=P4^6;
  109. sbit L5=P0^7;
  110. sbit L4=P0^6;
  111. sbit L3=P0^5;
  112. sbit L2=P0^4;
  113. sbit L1=P0^3;
  114. void delay(unsigned char a)
  115. {
  116.         unsigned int i;
  117.         while(--a)
  118.                 for(i=0;i<50;i++);                                    
  119. }
  120. void off()
  121. {
  122.         LED = 0x00;
  123.         OFF
  124. //        delay(10-pwm);
  125. }
  126. void display(unsigned char i,unsigned char dat)
  127. {
  128.         P2=dat;
  129.         switch(i)
  130.         {
  131.                 case 1:L1=0;break;
  132.                 case 2:L2=0;break;
  133.                 case 3:L3=0;break;
  134.                 case 4:L4=0;break;
  135.                 case 5:L5=0;break;
  136.                 case 6:L6=0;break;
  137.                 case 7:L7=0;break;
  138.                 case 8:L8=0;break;
  139.                 case 9:L9=0;break;
  140.                 case 10:L10=0;break;
  141.                 case 11:L11=0;break;
  142.                 case 12:L12=0;break;
  143.                 case 13:L13=0;break;
  144.                 case 14:L14=0;break;
  145.                 case 15:L15=0;break;
  146.                 case 16:L16=0;break;
  147.                 case 17:L17=0;break;
  148.                 case 18:L18=0;break;
  149.                 case 19:L19=0;break;
  150.                 case 20:L20=0;break;
  151.                 case 21:L21=0;break;
  152.                 case 22:L22=0;break;
  153.                 case 23:L23=0;break;
  154.                 case 24:L24=0;break;
  155.         }
  156.         delay(pwm);
  157.         off();
  158. }
  159. void show_musicdisplay()
  160. {
  161.         unsigned char a,b,c;
  162.         for(c=0;c<80;c++)
  163.                 for(b=12;b>0;b--)
  164.                            for(a=1;a<25;a++)
  165.                                 display(a,musicdisplay[a-1+c]);
  166. }           
  167. void FFT_process()                          //下落迟滞
  168. {
  169.         unsigned char i;
  170.         for(i=0;i<24;i++)
  171.         {        
  172.                 if(result[i] < temp[i])
  173.                 {
  174.                         num[i]++;
  175.                         if(num[i] == 1)
  176.                         {
  177.                                 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&&temp[14]==0&&temp[15]==0&&temp[16]==0&&temp[17]==0&&temp[18]==0&&temp[19]==0&&temp[20]==0&&temp[21]==0&&temp[22]==0&&temp[23]==0&&temp[24]==0);
  178.                                 else
  179.                                 {
  180.                                         result[i] = --temp[i];
  181.                                         num[i] = 0;
  182.                                 }
  183.                         }
  184.                 }
  185.                 else
  186.                         num[i] = 0;               
  187.         }
  188. }
  189. void disp()
  190. {
  191. //        unsigned char i,j,buff;
  192.         timernum++;
  193.         if(timernum == 25)
  194.                 timernum = 1;
  195.            OFF
  196.         FFT_process();
  197.         /*for(i=0;i<16;i++)
  198.                 for(j=i+1;j<16;j++)
  199.                         if(result[j] > result[i])
  200.                         {
  201.                                 buff = result[i];
  202.                                 result[i] = result[j];
  203.                                 result[j] = buff;
  204.                         }*/                                          
  205.         switch(timernum)
  206.         {
  207.                 case 1:anum = result[0];L1=0;break;
  208.                 case 2:anum = result[1];L2=0;break;
  209.                 case 3:anum = result[2];L3=0;break;
  210.                 case 4:anum = result[3];L4=0;break;
  211.                 case 5:anum = result[4];L5=0;break;
  212.                 case 6:anum = result[5];L6=0;break;
  213.                 case 7:anum = result[6];L7=0;break;
  214.                 case 8:anum = result[7];L8=0;break;
  215.                 case 9:anum = result[8];L9=0;break;
  216.                 case 10:anum = result[9];L10=0;break;
  217.                 case 11:anum = result[10];L11=0;break;
  218.                 case 12:anum = result[11];L12=0;break;
  219.                 case 13:anum = result[12];L13=0;break;
  220.                 case 14:anum = result[13];L14=0;break;
  221.                 case 15:anum = result[14];L15=0;break;
  222.                 case 16:anum = result[15];L16=0;break;
  223.                 case 17:anum = result[16];L17=0;break;
  224.                 case 18:anum = result[17];L18=0;break;
  225.                 case 19:anum = result[18];L19=0;break;
  226.                 case 20:anum = result[19];L20=0;break;
  227.                 case 21:anum = result[20];L21=0;break;
  228.                 case 22:anum = result[21];L22=0;break;
  229.                 case 23:anum = result[22];L23=0;break;
  230.                 case 24:anum = result[23];L24=0;break;
  231.         }
  232.         if(anum >= 8)
  233.                 anum = FFT_OUT_MAX;
  234.         LED = lednum[anum];
  235. }
  236. void ADC_init()
  237. {
  238.         P1ASF = 0x01;                   //Open 8 channels ADC function
  239.     ADC_RES = 0;                    //Clear previous result
  240.         ADC_RESL= 0;
  241.     ADC_CONTR = ADC_POWER | ADC_SPEEDH;
  242.     delay(5);                       //ADC power-on and delay      
  243. }
  244. float ADC_read()
  245. {
  246. //delay(10);        
  247.     ADC_CONTR = ADC_POWER | ADC_SPEEDH  | ADC_START;
  248.     _nop_();                        //至少要延时4个时钟周期
  249.     _nop_();
  250.     _nop_();
  251.     _nop_();
  252.         _nop_();
  253.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  254.     ADC_CONTR &= ~ADC_FLAG;         //关闭ADC
  255.     return (ADC_RES*4+ADC_RESL);                 //Return ADC result
  256. }
  257. short sqrt_16(unsigned long M)   
  258. {
  259.     unsigned int N,i;
  260.     unsigned long tmp,ttp;
  261.     if( M == 0 )            
  262.         return 0;   
  263.     N = 0;  
  264.     tmp = (M >> 30);        
  265.     M <<= 2;
  266.     if( tmp > 1 )            
  267.     {
  268.         N++;               
  269.         tmp -= N;
  270.     }   
  271.     for( i=15; i>0; i-- )   
  272.     {
  273.         N <<= 1;                  
  274.         tmp <<= 2;
  275.         tmp += (M >> 30);         
  276.         ttp = N;
  277.         ttp = (ttp<<1)+1;        
  278.         M <<= 2;
  279.         if( tmp >= ttp )   
  280.         {
  281.             tmp -= ttp;
  282.             N ++;
  283.         }      
  284.     }   
  285.     return N;
  286. }
  287. void FFT()
  288. {
  289.     register unsigned char i,bb,j,k,p;
  290.     register short TR,TI,temp;
  291.     unsigned long ulReal,ulImage;                             
  292.         unsigned char max;

  293.     for(i=0;i<SAMPLE_NUM;i++)         
  294.     {
  295.                 FftReal[BRTable[i]] = ADC_read();
  296.         FftImage[i] = 0;
  297.     }         

  298.     for(i=1;i<=LOG;i++)                        
  299.     {
  300.         bb=1;
  301.         bb <<= (i-1);                                      
  302.         for(j=0;j<=bb-1;j++)                           
  303.         {
  304.             p=1;
  305.             p <<= (LOG-i);           
  306.             p = p*j;
  307.             for(k=j;k<SAMPLE_NUM;k=k+2*bb)               
  308.             {
  309.                 TR=FftReal[k];TI=FftImage[k];temp=FftReal[k+bb];
  310.                 FftReal[k]=FftReal[k]+((FftReal[k+bb]*cos_tabb[p])>>7)+((FftImage[k+bb]*sin_tabb[p])>>7);
  311.                 FftImage[k]=FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7)+((FftImage[k+bb]*cos_tabb[p])>>7);
  312.                 FftReal[k+bb]=TR-((FftReal[k+bb]*cos_tabb[p])>>7)-((FftImage[k+bb]*sin_tabb[p])>>7);
  313.                 FftImage[k+bb]=TI+((temp*sin_tabb[p])>>7)-((FftImage[k+bb]*cos_tabb[p])>>7);

  314.                 FftReal[k] >>= 1;            
  315.                 FftImage[k] >>= 1;
  316.                 FftReal[k+bb] >>= 1;                 
  317.                 FftImage[k+bb] >>= 1;                                                                              
  318.             }  
  319.         }
  320.     }

  321.    for(i=0;i<24;i++)
  322.     {  
  323.         ulReal = FftReal[i+1];
  324.         ulReal *= ulReal;
  325.         ulImage = FftImage[i+1];
  326.         ulImage *= ulImage;      
  327.         result[i] = sqrt_16(ulReal+ulImage);                                                                  

  328.     }
  329. /*        for(i=0;i<17;i++)
  330.     {
  331.                 while(result[i] > FFT_OUT_MAX)
  332.                 {
  333.                 for(i=0;i<17;i++)
  334.              {                        
  335.                         result[i] =result[i] -1;      
  336.                   }
  337.             }
  338.         }         */
  339.         while(result[i] == FFT_OUT_MIN)
  340.                 {
  341.                 for(i=0;i<24;i++)
  342.              {                        
  343.                         result[i] =result[i] +1;      
  344.                   }
  345.             }
  346.         for(i=0;i<24;i++)
  347.         {
  348.                 if(result[i] > FFT_OUT_MAX)
  349.                 {
  350.                         result[i] = FFT_OUT_MAX;      
  351.                         if(result[i] > max)
  352.                 max = result[i];
  353.                 }
  354.         }
  355.         //局部增益        */        /*                        
  356.                 /*if(max >= 4)               
  357.                 for(i=1;i<24;i++)
  358.                         if(result[i] >= 2)
  359.                                 result[i]+=1;          */
  360.                                                                  
  361. }            
  362. void init()
  363. {
  364.         P2M0=0XFF;
  365.         P2M1=0X00;
  366.         P3M0=0XFF;
  367.         P3M1=0X00;
  368.         P1M0=0XFE;
  369.         P1M1=0X01;
  370.         P4SW=0x70;

  371.         ADC_init();
  372.         //AUXR |= 0x80;                //定时器时钟1T模式
  373.         TMOD=0x01;
  374.         TH0=(65535-TIME)/256;
  375.         TL0=(65535-TIME)%256;
  376.     EA=1;
  377.         ET0=1;               
  378.         show_musicdisplay();  
  379.         TR0=1;
  380. }
  381. void main()
  382. {
  383.         init();
  384.     while(1)         
  385.         FFT();
  386. }
  387. void timer0() interrupt 1
  388. {
  389.         unsigned char i;
  390.         t++;
  391.         if(t == 24)
  392.         {
  393.                 for(i=0;i<24;i++)
  394.                         temp[i] = result[i];
  395.                 t = 0;
  396.         }                                   
  397.         disp();
  398.         TH0=(65535-TIME)/256;        
  399.         TL0=(65535-TIME)%256;
  400. }
复制代码


F3.75点阵频谱显示-单红色.pdf

67.91 KB, 下载次数: 66, 下载积分: 黑币 -5

原理图

评分

参与人数 1黑币 +8 收起 理由
ssfc + 8 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:156449 发表于 2016-12-22 11:27 | 只看该作者
51黑有你更精彩!!
回复

使用道具 举报

板凳
ID:99130 发表于 2016-12-24 12:36 | 只看该作者
P0口需要接上拉电阻才行,不然带不动。另外,用led的话,每一列需要加三极管驱动。总体来说还是很不错的一个帖子。
回复

使用道具 举报

地板
ID:99130 发表于 2016-12-24 18:08 | 只看该作者
越快乐越堕落 发表于 2016-12-24 12:36
P0口需要接上拉电阻才行,不然带不动。另外,用led的话,每一列需要加三极管驱动。总体来说还是很不错的一 ...

或者不用上拉电阻也行,把P0口设置成强推挽就可以了
回复

使用道具 举报

5#
ID:157393 发表于 2016-12-25 00:14 | 只看该作者
好方便DIY路过看下!
回复

使用道具 举报

6#
ID:136460 发表于 2016-12-28 18:57 | 只看该作者
好人啊,
回复

使用道具 举报

7#
ID:694488 发表于 2020-3-2 10:04 | 只看该作者
大佬有没有原理图和元件清单
回复

使用道具 举报

8#
ID:694488 发表于 2020-3-2 13:17 | 只看该作者
下载的资料里只有PCB 原理图 ,没有元件清单。型号太多怎么找
回复

使用道具 举报

9#
ID:283883 发表于 2021-8-11 07:47 | 只看该作者
方便告诉下点阵型号吗,因为是双色的。谢谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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