久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4290|回復: 10
打印 上一主題 下一主題
收起左側

單片機+LCD12864液晶驅動的頻譜顯示

  [復制鏈接]
跳轉到指定樓層
樓主
12864液晶驅動的頻譜顯示
電路原理圖如下:


單片機源程序如下:
  1. #include<math.h>
  2. #include"stc12c5a60s2.h"
  3. #include"LCD12864.h"
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. struct compx                                                                           //定義復數結構體
  7. {
  8.         float real;
  9.         float imag;
  10. };
  11. xdata struct compx s[ 64 ];                                                 //FFT數據緩存放在XDATA空間
  12. struct compx EE(struct compx,struct compx);                 //復數乘法函數的聲明
  13. void FFT(struct compx xin[],int N);                                  //FFT函數的聲明
  14. struct compx EE(struct compx a1,struct compx b2)         //復數乘法
  15. {
  16.         struct compx b3;
  17.         b3.real=a1.real*b2.real-a1.imag*b2.imag;
  18.         b3.imag=a1.real*b2.imag+a1.imag*b2.real;
  19.         return(b3);
  20. }
  21. /*FFT函數*/
  22. void FFT(struct compx xin[],int N)                                   
  23. {
  24.         int f,m,nv2,nm1,i,k,j=1,l;
  25.         struct compx v,w,t;
  26.         nv2=N/2;
  27.         f=N;
  28.         for(m=1;(f=f/2)!=1;m++){;}
  29.         nm1=N-1;
  30.         for(i=0;i<nm1;i++)                                           //倒序操作
  31.         {
  32.                 if(i<j)
  33.                 {
  34.                         t=xin[j];
  35.                         xin[j]=xin[i];
  36.                         xin[i]=t;
  37.                 }
  38.                 k=nv2;                                                       //k為倒序中相應位置的權值
  39.                 while(k<j)
  40.                 {
  41.                         j=j-k;
  42.                         k=k/2;
  43.                 }
  44.                 j=j+k;
  45.         }
  46.         {
  47.                 int le,lei,ip;
  48.                   float pi;
  49.                   for(l=1;l<=m;l++)
  50.                    {
  51.                 le=pow(2,l);                                                 //乘方
  52.                     lei=le/2;
  53.                     pi=3.14159265;
  54.                     v.real=1.0;
  55.                 v.imag=0.0;  
  56.                    w.real=cos(pi/lei);                                           //旋轉因子
  57.                     w.imag=-sin(pi/lei);
  58.                     
  59.                 for(j=1;j<=lei;j++)                                           //控制蝶形運算的級數
  60.                      {
  61.                         for(i=j-1;i<N;i=i+le)                                         //控制每級蝶形運算的次數
  62.                               {
  63.                                     ip=i+lei;
  64.                                        t=EE(xin[ ip ],v);
  65.                                        xin[ ip ].real=xin[ i ].real-t.real;   //蝶形計算
  66.                                        xin[ ip ].imag=xin[ i ].imag-t.imag;
  67.                                        xin[ i ].real=xin[ i ].real+t.real;
  68.                                        xin[ i ].imag=xin[ i ].imag+t.imag;
  69.                               }
  70.                               v=EE(v,w);   
  71.                       }     
  72.                    }
  73.           }
  74. }
  75. void showbar()
  76. {                                
  77.     xdata unsigned char dis_data[31][16];  //用于顯示的數據
  78.     unsigned char i,j,high;
  79.         unsigned char dis_rdata[16];
  80.         for(i=0;i<16;i++)          //讀取FFT轉換數據
  81.         {
  82.                 float t0=0;
  83.                 t0=sqrt(pow((s[i  ].real+s[i+1].real),2)+pow((s[i  ].imag+s[i+1].imag),2))/2;
  84.                 dis_rdata[i]=(unsigned char)t0;
  85.         }
  86. /**************************************************************/
  87. /*****************寫入下屏,i:0~16,表示16列**************/
  88. /***************************high:表示列的高度*********/
  89.       for (i=0;i<=32;i++) //在顯示下屏顯存必須清0,后面有操作是或運算
  90.           {
  91.         for (j=0;j<16;j++)
  92.                 {
  93.                          dis_data[i][j]=0;
  94.                 }         
  95.           }
  96.      for(i=0;i<16;i++)
  97.          {   
  98.                  high=dis_rdata[i];
  99.                  if(high>62)high=62;        //12864的高度只有64,判斷高于64時,為62***/
  100.                  if(high>31)          //下屏和下屏的高度各處為32,大于32時,多于的在上屏顯示
  101.                          {         
  102.                                  for(j=0;j<31;j++)//高度大于32時,下屏柱體全充滿,多于的在上屏顯示
  103.                         {
  104.                           dis_data[j][i]|=0xfe;  //  或的方法是數據結合12864的顯示特性進行的算法
  105.                         }                                                  //0xfe使每條柱體之間有一條線的間隔
  106.                          }        
  107.                          else  //下屏和下屏的高度各處為32,小于32個,在下屏顯示
  108.                          {
  109.                             for(j=31-high;j<31;j++)
  110.                         {
  111.                             dis_data[j][i]|=0xfe;  //  或的方法是數據結合12864的顯示特性進行的算法
  112.                         }
  113.                          }                                                
  114.     }                  
  115.     for(i=0;i<=31;i++)//寫入下屏圖形數據時采用逐行掃描的方式
  116.     {  
  117.         write_com(0x80|i); //寫入x和y的地址
  118.         write_com(0x88|0);                           
  119.         for(j=0;j<16;j++)write_data(dis_data[i][j]); //寫入數據
  120.     }
  121. /**************************************************************/
  122. /*****************寫入上屏,i:0~16,表示16列**************/
  123. /***************************high:表示列的高度*********/
  124.         for (i=0;i<=32;i++) //后面在上屏顯示,顯存必須清0,后面有操作或運算
  125.         {
  126.         for (j=0;j<16;j++)
  127.                 {
  128.                          dis_data[i][j]=0;
  129.                 }         
  130.         }
  131.          for(i=0;i<16;i++)
  132.          {   
  133.                  high=dis_rdata[i];
  134.                  if(high>62)high=62;
  135.               if(high>31)
  136.                  {         
  137.                         for(j=64-high;j<=31;j++)
  138.                 {
  139.                   dis_data[j][i]|=0xfe;  //  或的方法是數據結合12864的顯示特性進行的算法
  140.                 }
  141.                  }
  142.                  else
  143.                  {
  144.                          for(j=64-high;j<=31;j++)
  145.                 {
  146.                   dis_data[j][i]|=0x00;  //  或的方法是數據結合12864的顯示特性進行的算法
  147.                 }
  148.                  }                                                         
  149.     }                  
  150.     for(i=0;i<=31;i++)//寫入圖形數據時采用逐行掃描的方式
  151.     {  
  152.         write_com(0x80|i);
  153.         write_com(0x90|0);                           
  154.         for(j=0;j<16;j++)write_data(dis_data[i][j]);
  155.     }
  156.         
  157. }
  158. /*主函數*/
  159. void main()                                                                     
  160. {
  161.         int N=64,i;                                                             //變量初始化,64點FFT運算
  162.         float offset;
  163.     lcd_init();          //12864
  164.         P1ASF=0x01;                                                                      //P10口做AD 使用
  165.         P1M0 = 0x01;                                                //0000,0001用于A/D轉換的P1.x口,先設為開漏
  166.         P1M1 = 0x01;                                                //0000,0001 P1.0先設為開漏。斷開內部上拉電阻
  167.         ADC_CONTR=0xC8;                                                                 //40.96K采樣率
  168.         while(!(ADC_CONTR&0x10));
  169.         offset=((float)ADC_RES*4+(float)(ADC_RESL%0x04)); //AD結果高8位左移2位,低2位不變,然后相加
  170.         while(1)
  171.         {                if(P3==(P3&0xFE))IAP_CONTR=0x60;

  172.                         for(i=0;i<N;i++)                                      //采集音頻信號
  173.                           {
  174.                                 ADC_CONTR=0xC8;                                         //40.96K采樣率
  175.                                 while(!(ADC_CONTR&0x10));
  176.                                    s[i].real=((float)ADC_RES*4+(float)(ADC_RESL%0x04)-offset)/4;//((((int)ADC_DATA-128)/2))*4;
  177.                                    s[i].imag=0;
  178.                           }  
  179.                           FFT(s,N);                                       //調用FFT函數進行變換
  180.                           showbar();                                                        //顯示頻譜                                                               
  181.         }
  182. }
復制代碼

Keil5程序51hei下載:
12864.rar (168.18 KB, 下載次數: 140)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:13396 發表于 2020-2-26 19:45 | 只看該作者
謝謝分享。原理圖是JPEG格式的就更好了。
回復

使用道具 舉報

板凳
ID:688460 發表于 2020-5-2 11:30 | 只看該作者
好好學習!謝謝樓主!
回復

使用道具 舉報

地板
ID:990486 發表于 2022-5-2 17:18 | 只看該作者
很不錯!
回復

使用道具 舉報

5#
ID:990486 發表于 2022-5-2 17:18 | 只看該作者
謝謝
好好學習!謝謝樓主!
回復

使用道具 舉報

6#
ID:990486 發表于 2022-5-2 17:19 | 只看該作者
稍作修改,實驗了一下,不錯
回復

使用道具 舉報

7#
ID:1043639 發表于 2022-12-11 21:43 | 只看該作者
全51hei就你注釋的非常詳細和清楚,點贊
回復

使用道具 舉報

8#
ID:1066888 發表于 2023-3-16 21:52 | 只看該作者
proteus仿真能通過嗎?有做過這個仿真的朋友嗎?
回復

使用道具 舉報

9#
ID:1066888 發表于 2023-4-10 10:46 | 只看該作者
謝謝樓主!下載收藏學習一下了
回復

使用道具 舉報

10#
ID:963310 發表于 2023-5-13 10:05 | 只看該作者
有做過的嗎?
回復

使用道具 舉報

11#
ID:38792 發表于 2023-5-22 09:33 | 只看該作者
看看效果如何。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品1区| 暖暖成人免费视频 | 久久精品中文 | 久久久国产一区二区三区 | 国产精品高清在线 | 国产精品久久久久久一区二区三区 | 亚洲午夜精品一区二区三区他趣 | 成人激情免费视频 | 亚洲精品免费在线观看 | 中文字幕 在线观看 | 国产精品久久亚洲 | 午夜伦理影院 | 精品啪啪 | 亚洲成人中文字幕 | 国内精品在线视频 | 国产精品久久久久久久7777 | www.se91| 日韩在线视频免费观看 | 欧美激情精品久久久久 | 香蕉视频91 | 久久亚洲国产精品 | 麻豆一区一区三区四区 | 成人午夜影院 | 在线国产视频观看 | 亚洲精品不卡 | 91高清免费观看 | 国产午夜精品一区二区三区四区 | 三级视频网站 | 欧美色视频免费 | 精品无码久久久久久国产 | 国产精品美女久久久久久免费 | 91视频网址 | 中文字幕精品一区久久久久 | 另类a v| 国产自产c区 | 成人在线一级片 | 国产精品视频区 | www在线| 国产精品大片在线观看 | 久久久高清 | 日本欧美在线观看视频 |