1.3.3 源代碼分析
(1)創建74HC595驅動
<1>創建74hc595.h并輸入以下代碼。
#ifndef _74HC595_H_
#define _74HC595_H_
#include "sys.h"
sbit HC595_CLK_X = P0^3 ; //X軸595時鐘
sbit HC595_DAT_X = P0^4 ; //X軸595數據
sbit HC595_RCK_X = P0^5 ; //X軸595鎖存
sbit DB16_X = P0^6 ; //增補X軸腳
sbit HC595_CLK_Y = P0^0 ; //Y軸595時鐘
sbit HC595_DAT_Y = P0^1 ; //Y軸595數據
sbit HC595_RCK_Y = P0^2 ; //Y軸595鎖存
void HC595_X_Dat( u16 dat ) ; //74HC595橫坐標數據
void HC595_Y_Dat( u16 dat ) ; //74HC595縱坐標數據
#endif
<2>創建74hc595.c并輸入以下代碼。
#include " 74hc595.h "
/********************************************************
Name :HC595_X_Dat
Function :74HC595橫坐標數據
Paramater :
dat:寫入的數據
Return :None
********************************************************/
void HC595_X_Dat( u16 dat )
{
u8 i ;
for( i=0 ; i<16 ; i++ )
{
if( dat&0x8000 )
HC595_DAT_X = 1 ;
else
HC595_DAT_X = 0 ;
dat <<= 1 ;
HC595_CLK_X = 0 ;
HC595_CLK_X = 1 ;
}
HC595_RCK_X = 0 ;
HC595_RCK_X = 1 ;
}
/********************************************************
Name :HC595_Y_Dat
Function :74HC595縱坐標數據
Paramater :
dat:寫入的數據
Return :None
********************************************************/
void HC595_Y_Dat( u16 dat )
{
u8 i ;
for( i=0 ; i<16 ; i++ )
{
if( dat&0x8000 )
HC595_DAT_Y = 1 ;
else
HC595_DAT_Y = 0 ;
dat <<= 1 ;
HC595_CLK_Y = 0 ;
HC595_CLK_Y = 1 ;
}
HC595_RCK_Y = 0 ;
HC595_RCK_Y = 1 ;
}
(2)移植FFT算法
<1>創建fft.h并輸入以下代碼。
#ifndef _FFT_H_
#define _FFT_H_
#include "sys.h"
/*********************************************************************************************************
函 數 列 表
*********************************************************************************************************/
void FFT_Init( void ) ; //FFT初始化
void FFT_Sample( void ) ; //FFT采樣計算(128位)
#endif
<2>創建fft.c并輸入以下代碼。
/*********************************************************************************************************
FFT 算 法 驅 動 代 碼
*********************************************************************************************************/
#include "fft.h"
#include "intrins.h"
#include "math.h"
#include "74hc595.h"
//采樣存儲序列表
unsigned char code BRTable[128] ={
0, 64, 32, 96, 16, 80, 48, 112,
8, 72, 40, 104, 24, 88, 56, 120,
4, 68, 36, 100, 20, 84, 52, 116,
12, 76, 44, 108, 28, 92, 60, 124,
2, 66, 34, 98, 18, 82, 50, 114,
10, 74, 42, 106, 26, 90, 58, 122,
6, 70, 38, 102, 22, 86, 54, 118,
14, 78, 46, 110, 30, 94, 62, 126,
1, 65, 33, 97, 17, 81, 49, 113,
9, 73, 41, 105, 25, 89, 57, 121,
5, 69, 37, 101, 21, 85, 53, 117,
13, 77, 45, 109, 29, 93, 61, 125,
3, 67, 35, 99, 19, 83, 51, 115,
11, 75, 43, 107, 27, 91, 59, 123,
7, 71, 39, 103, 23, 87, 55, 119,
15, 79, 47, 111, 31, 95, 63, 127};
char code sin_tabb[128] = {0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 59, 65, 70, 75, 80, 85, 89, 94, 98, 102,
105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126, 126, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112,
108, 105, 102, 98, 94, 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, -65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121,
-123, -124, -125, -126, -126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102,
-98, -94, -89, -85, -80, -75, -70, -65, -59, -54, -48, -42, -36, -30, -24, -18, -12, -6};
char code cos_tabb[128] = {127, 126, 126, 125, 124, 123, 121, 119, 117, 114, 112, 108, 105, 102, 98, 94,
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,
-65, -70, -75, -80, -85, -89, -94, -98, -102, -105, -108, -112, -114, -117, -119, -121, -123, -124, -125, -126, -
126, -126, -126, -126, -125, -124, -123, -121, -119, -117, -114, -112, -108, -105, -102, -98, -94, -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, 65, 70,
75, 80, 85, 89, 94, 98, 102, 105, 108, 112, 114, 117, 119, 121, 123, 124, 125, 126, 126};
xdata unsigned char result[128];
xdata unsigned char temp[128];
xdata unsigned char num[128];
unsigned char timernum;//用于分離
int xdata FftReal[128];
int xdata FftImage[128];
u16 code HC_FFT_TAB_X[] = {
0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
} ; //FFT列選
u16 code HC_FFT_TAB_Y[] = {
0xFFFE, 0xFFFC, 0xFFF8, 0xFFF0, 0xFFE0, 0xFFC0, 0xFF80, 0xFF00,
0xFE00, 0xFC00, 0xF800, 0xF000, 0xE000, 0xC000, 0x8000, 0x0000,
} ; //FFT行選模式
/********************************************************
Name :ADC_Init
Function :ADC模塊初始化
Paramater :None
Return :None
********************************************************/
void ADC_Init()
{
P1ASF = 0x01 ;
ADC_CONTR = 0xE0 ;
}
/********************************************************
Name :ADC_Read_Byte
Function :ADC讀取10位字節
Paramater :None
Return :轉換結果的10位數據
********************************************************/
float ADC_Read_Byte()
{
ADC_CONTR = 0xE8 ;
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
while ( !( ADC_CONTR&0x10 ) ) ;
return ( ADC_RES*4+ADC_RESL ) ;
}
/********************************************************
Name :FFT_Init
Function :FFT初始化
Paramater :None
Return :None
********************************************************/
void FFT_Init()
{
ADC_Init();
IE |= 0x82 ;
TMOD |= 0x01 ;
TH0 = ( 65535-2048 ) / 256 ;
TL0 = ( 65535-2048 ) % 256 ;
TR0 = 1 ;
P0M0 = 0x40 ;
}
/********************************************************
Name :FFT_process
Function :下落遲滯
Paramater :None
Return :None
********************************************************/
void FFT_process()
{
u8 i ;
for( i=0; i<17; i++ )
{
if( result[ i ]>7 )+( ( FftImage[ k+bb ]*sin_tabb[ p ] )>>7 ) ;
FftImage[ k ] = FftImage[ k ] - ( ( FftReal[ k+bb ]*sin_tabb[ p ] )>>7 )+( ( FftImage[ k+bb ]*cos_tabb[ p ] )>>7 ) ;
//對稱幅值計算
FftReal[ k+bb ] = TR -( ( FftReal[ k+bb ]*cos_tabb[ p ] )>>7 )-( ( FftImage[ k+bb ]*sin_tabb[ p ] )>>7 ) ;
FftImage[ k+bb ] = TI + ( ( temp*sin_tabb[ p ] )>>7 )-( ( FftImage[ k+bb ]*cos_tabb[ p ] )>>7 ) ;
//除以2
FftReal[ k ] >>= 1 ;
FftImage[ k ] >>= 1 ;
FftReal[ k+bb ] >>= 1 ;
FftImage[ k+bb ] >>= 1 ;
}
}
}
//轉換為余弦形式
for( i=0; i<17; i++ )
{
ulReal = FftReal[ i+1 ] ; //獲取實部
ulReal *= ulReal ; //計算實部平方
ulImage = FftImage[ i+1 ] ; //獲取虛部
ulImage *= ulImage ; //計算虛部平方
result[ i ] = sqrt( ulReal+ulImage )*4 ; //計算模值
}
}
/********************************************************
Name :FFT_Disp
Function :FFT數據顯示
Paramater :None
Return :None
********************************************************/
void FFT_Disp()
{
FFT_process() ;
if( result[ timernum ]>=16 )
result[ timernum ] = 15 ;
if( timernum<16 )
{
HC595_X_Dat( HC_FFT_TAB_X[ timernum ] ) ;
DB16_X = 0 ;
}
else
{
HC595_X_Dat( 0x0000 ) ;
DB16_X = 1 ;
}
HC595_Y_Dat( HC_FFT_TAB_Y[ result[ timernum ] ] ) ;
timernum ++ ;
if( timernum==17 )
timernum = 0 ;
}
/********************************************************
Name :TIM0
Function :定時器0中斷服務函數
Paramater :None
Return :None
********************************************************/
void TIM0() interrupt 1
{
u8 i , t ;
TH0 = ( 65535-2048 ) / 256 ;
TL0 = ( 65535-2048 ) % 256 ;
t ++ ;
if( t==17 )
{
for( i=0 ; i<17 ; i++ )
temp[ i ] = result[ i ] ;
t = 0;
}
FFT_Disp() ;
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
matlab
+關注
關注
185文章
2977瀏覽量
230573 -
線性
+關注
關注
0文章
199瀏覽量
25164 -
傅里葉變換
+關注
關注
6文章
442瀏覽量
42610
發布評論請先 登錄
相關推薦
學習傅里葉變換意義和方法
學習傅里葉變換需要面對大量的數學公式,數學功底較差的同學聽到傅里葉變換就頭疼。事實上,許多數學功底好的數字信號處理專業的同學也不一定理解傅里葉變換的真實含義,不能做到學以致用!事實上,
發表于 06-28 07:31
DSP變換運算-傅里葉變換
第24章 DSP變換運算-傅里葉變換本章節開始進入此教程最重要的知識點之一傅里葉變換。關于傅里葉變換,本章主要是把傅里葉相關的基礎知識進行必要的介紹,沒有這些基礎知識的話,后面
發表于 08-03 06:14
小波變換比傅里葉變換好在哪里_小波變換與傅里葉變換詳解
小波變換與傅里葉變換有什么區別嗎?小波變換與傅里葉變換哪個好?我們通過小波變換與傅里葉變換的詳細
發表于 01-13 11:02
?1.6w次閱讀
MATLAB學習筆記之傅里葉變換1
線性時不變系統** (輸入信號與輸出信號滿足線性關系,且系統參數不隨時間變換),無論你采用微分方程或者傳遞函數還是狀態空間,所以可以說正弦信號是系統的特征向量,當然指數信號也是系統的特征向量,用于
傅里葉變換如何用于深度學習領域
機器學習和深度學習中的模型都是遵循數學函數的方式創建的。從數據分析到預測建模,一般情況下都會有數學原理的支撐,比如:歐幾里得距離用于檢測聚類中的聚類。 傅里葉變換是一種眾所周知的將函數從一個域轉換
傅里葉變換基本性質 傅里葉變換本質 傅里葉變換的應用
各個領域都有廣泛的應用。本文將詳細介紹傅里葉變換的基本性質、本質和應用。 一、傅里葉變換的基本性質 1. 線性性:若f1(t)與f2(t)的傅里葉變換分別為F1(f)和F
傅里葉變換的定義 傅里葉變換的意義
傅里葉變換的定義 傅里葉變換的意義? 傅里葉變換,表示能將滿足一定條件的某個函數表示成三角函數(正弦和/或余弦函數)或者它們的積分的線性組合。 在不同的研究領域,傅里葉變換具有多種不同
傅里葉變換基本原理及在機器學習應用
連續傅里葉變換(CFT)和離散傅里葉變換(DFT)是兩個常見的變體。CFT用于連續信號,而DFT應用于離散信號,使其與數字數據和機器學習任務更加相關。
發表于 03-20 11:15
?950次閱讀
評論