📄 fft.c.svn-base
字号:
for(s=0;s<8;s++) //发送16字节数据
{
temp=BUFF[s];
temp=255-temp;
temp1=BUFF1[s];
temp1=255-temp1;
SDA_R=SDA_G_TOP=1;
for(k=0;k<8;k++)
{
SHCP=0;
SDA_G=(bit)(temp&0x01);//这里SERr定义成普通IO口就得了
temp=temp>>1;
SDA_R_TOP=(bit)(temp1&0x01);
temp1=temp1>>1;
SHCP=1;
}
}
}
/**********************************************************/
void in_data(void) //调整数据
{
char s;
for(s=4;s>=0;s--) //i为向后先择字节计数器,zimuoo为向后先字计数器
{
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*linee]; //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
BUFF[2*s]=hanzi[zimuo+32*s+2*linee]; //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
BUFF1[2*s+1]=hanzi1[zimuo+1+32*s+2*linee]; //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
BUFF1[2*s]=hanzi1[zimuo+32*s+2*linee]; //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
}
}
void show_start() //上电显示 点阵频谱 正在启动
{
for(stop=0;stop<250;stop++)
{
while(Move<16) //数据移位。
{
for(Speed=0;Speed<20;Speed++) //移动速度
{
for(linee=0;linee<16;linee++)
{
in_data(); //调整移动数据
rxd_data();
P0=sw[linee];
STCP=1;//锁存
STCP=0;
STCP=1;
delay3ms(); //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。
}
}
Move++; //移动一步
}
}
}
/*******************************************/
void Scan_Mode() //扫描模式
{
switch (Mode)
{
case 0x00:
fractional_frequency=16; //16分频
break;
case 0x01:
fractional_frequency=64;// 64分频
break;
case 0x02:
fractional_frequency=64; //预留功能
break;
default:
fractional_frequency=16;//否则为16分频
break;
}
}
/*****************************************/
void ADC_Finish() interrupt 5
{
ADC_CONTR &= !ADC_FLAG;
Fft_Real[LIST_TAB[ADC_Count]]=(int)((ADC_RES*2)<<2)+(ADC_RESL)*6;//-512;
// Fft_Real[LIST_TAB[ADC_Count]]=(int)((ADC_RES)<<1)+(ADC_RESL>>1)*2;//-512; //按LIST_TAB表里的顺序,进行存储 采样值,,
// ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | channel; // 为了采集负电压,采用 偏置采集。电压提高到1/2 vcc,,所以要减去256
if(ADC_Count<=127) //采集128个AD值 没有滤波
ADC_Count++;
else
{
EADC=0;
TR0=0;
}
}
void LED_Display() interrupt 3 //中断一次 显示一行。。。
{
uchar j;
TH1=0xf2;
TL1=0XAa;
LED_TAB[0]=LED_TAB1[0]=LED_TAB[1]; //让第一列和地二列显示效果一样
for (G=0;G<fractional_frequency;G++) //往点阵屏填充 一行的 数据
{
if(color==0) //如果是 柱状红色
{
if(LED_TAB[G]<=LINE+16)
SDA_R_TOP=1;
else
SDA_R_TOP=0;
if(LED_TAB[G]<=LINE)
SDA_R=1;
else
SDA_R=0;
if(LED_TAB1[G]==LINE)
{
SDA_G_TOP=1;
SDA_G=0;
}
else if(LED_TAB1[G]==(LINE+16))
{
SDA_G_TOP=0;
SDA_G=1;
}
else
SDA_G=SDA_G_TOP=1;
SHCP=1;
SHCP=0;
}
else if(color==1) //如果是柱状 绿色
{
if(LED_TAB[G]<=LINE+16)
SDA_G_TOP=1;
else
SDA_G_TOP=0;
if(LED_TAB[G]<=LINE)
SDA_G=1;
else
SDA_G=0;
if(LED_TAB1[G]==LINE)
{
SDA_R_TOP=1;
SDA_R=0;
}
else if(LED_TAB1[G]==(LINE+16))
{
SDA_R_TOP=0;
SDA_R=1;
}
else
SDA_R=SDA_R_TOP=1;
SHCP=1;
SHCP=0;
}
if(fractional_frequency==16) //如果是16分频 送三次一样的数据 中间送个空格
{
SHCP=1;
SHCP=0;
SHCP=1;
SHCP=0;
SDA_G_TOP=1;
SDA_G=1;
SDA_R_TOP=1;
SDA_R=1;
SHCP=1;
SHCP=0;
}
}
STCP=1;
STCP=0;
P0=sw[15-LINE];
if(LINE>0)
LINE--;
else
LINE=15;
for(j=0;j<fractional_frequency/16;j++) //根据是16分频 与64分频 来判断柱状递减的速度
{
if(LED_TAB[COUNT]>0)
LED_TAB[COUNT]--; //柱状递减,
if(COUNT>0)
COUNT--;
else
COUNT=fractional_frequency-1;
}
/*if(LED_TAB[COUNT]>0)
LED_TAB[COUNT]--; //柱状递减,
if(COUNT>0)
COUNT--;
else
COUNT=15;
if(LED_TAB[COUNT]>0)
LED_TAB[COUNT]--;
if(COUNT>0)
COUNT--;
else
COUNT=15;
//漂浮物递减
if(LED_TAB2[COUNT1]==0) //判断是否需要停顿
{
if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])LED_TAB1[COUNT1]--;//大于柱状则递减(保持漂浮物在柱状之上)
}
else
LED_TAB2[COUNT1]--;
COUNT1++;
if(COUNT1>=16)COUNT1=0;*/
if(fractional_frequency==16) //判断是否是16分频
{
Stop_time=1;
}
else //如果是64分频
{
Stop_time=3;
}
for(j=0;j<Stop_time;j++) //16 Stop_time 变量漂浮点递减速度控制
{
if(LED_TAB2[COUNT1]==0)
{
if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])
LED_TAB1[COUNT1]--;
}
else
LED_TAB2[COUNT1]--;
COUNT1++;
}
if(COUNT1>=fractional_frequency)
COUNT1=0;
/*******************************************************************/
}
void Ad_Control() interrupt 1 //控制采样率
{
ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | channel; //开始AD采集
}
//==============================================================================================================
// ******************* main() *********************************
//===============================================================================================================
/**************************延时***********************/
//
void DelayMs(void)
{
uchar TempCyc;
for(TempCyc=100;TempCyc>1;TempCyc--)
{;}
}
/*****************************************************/
void main()
{
uchar i;
Init();
while(1)
{
ADC_Count=0;
TR0=1;
EADC=1; //开启定时器中断0,,开启ADC
while(ADC_Count<128); //取128个点
/*********************************/
if(key_moda==0) //按键S2 模式改变 16与64分频
{
DelayMs();
if(key_moda==0)
{
Mode++;
if(Mode>2)
{
Mode=0;
}
Scan_Mode();
sector_erase(0); //擦擦第1个扇区 512字节一个扇区
byte_program(0,Mode);// 存放在EEP第一扇区
}
while(key_moda==0);
}
/******************************************/
if(key_color==0) //柱条颜色改变
{
DelayMs();
if(key_color==0)
{
color++;
if(color>1)
{
color=0;
}
sector_erase(0x200); //擦擦第2个扇区 512字节一个扇区
byte_program(0x200,color);// 存放在EEP第二扇区
}
while(key_color==0);
}
/**************************************/
for(i=0;i<128;i++)
{
Fft_Image[i]=0; //虚部清0
}
FFT();
//FFT运算。并转换为 功率值。。。
//TR1=1;
}
}
const uchar code hanzi[]={/*移动显示汉字字模,*/
0x00,0x00,0xFE,0x7F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x08,0x01,0x08,0x3F,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0xFF,0x7F,0x00,0x00,0x00,0x00,/*"正",0*/
0x40,0x00,0x40,0x00,0xFE,0x7F,0x20,0x00,0x20,0x00,0x10,0x02,0x18,0x02,0xE8,0x3F,0x0C,0x02,0x0A,0x02,0x09,0x02,0x08,0x02,0x08,0x02,0xE8,0x7F,0x08,0x00,0x00,0x00,/*"在",1*/
0x80,0x00,0x00,0x03,0x00,0x01,0xF8,0x3F,0x08,0x20,0x08,0x20,0xF8,0x3F,0x08,0x00,0x08,0x00,0xE8,0x3F,0x28,0x20,0x24,0x20,0x24,0x20,0xE2,0x3F,0x21,0x20,0x00,0x00,/*"启",2*/
0x00,0x04,0x00,0x04,0x7E,0x04,0x00,0x04,0x00,0x3F,0xFF,0x24,0x08,0x24,0x08,0x24,0x24,0x24,0x44,0x24,0xF2,0x22,0x5F,0x22,0x02,0x21,0x80,0x28,0x40,0x10,0x00,0x00,/*"动",3*/
};
const uchar code hanzi1[]={/*移动显示汉字字模,*/
0x80,0x00,0x80,0x00,0x80,0x1F,0x80,0x00,0x80,0x08,0xF8,0x1F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,0x80,0x08,0x14,0x11,0x24,0x22,0x22,0x22,0x00,0x00,/*"点",0*/
0x00,0x01,0x1F,0x01,0x11,0x01,0xE9,0x3F,0x85,0x00,0x89,0x02,0x51,0x02,0xF1,0x3F,0x11,0x02,0x15,0x02,0xE9,0x7F,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,0x01,0x02,/*"阵",1*/
0x10,0x00,0x10,0x7F,0x72,0x04,0x12,0x02,0x12,0x3F,0x7F,0x21,0x00,0x25,0x10,0x25,0x52,0x25,0x52,0x25,0x21,0x25,0x10,0x0A,0x08,0x12,0x04,0x61,0xC3,0x40,0x00,0x00,/*"频",2*/
0x40,0x10,0x82,0x08,0xF4,0x7F,0x8C,0x08,0xA4,0x28,0xC0,0x18,0xF7,0x7F,0x04,0x00,0xC4,0x1F,0x44,0x10,0x44,0x10,0xC4,0x1F,0x54,0x10,0x4C,0x10,0xC4,0x1F,0x40,0x10,/*"谱",3*/
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -