找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1512|回复: 4
收起左侧

32*64点阵音乐频谱 单片机程序有小BUG 如何修改呢?

[复制链接]
ID:39866 发表于 2021-5-18 13:06 | 显示全部楼层 |阅读模式
此本程序有小BUG

单片机使用STC12C5A60S2单片机24M晶振  响应速度还行,基本跟得上音乐节奏
就是有两行灯特别亮,其他的有点暗,而且有频闪感觉,像是交流供电的感觉。
哪位得神帮忙修改一下。

电路如下:
捕获.JPG


  1. #include "stc12c5a60s2.h"
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define   FOSC 30000000L
  6. #define   BAUD 9600
  7. typedef   unsigned  char   BYTE;
  8. typedef   unsigned  int   WORD;

  9. /*Define ADC operation const for ADC_CONTR*/
  10. #define   ADC_POWER   0x80    //ADC power control bit
  11. #define   ADC_FLAG    0x10    //ADC complete flag
  12. #define   ADC_START   0x08    //ADC start control bit
  13. //#define   ADC_STOP   0x08
  14. #define   ADC_SPEEDLL   0x00    //540 clocks
  15. #define   ADC_SPEEDL   0x20    //360 clocks
  16. #define   ADC_SPEEDH   0x40    //180 clocks
  17. #define   ADC_SPEEDHH   0x60    //90 clocks

  18. #define  scan0    {IA=0;IB=0;IC=0;ID=0;}
  19. #define  scan1    {IA=1;IB=0;IC=0;ID=0;}
  20. #define  scan2    {IA=0;IB=1;IC=0;ID=0;}
  21. #define  scan3    {IA=1;IB=1;IC=0;ID=0;}
  22. #define  scan4    {IA=0;IB=0;IC=1;ID=0;}
  23. #define  scan5    {IA=1;IB=0;IC=1;ID=0;}
  24. #define  scan6    {IA=0;IB=1;IC=1;ID=0;}
  25. #define  scan7    {IA=1;IB=1;IC=1;ID=0;}
  26. #define  scan8    {IA=0;IB=0;IC=0;ID=1;}
  27. #define  scan9    {IA=1;IB=0;IC=0;ID=1;}
  28. #define scan10    {IA=0;IB=1;IC=0;ID=1;}
  29. #define scan11    {IA=1;IB=1;IC=0;ID=1;}
  30. #define scan12    {IA=0;IB=0;IC=1;ID=1;}
  31. #define scan13    {IA=1;IB=0;IC=1;ID=1;}
  32. #define scan14    {IA=0;IB=1;IC=1;ID=1;}
  33. #define scan15    {IA=1;IB=1;IC=1;ID=1;}











  34. void scan(unsigned char Value);
  35. void InitUart();
  36. void SendData(BYTE dat);
  37. void Delay(WORD n);
  38. void InitADC();
  39. void FFT();
  40. void scan(unsigned char Value);
  41. BYTE   ch = 0;    //ADC channel NO.
  42. BYTE   a = 0x55;    //ADC channel NO.



  43. //放大128倍后的sin整数表(128)        
  44. code char SIN_TAB[64] = { 0x00, 0x0c, 0x18, 0x24, 0x30, 0x3b, 0x46, 0x50,
  45. 0x59, 0x62, 0x69, 0x70, 0x75, 0x79, 0x7c, 0x7e,
  46. 0x7f, 0x7e, 0x7c, 0x79, 0x75, 0x70, 0x69, 0x62,
  47. 0x59, 0x50, 0x46, 0x3b, 0x30, 0x24, 0x18, 0x0c,
  48. 0x00, -0x0c, -0x18, -0x24, -0x30, -0x3b, -0x46, -0x50,
  49. -0x59, -0x62, -0x69, -0x70, -0x75, -0x79, -0x7c, -0x7e,
  50. -0x7f, -0x7e, -0x7c, -0x79, -0x75, -0x70, -0x69, -0x62,
  51. -0x59, -0x50, -0x46, -0x3b, -0x30, -0x24, -0x18, -0x0c,
  52. };

  53. //放大128倍后的cos整数表(128)
  54. code char COS_TAB[64] = { 0x7f, 0x7e, 0x7c, 0x79, 0x75, 0x70, 0x69, 0x62,
  55. 0x59, 0x50, 0x46, 0x3b, 0x30, 0x24, 0x18, 0x0c,
  56. 0x00, -0x0c, -0x18, -0x24, -0x30, -0x3b, -0x46, -0x50,
  57. -0x59, -0x62, -0x69, -0x70, -0x75, -0x79, -0x7c, -0x7e,
  58. -0x7f, -0x7e, -0x7c, -0x79, -0x75, -0x70, -0x69, -0x62,
  59. -0x59, -0x50, -0x46, -0x3b, -0x30, -0x24, -0x18, -0x0c,
  60. 0x00, 0x0c, 0x18, 0x24, 0x30, 0x3b, 0x46, 0x50,
  61. 0x59, 0x62, 0x69, 0x70, 0x75, 0x79, 0x7c, 0x7e,
  62. };

  63. //采样存储序列表
  64. code char LIST_TAB[64] = { 0, 32, 16, 48, 8, 40, 24, 56,
  65. 4, 36, 20, 52, 12, 44, 28, 60,
  66. 2, 34, 18, 50, 10, 42, 26, 58,
  67. 6, 38, 22, 54, 14, 46, 30, 62,
  68. 1, 33, 17, 49, 9, 41, 25, 57,
  69. 5, 37, 21, 53, 13, 45, 29, 61,
  70. 3, 35, 19, 51, 11, 43, 27, 59,
  71. 7, 39, 23, 55, 15, 47, 31, 63
  72. };
  73. int xdata Fft_Real[64]=0XFF;
  74. int xdata Fft_Image[64]=0XFF;               // fft的虚部
  75. uchar xdata LED_TAB2[32]=0XFF;                                //记录 漂浮物 是否需要 停顿一下
  76. uchar xdata LED_TAB[32]=0XFF;                                //记录红色柱状
  77. uchar xdata LED_TAB1[32]=0XFF;                                //记录 漂浮点

  78. //sbit  SDA_R=P4^4;        //下半屏红色数据
  79. //sbit  SDA_R_TOP=P2^7;//上半屏红色数据
  80. sbit  SDA_R=P2^4;        //下半屏红色数据
  81. sbit  SDA_R_TOP=P2^3;//上半屏红色数据
  82. sbit  SDA_G=P2^6;//下半屏绿色数据                                
  83. sbit  SDA_G_TOP=P2^5;
  84. sbit  STCP=P4^1;
  85. sbit  SHCP=P2^7;
  86. sbit OE=P0^4;                        ////输出使能
  87. sbit IA  =P4^0;  //行控制线A
  88. sbit IB  =P2^0;  //行控制线B
  89. sbit IC  =P2^1;  //行控制线C
  90. sbit ID  =P2^2;  //行控制线D


  91. sbit Key_light=P1^5;                        //亮度控制
  92. sbit key_moda=P3^0;                        //模式转换
  93. sbit key_color=P3^1;                        //颜色切换
  94. //sbit key_Down=P3^3;                        //时钟减
  95. void Scan_Mode();




  96. uchar COUNT=15,COUNT1=0,ADC_Count=0,LINE=15,G,T;
  97. uchar i,j,k,b,p;                 
  98. int Temp_Real,Temp_Imag,temp;                // 中间临时变量  
  99. uint TEMP1;
  100. uchar PWM;
  101. uchar Mode=0;//模式          0-2
  102. uchar color=1;                 //0-7
  103. uchar Stop_time=0;
  104. uchar stop=0;
  105. uchar count_time=0;
  106. uchar Light=0;
  107. uchar fractional_frequency=24;//分频


  108. /*----------------------------ADC interrupt service routine
  109. ----------------------------*/

  110. void adc_isr() interrupt 5 using 1
  111. {
  112. OE=0;
  113. EADC=0;        //ADC中断关
  114. ADC_CONTR &= !ADC_FLAG;   //每次中断后重新置0
  115. Fft_Real[LIST_TAB[ADC_Count]]=(int)((ADC_RES*3)<<2)+(ADC_RESL)*2;//-512;
  116.          //ADC_RES:A/D转换结果寄存器高,ADC_RESL:A/D转换结果寄存器低
  117.    
  118.                  if(ADC_Count<64) //采集64个AD值 没有滤波
  119.                    ADC_Count++;

  120. ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | ch; //重新开启ADC        保正每扫描一行取样一次(如果在中断中实时频繁取样会闪得厉害和有干扰问题)

  121. }
  122. /*----------------------------Initial ADC sfr
  123. ----------------------------*/


  124. void main()
  125. {
  126. //uchar i;
  127. InitUart();    //Init UART, use to show ADC result
  128. InitADC();    //Init ADC sfr
  129. IE = 0xa0;    //Enable ADC interrupt and Open master interrupt switch
  130. P4SW=0x30;
  131. P4M0=0x30;
  132. P4M1=0x00;
  133. ADC_Count=0;
  134. EADC=1;         //开启ADC中断
  135. while(1)
  136. {



  137. if(ADC_Count==64)//等待取样到64个点
  138.       {





  139.      OE=0;  //必需关138,否则会有点闪
  140.                 for(i=0;i<64;i++)
  141.               {
  142.                  Fft_Image[i]=0; //虚部清0


  143.               }

  144.                FFT();

  145.                ADC_Count=0;


  146.           }


  147.                
  148.                 if(key_moda==0) //按键S2 模式改变  16与64分频
  149.                 {
  150.                  Delay(1) ;
  151.                         if(key_moda==0)
  152.                         {
  153.                              Mode++;
  154.                                  if(Mode>2)
  155.                                  {
  156.                                       
  157.                                           Mode=0;        
  158.                                  }

  159.                                  Scan_Mode();         //16还是64分频的扫描模式
  160.                
  161.                         }
  162.                         while(key_moda==0);
  163.                 }
  164. //******************************************/
  165.                 if(key_color==0) //送颜色按键 3   柱条颜色改变
  166.                 {
  167.                         Delay(1) ;
  168.                         if(key_color==0)
  169.                         {
  170.                              color++;
  171.                                  if(color>7)
  172.                                  {
  173.                                       color=0;        
  174.                                  }

  175.                         }
  176.                 while(key_color==0);
  177.                 }
  178. //**********************************
  179.                 if(Key_light==0) //亮度控制
  180.                 {
  181.                 Delay(1) ;
  182.                         if(Key_light==0)
  183.                         {
  184.                              Light++;
  185.                                  if(Light>11)
  186.                                  {
  187.                                       Light=1;        
  188.                                  }
  189.                
  190.                                                 
  191.                         }
  192.                 //        while(Key_light==0);
  193.                 }
  194.                

  195. //////////////////////以下只产生一行扫描动作///////////////////////////////////////////////////////////////////////////////        
  196.                                 
  197. //        for        (G=1;G<fractional_frequency+1;G++)                                                  //往点阵屏送 一行的 数据 (fractional_frequency=16 对应16条光柱,每一次G++就送出下一位光柱)
  198.   for        (G=0;G<fractional_frequency;G++)
  199.         {                                
  200.                 if(color==0)  //如果是柱状红色
  201.                 {

  202.         
  203.                         if(LED_TAB[G]<=LINE+16)                ///////////上半屏    LED_TAB[G]记录着1至32级其中一级的功率值,LINE扫描行数初始15,LED_TAB[G]存着FFT值,
  204.                                 SDA_R_TOP=1;        //熄灭
  205.                         else
  206.                                 SDA_R_TOP=0;  //点亮
  207.                         if(LED_TAB[G]<=LINE)        /////////////下半屏LINE--
  208.                                 SDA_R=1;
  209.                         else
  210.                                 SDA_R=0;

  211.                         if(LED_TAB1[G]==LINE)        /////////////// 记录浮点
  212.                           {
  213.                                 SDA_G_TOP=1;
  214.                                 SDA_G=0;

  215.                            }
  216.                         else if(LED_TAB1[G]==(LINE+16))
  217.                            {
  218.                                 SDA_G_TOP=0;
  219.                                 SDA_G=1;

  220.                             }
  221.                         else
  222.                                 SDA_G=SDA_G_TOP=1;

  223.                                                            SHCP=1;
  224.                                         SHCP=0;
  225.                 }


  226.                                  
  227.                 if(color==1)  //如果是柱状绿色 浮点红色
  228.                 {

  229.         
  230.                         if(LED_TAB[G]<=LINE+16)                ///////////上半屏    LED_TAB[G]记录着1至32级其中一级的功率值,LINE扫描行数初始15,LED_TAB[G]存着FFT值,
  231.                                 SDA_G_TOP=1;        //熄灭
  232.                         else
  233.                                 SDA_G_TOP=0;  //点亮
  234.                         if(LED_TAB[G]<=LINE)        /////////////下半屏LINE--
  235.                                 SDA_G=1;
  236.                         else
  237.                                 SDA_G=0;

  238.                         if(LED_TAB1[G]==LINE)        /////////////// 记录浮点
  239.                           {
  240.                                 SDA_R_TOP=1;
  241.                                 SDA_R=0;

  242.                            }
  243.                         else if(LED_TAB1[G]==(LINE+16))
  244.                            {
  245.                                 SDA_R_TOP=0;
  246.                                 SDA_R=1;

  247.                             }
  248.                         else
  249.                                 SDA_R=SDA_R_TOP=1;

  250.                                                            SHCP=1;
  251.                                         SHCP=0;
  252.                 }




  253.         if(color==2)  //如果是柱状橙色 无浮点
  254.                   {

  255.         
  256.                         if(LED_TAB[G]<=LINE+16)                ///////////上半屏    LED_TAB[G]记录着1至32级其中一级的功率值,LINE扫描行数初始15,LED_TAB[G]存着FFT值,
  257.                                  {
  258.                                 
  259.                             SDA_G_TOP=1;        //熄灭
  260.                                 SDA_R_TOP=1;        //熄灭
  261.                                 }
  262.                         else
  263.                        {
  264.                             SDA_G_TOP=0;  //点亮
  265.                                 SDA_R_TOP=0;        //熄灭
  266.                                 }
  267.                         if(LED_TAB[G]<=LINE)        /////////////下半屏LINE--
  268.                                 {
  269.                                 SDA_G=1;
  270.                                 SDA_R=1;
  271.                                 }

  272.                         else
  273.                            
  274.                            {
  275.                             SDA_G=0;
  276.                                 SDA_R=0;
  277.                                 }
  278.                                            SHCP=1;
  279.                                 SHCP=0;
  280.                 }


  281.          if(color==3)  //如果是柱状橙色 无浮点
  282.                   {

  283.         
  284.                         if(LED_TAB[G]<=LINE+16)                ///////////上半屏    LED_TAB[G]记录着1至32级其中一级的功率值,LINE扫描行数初始15,LED_TAB[G]存着FFT值,
  285.                                  {
  286.                                 
  287.                             SDA_G_TOP=1;        
  288.                         
  289.                                 }
  290.                         else
  291.                        {
  292.                             SDA_G_TOP=0;  
  293.                
  294.                                 }
  295.                         if(LED_TAB[G]<=LINE)        /////////////下半屏LINE--
  296.                                 {
  297.                                 SDA_G=1;
  298.         
  299.                                 }

  300.                         else
  301.                            
  302.                            {
  303.                             SDA_G=0;
  304.                
  305.                                 }
  306.                                            SHCP=1;
  307.                                 SHCP=0;
  308.                 }
  309.                         if(color==4)  //如果是柱状橙色 无浮点
  310.                   {

  311.         
  312.                         if(LED_TAB[G]<=LINE+16)                ///////////上半屏    LED_TAB[G]记录着1至32级其中一级的功率值,LINE扫描行数初始15,LED_TAB[G]存着FFT值,
  313.                                  {
  314.                                 
  315.                           
  316.                                 SDA_R_TOP=1;        //熄灭
  317.                                 }
  318.                         else
  319.                        {
  320.                         
  321.                                 SDA_R_TOP=0;        //熄灭
  322.                                 }
  323.                         if(LED_TAB[G]<=LINE)        /////////////下半屏LINE--
  324.                                 {
  325.         
  326.                                 SDA_R=1;
  327.                                 }

  328.                         else
  329.                            
  330.                            {
  331.         
  332.                                 SDA_R=0;
  333.                                 }
  334.                                            SHCP=1;
  335.                                 SHCP=0;
  336.                 }


  337.                   if(color==5)  //如果是浮点红色
  338.                 {



  339.                         if(LED_TAB1[G]==LINE)        /////////////// 记录浮点
  340.                           {
  341.                                 SDA_G_TOP=1;
  342.                                 SDA_G=0;

  343.                            }
  344.                         else if(LED_TAB1[G]==(LINE+16))
  345.                            {
  346.                                 SDA_G_TOP=0;
  347.                                 SDA_G=1;

  348.                             }
  349.                         else
  350.                                 SDA_G=SDA_G_TOP=1;

  351.                                                            SHCP=1;
  352.                                         SHCP=0;
  353.                 }
  354.                             if(color==6)  //如果是浮点红色
  355.                 {



  356.                         if(LED_TAB1[G]==LINE)        /////////////// 记录浮点
  357.                           {
  358.                                 SDA_R_TOP=1;
  359.                                 SDA_R=0;

  360.                            }
  361.                         else if(LED_TAB1[G]==(LINE+16))
  362.                            {
  363.                                 SDA_R_TOP=0;
  364.                                 SDA_R=1;

  365.                             }
  366.                         else
  367.                                 SDA_R=SDA_R_TOP=1;

  368.                                                            SHCP=1;
  369.                                         SHCP=0;
  370.                 }
  371.                                   if(color==7)  //如果是浮点红色
  372.                 {



  373.                         if(LED_TAB1[G]==LINE)        /////////////// 记录浮点
  374.                           {
  375.                 SDA_R_TOP=SDA_G_TOP=1;
  376.                                 SDA_R=SDA_G=0;

  377.                            }
  378.                         else if(LED_TAB1[G]==(LINE+16))
  379.                            {
  380.                                 SDA_R_TOP=SDA_G_TOP=0;
  381.                                 SDA_R=SDA_G=1;

  382.                             }
  383.                         else
  384.                                 SDA_R_TOP=SDA_R=SDA_G=SDA_G_TOP=1;

  385.                                                            SHCP=1;
  386.                                         SHCP=0;
  387.                 }
  388.                
  389.         /*        else if(color==1)  //如果是柱状 绿色漂浮点是红色
  390.                 {        
  391.                         if(LED_TAB[G]<=LINE+16)
  392.                                 SDA_G_TOP=1;
  393.                         else
  394.                                 SDA_G_TOP=0;
  395.                         if(LED_TAB[G]<=LINE)
  396.                                 SDA_G=1;
  397.                         else
  398.                                 SDA_G=0;
  399.         
  400.                         if(LED_TAB1[G]==LINE)
  401.                           {
  402.                                 SDA_R_TOP=1;
  403.                                 SDA_R=0;
  404.                           }
  405.                         else if(LED_TAB1[G]==(LINE+16))
  406.                           {
  407.                                 SDA_R_TOP=0;
  408.                                 SDA_R=1;
  409.                           }
  410.                         else
  411.                                 SDA_R=SDA_R_TOP=1;
  412.                                                            SHCP=1;
  413.                                         SHCP=0;

  414.                
  415.                 }
  416.                 else if(color==2)  //如果是柱状 绿色 漂浮点是黄色
  417.                 {               
  418.                         if(LED_TAB1[G]==LINE)
  419.                           {
  420.                                 SDA_R_TOP=SDA_G_TOP=1;
  421.                                 SDA_R=SDA_G=0;
  422.                           }
  423.                         else if(LED_TAB1[G]==(LINE+16))
  424.                           {
  425.                                 SDA_R_TOP=SDA_G_TOP=0;
  426.                                 SDA_R=SDA_G=1;
  427.                            }
  428.                         else
  429.                                 {
  430.                                   SDA_R=SDA_R_TOP=1;
  431.                                   SDA_G=SDA_G_TOP=1;
  432.                                 }
  433.                         if((LED_TAB[G]<=LINE+16)&&(LED_TAB1[G]!=(LINE+16)))
  434.                                 SDA_G_TOP=1;
  435.                         else
  436.                                 SDA_G_TOP=0;
  437.                         if((LED_TAB[G]<=LINE)&&(LED_TAB1[G]!=LINE))
  438.                                 SDA_G=1;
  439.                         else
  440.                                 SDA_G=0;
  441.                                                       SHCP=1;
  442.                                     SHCP=0;
  443.                
  444.                 }
  445.                 if(color==3)  //如果是 柱状红色 漂浮点是黄色
  446.                 {                        
  447.                         if(LED_TAB1[G]==LINE)
  448.                           {
  449.                                 SDA_R_TOP=SDA_G_TOP=1;
  450.                                 SDA_R=SDA_G=0;
  451.                            }
  452.                         else if(LED_TAB1[G]==(LINE+16))
  453.                           {
  454.                                 SDA_R_TOP=SDA_G_TOP=0;
  455.                                 SDA_R=SDA_G=1;
  456.                            }
  457.                         else
  458.                            {
  459.                                         SDA_R=SDA_R_TOP=1;
  460.                                         SDA_G=SDA_G_TOP=1;
  461.                                 }
  462.                         if((LED_TAB[G]<=LINE+16)&&(LED_TAB1[G]!=(LINE+16)))
  463.                                 SDA_R_TOP=1;  
  464.                         else
  465.                                 SDA_R_TOP=0;
  466.                         if((LED_TAB[G]<=LINE)&&(LED_TAB1[G]!=LINE))
  467.                                 SDA_R=1;
  468.                         else
  469.                                 SDA_R=0;
  470.                                 
  471.                                             SHCP=1;
  472.                                 SHCP=0;
  473.                 }
  474. */               
  475.                    if(fractional_frequency==16) //如果是16分频 送2次一样的数据 中间送个空格
  476.                 {

  477.                         SHCP=1;
  478.                         SHCP=0;         //发送2次上一次的点亮数据  (时钟)
  479.                         SHCP=1;
  480.                         SHCP=0;
  481.                         /////////////////////
  482.                         SDA_G_TOP=1;
  483.                         SDA_G=1;                //这里送上熄灭数据
  484.                         SDA_R_TOP=1;
  485.                         SDA_R=1;
  486.                         ////////////////////
  487.                         SHCP=1;
  488.                         SHCP=0;          //发送1位熄灭数据   (时钟)
  489.                 }

  490.         

  491.          if(fractional_frequency==32) //如果是16分频 送2次一样的数据 中间送个空格
  492.                 {

  493.                         /////////////////////
  494.                         SDA_G_TOP=1;
  495.                         SDA_G=1;                //这里送上熄灭数据
  496.                         SDA_R_TOP=1;
  497.                         SDA_R=1;
  498.                         ////////////////////
  499.                         SHCP=1;
  500.                         SHCP=0;          //发送1位熄灭数据   (时钟)
  501.                 }



  502.           if(fractional_frequency==24) //如果是16分频 送2次一样的数据 中间送个空格
  503.                  {

  504.                         SHCP=1;
  505.                         SHCP=0;         //发送2次上一次的点亮数据  (时钟)

  506.                         /////////////////////
  507.                         SDA_G_TOP=1;
  508.                         SDA_G=1;                //这里送上熄灭数据
  509.                         SDA_R_TOP=1;
  510.                         SDA_R=1;
  511.                         ////////////////////
  512.                         SHCP=1;
  513.                         SHCP=0;          //发送1位熄灭数据   (时钟)
  514.                 }













  515.         }
  516. ////////////////////////////////////////////////////////////////////////
  517.         for(j=0;j<1;j++) //根据是16分频 与64分频 来判断柱状递减的速度 ///////////////
  518.         {
  519.                    if(LED_TAB[COUNT]>0)
  520.                         LED_TAB[COUNT]--;                   //(CORNT初始15)柱状递减,
  521.            //////////////////////////////////////
  522.                  if(COUNT>0)
  523.                         COUNT--;        
  524.                 else
  525.                 {

  526.                           COUNT=fractional_frequency;
  527.                 }
  528.                 ///////////////////////////////
  529.         }
  530.         

  531. //////////////////////////////////////////////////
  532.         if(fractional_frequency==16)   //判断是否是16分频
  533.            {
  534.                count_time++;
  535.                 if(count_time==1)
  536.                    {
  537.                         count_time=0;
  538.                         Stop_time=1;        
  539.                     }                                          //设置16或64分频递减时间
  540.         
  541.                
  542.            }
  543.         else  //如果是64分频
  544.            {
  545.                 Stop_time=2;         
  546.             }

  547. ////////////////////////////////////////////////////

  548. for(j=0;j<Stop_time;j++)        //16  Stop_time 变量漂浮点递减速度控制

  549.         {
  550.                    if(LED_TAB2[COUNT1]==0)
  551.                    {
  552.                            if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])
  553.                                 LED_TAB1[COUNT1]--;
  554.                    }
  555.                    else
  556.                         LED_TAB2[COUNT1]--;
  557.                        COUNT1++;
  558.         }
  559. ////////////////////////////////////////////////////
  560. if(fractional_frequency==16)
  561.         {
  562.                 if(COUNT1>=fractional_frequency+1)
  563.                    COUNT1=0;        
  564.         }
  565. else
  566.         {
  567.                 if(COUNT1>=fractional_frequency)
  568.                         COUNT1=0;
  569.         }
  570. //*******************************************************************
  571.         OE=0;
  572. //////////////////////////////////
  573. //ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | ch; //重新开启ADC        保正每扫描一行取样一次(如果在中断中实时频繁取样会闪得厉害和有干扰问题)
  574. EADC=1;        //ADC中断开
  575. ////////////////////////////










  576.         STCP=0;
  577.         STCP=1;          //595锁存时钟


  578.         scan(15-LINE); //行扫描




  579.   OE=0;        
  580.         if(LINE>0)
  581.                 LINE--;
  582.         else
  583.                 {                        
  584.                         LINE=15;

  585.                 }




  586.    }

  587.   


  588. }

  589. void InitADC( )
  590. {

  591.   P1ASF = 0x01;                //00000010, 将 P1.1 置成模拟口那一位为1那一位就为输入口
  592.   AUXR1 &=0xFB;          //1111,1011, 令ADRJ=0时,10A/D转换后高8位在ADC_RES中,低2位在ADC_RESL中,为1时相反
  593. ADC_RES = 0;    //Clear previous result
  594. ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  595. Delay(10);    //ADC power-on delay and Start A/D conversion
  596. }
  597. /*----------------------------Initial UART
  598. ----------------------------*/

  599. void InitUart()
  600. {
  601. SCON = 0x5a;    //8 bit data ,no parity bit
  602. TMOD = 0x20;    //T1 as 8-bit auto reload
  603. TH1 = TL1 = -(FOSC/12/32/BAUD);   //Set Uart baudrate

  604. //TH1=TL1=-(FOSC/12/32/BAUD);
  605. TR1 = 1;    //T1 start running
  606. }
  607. /*----------------------------Send one byte data to PC
  608. Input: dat (UART data)
  609. Output:-----------------------------*/
  610. void SendData(BYTE dat)
  611. {
  612. while (!TI);    //Wait for the previous data is sent
  613. TI = 0;    //Clear TI flag
  614. SBUF = dat;    //Send current data
  615. }
  616. /*----------------------------Software delay function
  617. ----------------------------*/
  618. void Delay(WORD n)
  619. {
  620. WORD x;
  621. while (n--)
  622. {
  623. x = 5000;
  624. while (x--);
  625. }
  626. }
  627. void FFT()
  628. {               
  629.     for( i=1; i<=6; i++)                            /* for(1) */
  630.     {
  631.         b=1;
  632.         b <<=(i-1);                                       //碟式运算,用于计算 隔多少行计算 例如 第一极 1和2行计算,,第二级
  633.         for( j=0; j<=b-1; j++)                              /* for (2) */
  634.         {
  635.             p=1;
  636.             p <<= (7-i);            
  637.             p = p*j;
  638.             for( k=j; k<64; k=k+2*b)                /* for (3) 基二fft */
  639.             {
  640.                 Temp_Real = Fft_Real[k];
  641.                                 Temp_Imag = Fft_Image[k];
  642.                                 temp = Fft_Real[k+b];
  643.                 Fft_Real[k] = Fft_Real[k] + ((Fft_Real[k+b]*COS_TAB[p])>>7) + ((Fft_Image[k+b]*SIN_TAB[p])>>7);
  644.                 Fft_Image[k] = Fft_Image[k] - ((Fft_Real[k+b]*SIN_TAB[p])>>7) + ((Fft_Image[k+b]*COS_TAB[p])>>7);
  645.                 Fft_Real[k+b] = Temp_Real - ((Fft_Real[k+b]*COS_TAB[p])>>7) - ((Fft_Image[k+b]*SIN_TAB[p])>>7);
  646.                 Fft_Image[k+b] = Temp_Imag + ((temp*SIN_TAB[p])>>7) - ((Fft_Image[k+b]*COS_TAB[p])>>7);     
  647.                 // 移位.防止溢出. 结果已经是本值的 1/64               
  648.                       Fft_Real[k] >>= 1;            
  649.                 Fft_Image[k] >>= 1;
  650.                        Fft_Real[k+b]  >>= 1;                 
  651.                 Fft_Image[k+b]  >>= 1;

  652.                                                                               
  653.             }     
  654.         }
  655.     }
  656. //        Fft_Real[0]=Fft_Image[0]=0;                  //去掉直流分量

  657.    for(j=0;j<=fractional_frequency;j++)        //转换记录一行16列功率值
  658.         {
  659.                 TEMP1=((((Fft_Real[j]* Fft_Real[j]))+((Fft_Image[j]*Fft_Image[j]))));//求功率
  660.                 //以下将功率转为一列32级,对应LED32个点
  661.         if(TEMP1<4)
  662.                         TEMP1=0;
  663.         else if(TEMP1<9)
  664.                         TEMP1=1;
  665.         else if(TEMP1<16)
  666.                         TEMP1=2;
  667.         else if(TEMP1<25)
  668.                         TEMP1=3;
  669.         else if(TEMP1<36)
  670.                         TEMP1=4;
  671.         else if(TEMP1<49)
  672.                         TEMP1=5;
  673.         else if(TEMP1<55)
  674.                         TEMP1=6;
  675.         else if(TEMP1<60)
  676.                         TEMP1=7;
  677.         else if(TEMP1<65)
  678.                         TEMP1=8;
  679.         else if(TEMP1<70)
  680.                         TEMP1=9;
  681.         else if(TEMP1<75)
  682.                         TEMP1=10;
  683.         else if(TEMP1<80)
  684.                         TEMP1=11;
  685.         else if(TEMP1<96)
  686.                         TEMP1=12;
  687.         else if(TEMP1<125)
  688.                         TEMP1=13;
  689.         else if(TEMP1<156)
  690.                         TEMP1=14;
  691.         else if(TEMP1<189)
  692.                         TEMP1=15;
  693.         else if(TEMP1<224)
  694.                         TEMP1=16;
  695.         else if(TEMP1<261)
  696.                         TEMP1=17;
  697.         else if(TEMP1<300)
  698.                         TEMP1=18;
  699.         else if(TEMP1<341)
  700.                         TEMP1=19;
  701.         else if(TEMP1<384)
  702.                         TEMP1=20;
  703.         else if(TEMP1<429)
  704.                         TEMP1=21;
  705.         else if(TEMP1<476)
  706.                         TEMP1=22;
  707.         else if(TEMP1<525)
  708.                         TEMP1=23 ;
  709.         else if(TEMP1<576)
  710.                         TEMP1=24;
  711.         else if(TEMP1<629)
  712.                         TEMP1=25;
  713.         else if(TEMP1<684)
  714.                         TEMP1=26;
  715.         else if(TEMP1<741)
  716.                         TEMP1=27;
  717.         else if(TEMP1<800)
  718.                         TEMP1=28;
  719.         else if(TEMP1<861)
  720.                         TEMP1=29;
  721.         else if(TEMP1<1024)
  722.                         TEMP1=30;
  723.         else
  724.                         TEMP1=31;
  725.         
  726.             if(TEMP1>(LED_TAB[j]))
  727.                         LED_TAB[j]=TEMP1;   ////////////////开始j=17  j--     
  728.         if(TEMP1>(LED_TAB1[j]))
  729.         {   
  730.                         LED_TAB1[j]=TEMP1;
  731.             LED_TAB2[j]=80;  //12                                              //提顿速度=12
  732.         }
  733.         }
  734.   
  735.    
  736. }

  737. void scan(unsigned char Value)
  738. {switch(Value)
  739.         {case  0: scan0;break;
  740.                   case  1: scan1;break;
  741.                    case  2: scan2;break;
  742.                     case  3: scan3;break;
  743.              case  4: scan4;break;
  744.                       case  5: scan5;break;
  745.                        case  6: scan6;break;
  746.                         case  7: scan7;break;
  747.                  case  8: scan8;break;
  748.                        case  9: scan9;break;
  749.                       case 10:scan10;break;
  750.                      case 11:scan11;break;
  751.             case 12:scan12;break;
  752.                   case 13:scan13;break;
  753.                  case 14:scan14;break;
  754.             case 15:scan15;break;
  755.            default:break;
  756.         }
  757. }

  758. void Scan_Mode()   //扫描模式
  759. {
  760.         switch (Mode)
  761.         {
  762.                 case 0x00:
  763.                         fractional_frequency=16; //16分频
  764.                         break;
  765.                 case 0x01:
  766.                         fractional_frequency=24;// 64分频
  767.                         break;
  768.                 case 0x02:
  769.                         fractional_frequency=32; //预留功能

  770.                         break;
  771.                 default:
  772.                         fractional_frequency=64;//否则为16分频
  773.                         break;
  774.         }        
  775. }
复制代码





修改版64X32.zip (74.79 KB, 下载次数: 13)
回复

使用道具 举报

ID:419909 发表于 2021-5-18 20:34 | 显示全部楼层
这个扫描式的.而且有中断干扰.最容易闪和亮度不均匀了.很难调的.这种不适合做成品.试验练手来了解原理差不多.真正实用.还是要用专用芯片处理.单独的显示模块.采样处理与显示各自独立.
回复

使用道具 举报

ID:39866 发表于 2021-5-18 20:39 | 显示全部楼层
wfqxgw 发表于 2021-5-18 20:34
这个扫描式的.而且有中断干扰.最容易闪和亮度不均匀了.很难调的.这种不适合做成品.试验练手来了解原理 ...

谢谢大佬了,我才学习单片机,那天参考了论坛里面大佬的资料练手,成功了,显示啥的都没问题。就是响应特别慢,又从其他地方找了这个程序,响应速度可以,就是闪的眼睛不舒服。第一次成功玩单片机 想把这个做成能用的放起来
回复

使用道具 举报

ID:419909 发表于 2021-5-18 21:04 | 显示全部楼层
退而求次的方法就是把显示改为中断处理.且中断优先级为最高.但是这样可能会影响到其它功能.所以说.这是个很麻烦的事.要自己协调好各个函数功能占用时间
回复

使用道具 举报

ID:39866 发表于 2021-5-18 21:07 | 显示全部楼层
wfqxgw 发表于 2021-5-18 21:04
退而求次的方法就是把显示改为中断处理.且中断优先级为最高.但是这样可能会影响到其它功能.所以说.这是 ...

好吧,残废工程,我先学习吧,等后面了再研究怎么弄
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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