找回密码
 立即注册

QQ登录

只需一步,快速开始

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

小白 对程序不懂 求解释

[复制链接]
跳转到指定楼层
楼主
ID:275051 发表于 2018-1-13 23:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <stc12c5a60s2.h>//"stc12c5620ad.h"
  2. #include<intrins.h>
  3. #define LongToBin(n) (((n>>21)&0x80)|((n>>18)&0x40)|((n>>15)&0x20)|((n>>12)&0x10)|((n>>9)&0x08)|((n>>6)&0x04)|((n>>3)&0x02)|((n)&0x01))
  4. #define BIN(n) LongToBin(0x##n##)
  5. #define uchar  unsigned char
  6. #define uint  unsigned int
  7. #define SAMPLE_NUM 64
  8. #define NUM_2_LOG 6
  9. #define FFT_OUT_MIN 1
  10. #define FFT_OUT_MAX        11
  11. uchar code BRTable[SAMPLE_NUM] ={
  12. 0, 32, 16, 48, 8, 40, 24, 56,4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26,
  13. 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57,5, 37, 21, 53, 13, 45,
  14. 29, 61,3, 35, 19, 51, 11, 43, 27, 59,7, 39, 23, 55, 15, 47, 31, 63};
  15. char code sin_tabb[SAMPLE_NUM] = {
  16. 0 ,12 ,25 ,37 ,49 ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 ,127 ,126 ,125 ,
  17. 122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,0 ,-12 ,-25 ,-37 ,-49 ,-60 ,
  18. -71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,-127 ,-126 ,-125 ,-122 ,-117
  19. ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12  };

  20. char code cos_tabb[SAMPLE_NUM] = {
  21. 127 ,126 ,125 ,122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,0 ,-12 ,-25 ,
  22. -37 ,-49 ,-60 ,-71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,-127 ,-126 ,-125 ,
  23. -122 ,-117 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12 ,0 ,12 ,25 ,37 ,49
  24. ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 };
  25. uchar a[64];
  26. uchar keep,keepnum,anum,timernum, ,lednum3,Ltime;//óÃóú·Öàë

  27. /*¼óèëêy×éóÃóúÏÔê¾Ïàó|ledμÆêyÄ¿*/
  28. uchar lednum[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//0-7μÄÏÔê¾êy×é  P2×é¿ØÖÆ
  29. int xdata FftReal[SAMPLE_NUM];
  30. int xdata FftImage[SAMPLE_NUM];

  31. xdata unsigned char num[128];
  32. xdata unsigned char temp[128];

  33. sbit p35=P3^5;//9-11μÄled¿ØÖÆ
  34. sbit p36=P3^6;
  35. sbit p37=P3^7;

  36. sbit p34=P3^4;
  37. sbit p33=P3^3;
  38. sbit p32=P3^2;
  39. sbit p31=P3^1;
  40. sbit p30=P3^0;
  41. sbit p07=P0^7;
  42. sbit p06=P0^6;
  43. sbit p05=P0^5;
  44. sbit p04=P0^4;
  45. sbit p03=P0^3;
  46. sbit p02=P0^2;
  47. sbit p01=P0^1;
  48. sbit p00=P0^0;

  49. void delay(unsigned char a)
  50. {
  51.         unsigned int i;
  52.         while(--a)
  53.                 for(i=0;i<50;i++);                                    
  54. }
  55. void timerinit()//¶¨ê±Æ÷ 3õê¼»ˉoˉêy
  56. {
  57.          TMOD=0x01;  //16붨ê±Æ÷
  58.          TH0=(65536-2048)/256;
  59.          TL0=(65536-2048)%256;
  60.          EA=1;                //¿a×üÖD¶Ï
  61.          ET0=1;   //¿a¶¨ê±Æ÷0ÖD¶Ï
  62.          TR0=1;         //Æô¶ˉ¶¨ê±Æ÷
  63. }

  64. void disp()
  65. {
  66.         timernum++;
  67.         if(timernum==14) timernum=1;
  68.         P2=0x00;//ÏÔê¾Ç°Ïè1رÕ
  69.         p37=0;
  70.         p36=0;
  71.         p35=0;

  72.         p34=1;
  73.         p32=1;
  74.         p31=1;
  75.         p30=1;
  76.         P0=0Xff;
  77.         switch(timernum)
  78.         {
  79.                 case 1:anum=a[0];p33=0;break;//
  80.                 case 2:anum=a[1];p34=0;break;
  81.                 case 3:anum=a[2];p32=0;break;
  82.                 case 4:anum=a[3];p31=0;break;
  83.                 case 5:anum=a[4];p30=0;break;
  84.                 case 6:anum=a[5];p07=0;break;
  85.                 case 7:anum=a[6];p06=0;break;
  86.                 case 8:anum=a[7];p05=0;break;
  87.                 case 9:anum=a[8];p04=0;break;
  88.                 case 10:anum=a[9];p03=0;break;
  89.                 case 11:anum=a[10];p02=0;break;
  90.                 case 12:anum=a[11];p01=0;break;
  91.                 case 13:anum=a[12];p00=0;break;//
  92.         }
  93.         if(anum<=8){P2=lednum[anum];p35=0;p36=0;p37=0;}//Æá±Î¸ßèyλ
  94.         if(anum==9){P2=0xff;p35=1;p36=0;p37=0;}
  95.         if(anum==10){P2=0xff;p35=1;p36=1;p37=0;}
  96.         if(anum==11){P2=0xff;p35=1;p36=1;p37=1;}
  97.         delay(5);
  98. }

  99. uchar STC_ADC()                   //£¡£¡¸ù¾Yêy¾YêÖ2áD′ò»¸öad¶áè¡oˉêy
  100. {                                                                                                
  101.      uchar i;
  102.      ADC_RES   = 0;
  103.      ADC_RESL  = 0;
  104.          ADC_CONTR = BIN(10001000);
  105.          i=3;
  106.      while(i--);
  107.      while (1)                     
  108.      {
  109.          if (ADC_CONTR & BIN(10000))      
  110.               {
  111.                              break;
  112.                     }
  113.      }
  114.      ADC_CONTR = BIN(10000000);
  115.            return( ADC_RESL<<2) ;
  116. }

  117. short sqrt_16( unsigned long M)   
  118. {
  119.     unsigned int N, i;
  120.     unsigned long tmp, ttp;
  121.     if( M == 0 )            
  122.         return 0;

  123.     N = 0;

  124.     tmp = ( M >> 30 );        
  125.     M <<= 2;
  126.     if( tmp > 1 )            
  127.     {
  128.         N ++;               
  129.         tmp -= N;
  130.     }

  131.     for( i=15; i>0; i-- )   
  132.     {
  133.         N <<= 1;           

  134.         tmp <<= 2;
  135.         tmp += (M >> 30);  

  136.         ttp = N;
  137.         ttp = (ttp<<1)+1;

  138.         M <<= 2;
  139.         if( tmp >= ttp )   
  140.         {
  141.             tmp -= ttp;
  142.             N ++;
  143.         }      
  144.     }

  145.     return N;
  146. }
  147. void FFT()
  148. {
  149.         register    uchar i,bb,j,k,p,max;
  150.         register short TR,TI,temp;
  151.     unsigned long ulReal;                             
  152.     unsigned long ulImage;   

  153.         for(i=0; i<SAMPLE_NUM;i++)        
  154.         {
  155.                 FftReal[BRTable[i]] = STC_ADC()
  156.         FftImage[i] = 0;               
  157.         }

  158.     for( i=1; i<=NUM_2_LOG; i++)                          
  159.     {
  160.         bb=1;
  161.         bb <<= (i-1);                                      
  162.         for( j=0; j<=bb-1; j++)                           
  163.         {
  164.             p=1;
  165.             p <<= (NUM_2_LOG-i);            
  166.             p = p*j;
  167.             for( k=j; k<SAMPLE_NUM; k=k+2*bb)               
  168.             {
  169.                 TR = FftReal[k]; TI = FftImage[k]; temp = FftReal[k+bb];
  170.                 FftReal[k] = FftReal[k] + ((FftReal[k+bb]*cos_tabb[p])>>7) + ((FftImage[k+bb]*sin_tabb[p])>>7);
  171.                 FftImage[k] = FftImage[k] - ((FftReal[k+bb]*sin_tabb[p])>>7) + ((FftImage[k+bb]*cos_tabb[p])>>7);
  172.                 FftReal[k+bb] = TR - ((FftReal[k+bb]*cos_tabb[p])>>7) - ((FftImage[k+bb]*sin_tabb[p])>>7);
  173.                 FftImage[k+bb] = TI + ((temp*sin_tabb[p])>>7) - ((FftImage[k+bb]*cos_tabb[p])>>7);

  174.                 FftReal[k]  >>= 1;            
  175.                 FftImage[k]  >>= 1;
  176.                 FftReal[k+bb]  >>= 1;                 
  177.                 FftImage[k+bb]  >>= 1;                                                                 
  178.             }  
  179.         }
  180.     }
  181.         max=0;
  182.     for( i=0; i<13; i++)
  183.     {  
  184.         ulReal = FftReal[i+1];
  185.         ulReal *= ulReal;
  186.         ulImage = FftImage[i+1];
  187.         ulImage *= ulImage;

  188.         a[i] = sqrt_16( ulReal + ulImage );  

  189.         if( a[i] < FFT_OUT_MIN ) //   
  190.             a[i] = 0;//DT¸Ä
  191.         else
  192.           a[i] = a[i]-FFT_OUT_MIN;   
  193.                   
  194.         if( a[i] >max)
  195.              max =a[i];                                 
  196.     }

  197.     if(max>11) //11
  198.     {
  199.        max/=11;        
  200.         for( i=0; i<13; i++) //êä3öaμÄ5¸ö·ÖàëêyÖμ
  201.         {      
  202.              a[i]/=max;
  203.         }  
  204.     }
  205. }            

  206. void main()
  207. {
  208.         P2M0=0xff;//  BIN(11111111);//P2×ééèÖÃÎaíÆíìêä3ö
  209.         P2M1=0x00;         
  210.         P3M0=0xff;//  BIN(11111111);//P3×ééèÖÃÎaíÆíìêä3ö
  211.         P3M1=0x00;
  212.         P1M0=0x00;
  213.         P1M1=0x01;
  214.          P1ASF =1;           //éèÖÃP1.0ÎaAD¿ú  AD¿ú½«Ä£ÄaDÅoÅ×a»»Îaêy×ÖDÅoÅ
  215.     AUXR1 =BIN(100);

  216.         keep=0;
  217.         keepnum=0;

  218.         timerinit()

  219.         timernum=3;
  220.         timernum2=0;
  221.     while(1)
  222.         {
  223.              FFT();
  224.         }
  225. }
  226. int t=0;
  227. void timer0() interrupt 1
  228. {
  229.         unsigned char i;
  230.         t++;
  231.         if(t == 24)
  232.         {
  233.                 for(i=0;i<13;i++)temp[i] = a[i];
  234.                 t = 0;
  235.         }

  236.          disp();        
  237.         TH0=(65536-1000)/256;        
  238.         TL0=(65536-1000)%256;
  239. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-1-14 00:47 | 只看该作者
具体那个地方不懂?
回复

使用道具 举报

板凳
ID:275051 发表于 2018-1-14 12:37 | 只看该作者
void  disp        里边的switch语句            还有STC-ADC
回复

使用道具 举报

地板
ID:275051 发表于 2018-1-16 18:58 | 只看该作者
admin 发表于 2018-1-14 00:47
具体那个地方不懂?

void  disp        里边的switch语句            还有STC-ADC
回复

使用道具 举报

5#
ID:111634 发表于 2018-1-16 21:14 | 只看该作者
先学理论,打基础,否则,问题多多,事倍功半。
回复

使用道具 举报

6#
ID:274156 发表于 2018-1-17 08:58 | 只看该作者
建议你先学学c语言,了解进制,变量等等
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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