標(biāo)題:
單片機(jī)+LCD12864液晶驅(qū)動(dòng)的頻譜顯示
[打印本頁]
作者:
kangbiao8417
時(shí)間:
2019-5-10 14:00
標(biāo)題:
單片機(jī)+LCD12864液晶驅(qū)動(dòng)的頻譜顯示
12864液晶驅(qū)動(dòng)的頻譜顯示
電路原理圖如下:
51hei.png
(33.54 KB, 下載次數(shù): 42)
下載附件
2022-5-2 17:20 上傳
單片機(jī)源程序如下:
#include<math.h>
#include"stc12c5a60s2.h"
#include"LCD12864.h"
#define uint unsigned int
#define uchar unsigned char
struct compx //定義復(fù)數(shù)結(jié)構(gòu)體
{
float real;
float imag;
};
xdata struct compx s[ 64 ]; //FFT數(shù)據(jù)緩存放在XDATA空間
struct compx EE(struct compx,struct compx); //復(fù)數(shù)乘法函數(shù)的聲明
void FFT(struct compx xin[],int N); //FFT函數(shù)的聲明
struct compx EE(struct compx a1,struct compx b2) //復(fù)數(shù)乘法
{
struct compx b3;
b3.real=a1.real*b2.real-a1.imag*b2.imag;
b3.imag=a1.real*b2.imag+a1.imag*b2.real;
return(b3);
}
/*FFT函數(shù)*/
void FFT(struct compx xin[],int N)
{
int f,m,nv2,nm1,i,k,j=1,l;
struct compx v,w,t;
nv2=N/2;
f=N;
for(m=1;(f=f/2)!=1;m++){;}
nm1=N-1;
for(i=0;i<nm1;i++) //倒序操作
{
if(i<j)
{
t=xin[j];
xin[j]=xin[i];
xin[i]=t;
}
k=nv2; //k為倒序中相應(yīng)位置的權(quán)值
while(k<j)
{
j=j-k;
k=k/2;
}
j=j+k;
}
{
int le,lei,ip;
float pi;
for(l=1;l<=m;l++)
{
le=pow(2,l); //乘方
lei=le/2;
pi=3.14159265;
v.real=1.0;
v.imag=0.0;
w.real=cos(pi/lei); //旋轉(zhuǎn)因子
w.imag=-sin(pi/lei);
for(j=1;j<=lei;j++) //控制蝶形運(yùn)算的級數(shù)
{
for(i=j-1;i<N;i=i+le) //控制每級蝶形運(yùn)算的次數(shù)
{
ip=i+lei;
t=EE(xin[ ip ],v);
xin[ ip ].real=xin[ i ].real-t.real; //蝶形計(jì)算
xin[ ip ].imag=xin[ i ].imag-t.imag;
xin[ i ].real=xin[ i ].real+t.real;
xin[ i ].imag=xin[ i ].imag+t.imag;
}
v=EE(v,w);
}
}
}
}
void showbar()
{
xdata unsigned char dis_data[31][16]; //用于顯示的數(shù)據(jù)
unsigned char i,j,high;
unsigned char dis_rdata[16];
for(i=0;i<16;i++) //讀取FFT轉(zhuǎn)換數(shù)據(jù)
{
float t0=0;
t0=sqrt(pow((s[i ].real+s[i+1].real),2)+pow((s[i ].imag+s[i+1].imag),2))/2;
dis_rdata[i]=(unsigned char)t0;
}
/**************************************************************/
/*****************寫入下屏,i:0~16,表示16列**************/
/***************************high:表示列的高度*********/
for (i=0;i<=32;i++) //在顯示下屏顯存必須清0,后面有操作是或運(yùn)算
{
for (j=0;j<16;j++)
{
dis_data[i][j]=0;
}
}
for(i=0;i<16;i++)
{
high=dis_rdata[i];
if(high>62)high=62; //12864的高度只有64,判斷高于64時(shí),為62***/
if(high>31) //下屏和下屏的高度各處為32,大于32時(shí),多于的在上屏顯示
{
for(j=0;j<31;j++)//高度大于32時(shí),下屏柱體全充滿,多于的在上屏顯示
{
dis_data[j][i]|=0xfe; // 或的方法是數(shù)據(jù)結(jié)合12864的顯示特性進(jìn)行的算法
} //0xfe使每條柱體之間有一條線的間隔
}
else //下屏和下屏的高度各處為32,小于32個(gè),在下屏顯示
{
for(j=31-high;j<31;j++)
{
dis_data[j][i]|=0xfe; // 或的方法是數(shù)據(jù)結(jié)合12864的顯示特性進(jìn)行的算法
}
}
}
for(i=0;i<=31;i++)//寫入下屏圖形數(shù)據(jù)時(shí)采用逐行掃描的方式
{
write_com(0x80|i); //寫入x和y的地址
write_com(0x88|0);
for(j=0;j<16;j++)write_data(dis_data[i][j]); //寫入數(shù)據(jù)
}
/**************************************************************/
/*****************寫入上屏,i:0~16,表示16列**************/
/***************************high:表示列的高度*********/
for (i=0;i<=32;i++) //后面在上屏顯示,顯存必須清0,后面有操作或運(yùn)算
{
for (j=0;j<16;j++)
{
dis_data[i][j]=0;
}
}
for(i=0;i<16;i++)
{
high=dis_rdata[i];
if(high>62)high=62;
if(high>31)
{
for(j=64-high;j<=31;j++)
{
dis_data[j][i]|=0xfe; // 或的方法是數(shù)據(jù)結(jié)合12864的顯示特性進(jìn)行的算法
}
}
else
{
for(j=64-high;j<=31;j++)
{
dis_data[j][i]|=0x00; // 或的方法是數(shù)據(jù)結(jié)合12864的顯示特性進(jìn)行的算法
}
}
}
for(i=0;i<=31;i++)//寫入圖形數(shù)據(jù)時(shí)采用逐行掃描的方式
{
write_com(0x80|i);
write_com(0x90|0);
for(j=0;j<16;j++)write_data(dis_data[i][j]);
}
}
/*主函數(shù)*/
void main()
{
int N=64,i; //變量初始化,64點(diǎn)FFT運(yùn)算
float offset;
lcd_init(); //12864
P1ASF=0x01; //P10口做AD 使用
P1M0 = 0x01; //0000,0001用于A/D轉(zhuǎn)換的P1.x口,先設(shè)為開漏
P1M1 = 0x01; //0000,0001 P1.0先設(shè)為開漏。斷開內(nèi)部上拉電阻
ADC_CONTR=0xC8; //40.96K采樣率
while(!(ADC_CONTR&0x10));
offset=((float)ADC_RES*4+(float)(ADC_RESL%0x04)); //AD結(jié)果高8位左移2位,低2位不變,然后相加
while(1)
{ if(P3==(P3&0xFE))IAP_CONTR=0x60;
for(i=0;i<N;i++) //采集音頻信號
{
ADC_CONTR=0xC8; //40.96K采樣率
while(!(ADC_CONTR&0x10));
s[i].real=((float)ADC_RES*4+(float)(ADC_RESL%0x04)-offset)/4;//((((int)ADC_DATA-128)/2))*4;
s[i].imag=0;
}
FFT(s,N); //調(diào)用FFT函數(shù)進(jìn)行變換
showbar(); //顯示頻譜
}
}
復(fù)制代碼
51hei.png
(6.49 KB, 下載次數(shù): 41)
下載附件
2022-5-2 17:20 上傳
Keil5程序51hei下載:
12864.rar
(168.18 KB, 下載次數(shù): 140)
2019-5-10 14:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
zh68a11
時(shí)間:
2020-2-26 19:45
謝謝分享。原理圖是JPEG格式的就更好了。
作者:
yyzf998
時(shí)間:
2020-5-2 11:30
好好學(xué)習(xí)!謝謝樓主!
作者:
zfccde
時(shí)間:
2022-5-2 17:18
很不錯(cuò)!
作者:
zfccde
時(shí)間:
2022-5-2 17:18
謝謝
好好學(xué)習(xí)!謝謝樓主!
作者:
zfccde
時(shí)間:
2022-5-2 17:19
稍作修改,實(shí)驗(yàn)了一下,不錯(cuò)
作者:
516003568
時(shí)間:
2022-12-11 21:43
全51hei就你注釋的非常詳細(xì)和清楚,點(diǎn)贊
作者:
許玩童
時(shí)間:
2023-3-16 21:52
proteus仿真能通過嗎?有做過這個(gè)仿真的朋友嗎?
作者:
許玩童
時(shí)間:
2023-4-10 10:46
謝謝樓主!下載收藏學(xué)習(xí)一下了
作者:
傲世飛魚
時(shí)間:
2023-5-13 10:05
有做過的嗎?
作者:
gaoyang9992006
時(shí)間:
2023-5-22 09:33
看看效果如何。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1