📄 新建 文本文档.txt
字号:
#include "msp430x22x4.h"
#include "FFT.h"
#include "math.h"
#include "stdio.h"
#include "ocj4x8.h"
#define N 64
unsigned char numbuf[16];
//*****************************************************************遥控定义变量
unsigned int operate_code;
unsigned char bitcnt,key;// 进入中断次数 ,按键码
unsigned char first = 1;//第一次进入遥控中断标志位
unsigned int last,temp;
//**************************************************************AD转换定义的变量
unsigned char adc_flag=0;//转换完结束标志
unsigned char Start=0;//AD转换开好控制键
//**********************************************************傅立叶变换定义的变量
float Re[N],Im[N];//转换结果村于Re[N]中
float tatal_max;
//***************************函数声明*******************************************
//void Signal(void);
void Mix(void);
//void Cycle(void);
//**********************************主函数由此开始******************************
void main( void )
{
WDTCTL=WDTPW+WDTHOLD;//关看们狗
BCSCTL1=CALBC1_1MHZ; //设定DCO 为1MHZ
DCOCTL=CALDCO_1MHZ;
//*******************************遥控解码***************************************
P4SEL|=0x01;//P4.0选择第二功能下降沿捕获发生中断 用于红海外接收一体化
P1DIR|=0x04;//P1.2方向寄存器选择输出
P1OUT|=0x04;//P1.2输出高电平,蜂鸣器不叫
//********************液晶显示控制位********************************************
P4DIR|=0x02;
P3DIR|=0x0a;
//*****************TA定时器用于决定AD的采样率***********************************
P2SEL|=0x01;//设置P2.0为模拟通道A0
ADC10CTL0&=~(ENC);//修改ADC寄存器的值
ADC10CTL1|=INCH_0+ADC10SSEL_3+CONSEQ_0 ;//选择A0输入通道,时钟源为MCLK,单通道单次转换
ADC10CTL0|=SREF_0 +ADC10ON+MSC;//vcc参考源,转换模块开启
ADC10AE0|=0x01;//通道A0允许
ADC10CTL0|=ENC;//使能转换
TACTL|=TASSEL_2 +TACLR ;
TACCTL0|=CCIE;
TACCR0=40000;//决定AD的采样率
TACTL|=MC_1;
//***********************TB定时用于遥控解码************************************
TBCTL=0x0220;//选择时钟源为系统时钟,不分频,为连续计数模式,溢出中断禁止
TBCCTL0=0x8918;//下降沿捕获,选择CCI0A做为输入源,同步捕获,捕获模块允许中断为捕获模式
//***************************************************************************
_EINT();
init_lcd();clrram ();
while(key==0){dprintf(0,1,"音频信号采集");
dprintf(1,2,"HUBU小组");
dprintf(2,3,"制作");
dprintf(3,0,"开始>>>");}
clrram ();
while(1)
{
if(key==0x01){ Start=1;dprintf(1,0,"数据采集中...");}
//******************************************************************************
if(adc_flag==1)//数据采集完毕标志
{
clrram ();
// dprintf(0,0,"采集完毕");
// delay(60000);
clrram ();
dprintf(0,0,"分析方式选择");
dprintf(1,0,"1.单频信号-T");//key=0x11
dprintf(2,0,"2.混频信号-T");//key=0x12
//key=0x13,周期性分析
while(1)
{
// if(key==0x0a){WDTCTL = WDTPW|0xff00;} //系统复位
/* if(key==0x11){clrram ();}
while(key==0x11)
{
dprintf(2,0,"单音频信号");
delay(40000);
if(key==0x13){key=0x11;} //Cycle();}//周期性分析
if(key==0x0f){break;}//按此键返回所选的分析方式,跳回到分析方式选择页面
// Signal();//单音频信号分析
Start=1;
if(key==0x07){Start=0;while(key==0x07);}//此键设为暂停键,可按任意键返回
if(key==0x0a){WDTCTL = WDTPW|0xff00;} //系统复位
}*/
if(key==0x12){clrram ();}
while(key==0x12)
{
//dprintf(2,0,"混频信号");
// delay(40000);
if(key==0x13){key=0x12;}//Cycle();}
//if(key==0x0f){break;}
Mix();
// if(key==0x07){Start=0;while(key==0x07);}//此键设为暂停键,可按任意键返回
if(key==0x0a){WDTCTL = WDTPW|0xff00;} //系统复位
}
}
}
//******************************************************************************
}
}
//########################Timer_B interrupt 遥控解码部分########################
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B(void)
{
if(first ==1)
{
TBCTL=0x0224;//定时器清零
P2OUT&=0xfe;
last=TBCCR0;
last=0;
first=0;
}
else if(first==0)
{
TBCTL=0x0224;//定时器清零
temp=TBCCR0-last;
if(temp>1024&&temp<1225){ temp=0;} // 判断数据0信号
else if(temp>2145&&temp<2345){ temp=0x8000;} // 判断数据1信号
else if(temp>13400&&temp<14600) // 判断引导码信号
{ bitcnt=0;//user_code0=0;user_code1=0;
operate_code=0; return;} // 返回,等待下次开始接收
else { first=1;return; } // 干扰信号
bitcnt++;
if(bitcnt<13){_NOP();}//user_code0|=temp; user_code0>>=1;} //开始接收前13位用户识别码
else if(bitcnt==13){_NOP();}// user_code0|=temp;}
else if(bitcnt<26){_NOP();}//user_code1|=temp;user_code1>>=1;} //开始接收后13位用户识别码
else if(bitcnt==26){_NOP();}//user_code1|=temp;}
else if(bitcnt<42){operate_code|=temp;operate_code>>=1;} //开始接收16位(8位操作码和8位操作反码)
else if(bitcnt==42){ bitcnt=0;
operate_code|=temp;
key=operate_code&0x00ff;
P1OUT&=0xfb;//P1.2输出低电平,蜂鸣器叫
delay(40000);
P1OUT|=0x04;//P1.2输出高电平,蜂鸣器不叫
}
}
}
//##########################Timer_A interrupt 确定采样频率######################
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
static unsigned char i;
if(Start==1)
{
ADC10CTL0&=~ENC;
Re[i]=(float) (ADC10MEM)*3/1023;
i++;
if(i==64)
{adc_flag=1; Start=0;}
ADC10CTL0|=ENC+ADC10SC;
}
}
//*****************混频信号分析************************************************
void Mix(void)
{
FFT(-1,6,Re,Im);
Apower(Re,Im);
tatal_max=Wpower(Re,Im);
clrram ();
dprintf(0,2,"测试结果");
dprintf(1,0,"总功率:");
sprintf(numbuf,"%0.3fmw",tatal_max);
dprintf(1,4,numbuf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -