標(biāo)題:
一整套關(guān)于光立方的資源 動(dòng)畫+頻譜 595 573
[打印本頁]
作者:
stc507811
時(shí)間:
2018-4-26 19:37
標(biāo)題:
一整套關(guān)于光立方的資源 動(dòng)畫+頻譜 595 573
包括程序,仿真的代碼
單片機(jī)源程序如下:
//聚強(qiáng)電子
/*****************************************************************************/
/* 光立方【動(dòng)畫+頻譜】 */
/* 配 置: */
/* */
/* 芯 片:STC12C5A60S2 */
/* 晶 振:22.1184MHz */
/* 編 譯 器:KEIL 4 */
/* 驅(qū)動(dòng)芯片:ULN2803 + 74HC573(并行數(shù)據(jù)端口) */
/* 驅(qū)動(dòng)類型:64×8 */
/* */
/* 說 明:動(dòng)畫+頻譜 */
/* */
/*****************************************************************************/
#include <intrins.h> //
#include"STC12C5A60S2.H" //芯片頭文件
#include"FFT.H" //FFT(快速傅里葉變換)功能頭文件
#include"key.h" //按鍵掃描頭文件
#include"zimo.h" //
#include"hc573.h" //hc573驅(qū)動(dòng)
#include"flash.h" //
//定義ULN2803數(shù)據(jù)端口
#define anum P3
//指示用LED(未使用)
sbit LED =P1^3;
//變量區(qū)分定時(shí)器0功能(0:用于音樂頻譜,1:用于動(dòng)畫)
uchar flag1;
//uchar COUNT=15;
//uchar COUNT1=0;
uchar ADC_Count=0,LINE=15,G=0,T;
//uchar code tablew[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//uchar code tablew[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//uchar code tablew[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01};
uchar code tablew[]={0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE};
uchar G;
uchar buffer[8];
//功能初始化
void Init()
{
//IO口默認(rèn)狀態(tài)
P0 = 0x00; //74HC573數(shù)據(jù)口
P2 = 0x00; //74HC573位選端
P3 = 0x00; //ULN2803數(shù)據(jù)口
//IO口模式初始化
P3M0 = 0xff; //ULN2803輸出口設(shè)置為推挽輸出
P3M1 = 0x00;
P0M0 = 0xff; //P0、P2用于控制74HC573,推挽輸出
P0M1 = 0x00;
P2M0 = 0xff;
P2M1 = 0x00;
P4M0 = 0x00; //P4端口接有按鍵,設(shè)置為輸入
P4M1 = 0xff;
//573初始化
initial573();
//----- ADC初始化 ------------------------------------------------------------------------------
P1ASF = 0x02; //0000,0010, 將 P1.1 置成模擬口
AUXR1 &=0xFB; //1111,1011, 令 ADRJ=0
EADC =1; //AD中斷打開
ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | channel; //1110 1001 1打開 A/D (ADC_POWER)轉(zhuǎn)換電源;11速度為90周期一次;
//0中斷標(biāo)志清零;1啟動(dòng)adc(ADC_START);001AD通道打開(這里為P1.1);
//----- 定時(shí)器初始化 ------------------------------------------------------------------------------
//TMOD=0X12;
//TH0=0xf0;
//TL0=0xf0;
//TH1=0xfe;
//TL1=0Xd4;
ET0 = 1; //定時(shí)器0中斷 啟用
TR0 = 0; //定時(shí)器0 關(guān)閉
ET1 = 1; //定時(shí)器1中斷 啟用
TR1 = 0; //定時(shí)器1 關(guān)閉
PT1 = 0; //定時(shí)器1 低優(yōu)先級(jí)
PT0 = 1; //定時(shí)器0 高優(yōu)先級(jí)
IPH = PADCH;
IP = PADC; //中斷優(yōu)先級(jí)
EA = 1; //總中斷打開
clear(0); //清空顯示緩沖區(qū)
//按鍵設(shè)置
P4SW = 0x70; //將NA、ALE、EX_LVD設(shè)置為準(zhǔn)IO口(P4.4、P4.5、P4.6)
}
/******** 主函數(shù) ***************************************************************************************/
void main()
{
uchar i = 0; //for循環(huán)變量
//設(shè)備初始化
Init();
//正常工作循環(huán)
while(1)
{
clear(0); //清空刷新顯示緩沖區(qū)
key_scan(); //掃描按鍵
//關(guān)閉顯示
if(key1flag==1)
{
key1flag = 0;
xiansi1(); //關(guān)閉所有573輸出
anum = 0xff; //關(guān)閉ULN2083輸出
TR1 = 0; //定時(shí)器1 關(guān)閉
TR0 = 0; //定時(shí)器0 關(guān)閉
}
//FFT
if(key2flag==1)
{
TMOD = 0x12; //T0: 8位自動(dòng)重裝 T1: 16位模式
//TH0 = 0xb0; //ADC采樣周期(80us或6.66us) 采樣率 12.5 KHz
//TL0 = 0xb0; //
TH0 = 0x60; //ADC采樣周期(80us或6.66us) 采樣率 12.5 KHz
TL0 = 0x60; //
//TH1 = 0xfe; //刷新顯示周期(300us或25us) 刷新率
//TL1 = 0Xd4; //
TH1 = 0xfd; //刷新顯示周期(300us或25us) 刷新率
TL1 = 0Xa8; //
while(1)
{
flag1 = 0;
TR1 = 1; //刷新顯示
TR0 = 1; //控制采樣速率
//P0 = 0xaa; //P0 未知作用1010 1010
ADC_Count=0;
TR1 = 1; //開啟定時(shí)器中斷1
TR0 = 1; //開啟定時(shí)器中斷0
EADC = 1; //開啟ADC
while(ADC_Count<128); //轉(zhuǎn)換128次
for(i=0;i<128;i++) //FFT參數(shù)虛部賦值
{
Fft_Image[i]=0; //原始數(shù)據(jù) 虛部賦值為0
}
FFT(); //FFT運(yùn)算并轉(zhuǎn)換為各頻段幅值
//其他按鈕,跳出
key_scan();
if(key2flag == 0) break;
}
}
//順序循環(huán)
if(key3flag==1)
{
TMOD=0x11;
while(1)
{
clear(0);
flag1=1; //定時(shí)器0功能控制
TR1=0; //關(guān)閉定時(shí)器1
TR0=1; //開啟定時(shí)器0
//TH0=0xf0;
//TL0=0xff;
flash_6();
clear(0); key_scan(); if(key3flag == 0) break;
flash_5();
clear(0); key_scan(); if(key3flag == 0) break;
flash_1();
clear(0); key_scan(); if(key3flag == 0) break;
flash_2();
clear(0); key_scan(); if(key3flag == 0) break;
flash_4();
clear(0); key_scan(); if(key3flag == 0) break;
flash_3();
clear(0); key_scan(); if(key3flag == 0) break;
flash_8();
clear(0); key_scan(); if(key3flag == 0) break;
flash_7();
clear(0); key_scan(); if(key3flag == 0) break;
flash_11();
clear(0); key_scan(); if(key3flag == 0) break;
flash_9();
clear(0); key_scan(); if(key3flag == 0) break;
flash_10();
clear(0); key_scan(); if(key3flag == 0) break;
flash_11();
clear(0); key_scan(); if(key3flag == 0) break;
flash_6();
clear(0); key_scan(); if(key3flag == 0) break;
flash_5();
clear(0); key_scan(); if(key3flag == 0) break;
flash_4();
clear(0); key_scan(); if(key3flag == 0) break;
flash_7();
clear(0); key_scan(); if(key3flag == 0) break;
flash_9();
clear(0); key_scan(); if(key3flag == 0) break;
flash_8();
clear(0); key_scan(); if(key3flag == 0) break;
flash_4();
clear(0); key_scan(); if(key3flag == 0) break;
flash_2();
clear(0); key_scan(); if(key3flag == 0) break;
}
}
}
}
//定時(shí)器1中斷 用于刷新顯示(只在頻譜顯示時(shí)使用)
void LED_Display() interrupt 3 //中斷一次顯示一列
{
//TH1=0xfe;
//TL1=0xD4;
TH1 = 0xfd; //刷新顯示周期(300us或25us) 刷新率
TL1 = 0Xa8; //
G++;
if(G>=17) G=1;
switch(G) //往點(diǎn)陣屏填充一列的數(shù)據(jù)
{
case 1: anum=tablew[(LED_TAB[1] )%8];hang1();break; //(LED_TAB[1] )%8取八的余數(shù)
case 2: anum=tablew[(LED_TAB[2] )%8];hang1();break;
case 3: anum=tablew[(LED_TAB[3] )%8];hang2();break;
case 4: anum=tablew[(LED_TAB[4] )%8];hang2();break;
case 5: anum=tablew[(LED_TAB[5] )%8];hang3();break;
case 6: anum=tablew[(LED_TAB[6] )%8];hang3();break;
case 7: anum=tablew[(LED_TAB[7] )%8];hang4();break;
case 8: anum=tablew[(LED_TAB[8] )%8];hang4();break;
case 9: anum=tablew[(LED_TAB[9] )%8];hang5();break;
case 10:anum=tablew[(LED_TAB[10])%8];hang5();break;
case 11:anum=tablew[(LED_TAB[11])%8];hang6();break;
case 12:anum=tablew[(LED_TAB[12])%8];hang6();break;
case 13:anum=tablew[(LED_TAB[13])%8];hang7();break;
case 14:anum=tablew[(LED_TAB[14])%8];hang7();break;
case 15:anum=tablew[(LED_TAB[15])%8];hang8();break;
case 16:anum=tablew[(LED_TAB[15])%8];hang8();break;
}
LED=0;
}
//ADC轉(zhuǎn)換完成中斷
void ADC_Finish() interrupt 5
{
ADC_CONTR &= !ADC_FLAG;
Fft_Real[LIST_TAB[ADC_Count]] = (int)((ADC_RES)<<1)+(ADC_RESL>>1)*2; //按LIST_TAB表里的順序,進(jìn)行存儲(chǔ)采樣值
if(ADC_Count<=127){ ADC_Count++; }
else { EADC=0;TR0=0; }
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
光立方源程序 動(dòng)畫 頻譜 595 573.rar
(135.12 KB, 下載次數(shù): 30)
2018-4-26 19:37 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1