|
包括程序,仿真的代碼
單片機(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
|
|