|
本帖最后由 zpmzqr 于 2019-9-12 19:25 编辑
- #define uchar unsigned char
- #define uint unsigned int
- #define OUT_Port P0 //输出
- #define ADC_CHO 0x00 //AD通道为(111) P1.0
- #define ADC_POWER 0x80 //AD电源
- #define ADC_START 0x08 //AD启动
- #define ADC_FLAG 0x10 //AD标志
- //#define ADC_SPEED 0x00 //420 clocks
- //#define ADC_SPEED 0x20 //280 clocks
- //#define ADC_SPEED 0x40 //140 clocks
- #define ADC_SPEED 0x60 //70 clocks 31kHZ
- uchar code EF_Tab[]={0x01,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,0xff};//显示效果
- uchar data ADCTmp_Tab[FFT_PCS]; // ADC输入缓存
- uchar idata Gap_Tab[FFT_X]; //下落间隔计数
- uchar idata Out_Tab[FFT_X]; //实际输出缓存
- uchar data ADC_Count=0; //采集计数
- sbit Rout=OUT_Port^4; //高中低音输出端口
- sbit Gout=OUT_Port^5;
- sbit Bout=OUT_Port^6;
- sbit Yout=OUT_Port^7;
- bit ADCOK_BT;//采集完成标志
- void Display_OUT()//显示数据输出
- {
- if(Out_Tab[0]>7)Rout=1; else Rout=0; //高中低音指示灯输出
- if(Out_Tab[1]>7)Gout=1; else Gout=0;
- if(Out_Tab[2]>6)Bout=1; else Bout=0;
- if(Out_Tab[3]>6)Yout=1; else Yout=0;
-
- TM1640_GRID[15]=EF_Tab[Out_Tab[0]]; //R0 1640点阵输出
- TM1640_GRID[14]=0; //G0
- TM1640_GRID[13]=0;
- TM1640_GRID[12]=EF_Tab[Out_Tab[1]];
- TM1640_GRID[11]=EF_Tab[Out_Tab[2]];
- TM1640_GRID[10]=EF_Tab[Out_Tab[2]];
- TM1640_GRID[9]=EF_Tab[Out_Tab[3]];
- TM1640_GRID[8]=0;
- TM1640_GRID[7]=0;
- TM1640_GRID[6]=EF_Tab[Out_Tab[4]];
- TM1640_GRID[5]=EF_Tab[Out_Tab[5]];
- TM1640_GRID[4]=EF_Tab[Out_Tab[5]];
- TM1640_GRID[3]=EF_Tab[Out_Tab[6]];
- TM1640_GRID[2]=0;
- TM1640_GRID[1]=0;
- TM1640_GRID[0]=EF_Tab[Out_Tab[7]];
-
- TM1640B_GRID[15]=EF_Tab[Out_Tab[8]];
- TM1640B_GRID[14]=EF_Tab[Out_Tab[8]];
- TM1640B_GRID[13]=0;
- TM1640B_GRID[12]=EF_Tab[Out_Tab[9]];
- TM1640B_GRID[11]=0;
- TM1640B_GRID[10]=EF_Tab[Out_Tab[10]];
- TM1640B_GRID[9]=0;
- TM1640B_GRID[8]=EF_Tab[Out_Tab[11]];
- TM1640B_GRID[7]=EF_Tab[Out_Tab[12]];
- TM1640B_GRID[6]=0;
- TM1640B_GRID[5]=EF_Tab[Out_Tab[13]];
- TM1640B_GRID[4]=0;
- TM1640B_GRID[3]=EF_Tab[Out_Tab[14]];
- TM1640B_GRID[2]=0;
- TM1640B_GRID[1]=0;
- TM1640B_GRID[0]=EF_Tab[Out_Tab[15]];
- TM1640_WriteDisp(0x8b); //1640显示
- }
- /*-----T1中断-----------------------------刷新显示----------------------*/
- void RefreshDisplay() interrupt 3
- {
- uchar i;
- TL1 = 0x33; //设置定时初值4MS
- TH1 = 0xE3; //设置定时初值
- if(Fft_DispBT) //显示标志
- {
- for(i=0;i<FFT_X;i++)//输出效果上升直接显示,下落间断
- {
- if(FftOut_Tab[i]>Out_Tab[i])
- {Out_Tab[i]=FftOut_Tab[i];Gap_Tab[i]=0;}
- else if(FftOut_Tab[i]<Out_Tab[i])
- {
- Gap_Tab[i]++;
- if(Gap_Tab[i]>4)
- {
- Out_Tab[i]--;Gap_Tab[i]=0;
- }
- }
- }
- Display_OUT(); //显示输出
- }
- }
- /*-----ADC中断----------44100/128=345HZ频率点------32000/64=500HZ频率点----------------*/
- void ADC_Finish() interrupt 5 //ADC中断
- {
- ADC_CONTR &= !ADC_FLAG; //清除标志
- ADCTmp_Tab[LIST_TAB[ADC_Count]]=ADC_RESL<<2;//按LIST_TAB表里的顺序,进行存储采样值 低8位
- ADC_Count++;if(ADC_Count>=FFT_PCS){ADCOK_BT=1;ADC_Count=0;}//置位 EADC=0;TR0=0;
- }
- /*---T0中断-启动ADC控制采样率,------------1000000US/32000HZ=31.25US-------------------------*/
- void Ad_Control() interrupt 1
- {
- ADC_CONTR = ADC_POWER | ADC_SPEED | ADC_START | ADC_CHO;//1110 1000 1打开 ADC_POWER转换电源;11速度为70周期一次;0中断标志清零;1启动adc(ADC_START);000AD通道打开(这里为P1.0);
- }
- /*----------------------系统初始化----------22.1184-----------12T----------------------------*/
- void STC_INIT()
- {
- /*----------------------AD------------------------------------------------------------*/
- P1ASF = 0x01; //0000,0000, 将 P1.0 置成模拟口
- AUXR1|= 0x04; //1111,1011, ADRJ=1 高2位放ADC_RES 低8位放ADC_RESL
- EADC=1; //AD中断打开
- ADC_CONTR = ADC_POWER | ADC_SPEED | ADC_CHO; //打开ADC电源
- /*----------------------Uint---------------------------------------------------------*/
- TMOD= 0X12; //T1 16位, T0 8位自动重载
- TL0 = 0xC6; //设置定时初值 频率≈44KHZ,1000000/44100=22.67US; 值D6
- TH0 = 0xC6; //设置定时重载值 频率≈32KHZ,1000000/32000=31.25US; 值C6
-
- TL1 = 0x33; //设置定时初值设4MS 采集64次时间 31.25*64=2000US+FFT时间≈3US
- TH1 = 0xE3; //设置定时初值
- ET0=1; //定时器0中断打开
- TR0=0; //关闭定时器0
- ET1=1; //定时器1中断打开
- TR1=1; //启动定时器0
- PT1=0; //T1中断优先级 0
- PT0=1; //T0中断优先级 1
- IPH=0X20; //ADC中断优先级 2
- PADC=1; //ADC中断优先级 3
- EA=1; //总中断打开
- OUT_Port=0X00; //输出
- }
- void main()//主程序
- {
- unsigned char i;
- STC_INIT();
- TR0=1;EADC=1; //开启定时器中断0,开启ADC
- while(1)
- {
- // ADC_Count=0;
- // TR0=1;EADC=1; //开启定时器中断0,开启ADC
- // while(!ADCOK_BT);
- if(ADCOK_BT)
- {
- for(i=0;i<FFT_PCS;i++)
- {FftReal_Tab[i]=ADCTmp_Tab[i];FftImage_Tab[i]=0;}//
- FFT_OUT();//FFT运算并转换为各频段幅值
- ADCOK_BT=0;
- }
- }
- }
复制代码 |
|