这个程序是12年ti杯的声音定位,从51上往msp430g2553上移植中断一直搞不对,有没有大神能帮忙看看,感激不尽啊
从330行后问题不断,main怎么改动?还有就是最后面的外部中断如何用到430上?
#include<msp430g2553.h>
#include<intrinsics.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define delayNOP(); {_nop_();_nop_();_nop_();};
uint DATA_H0,DATA_L0,DATA_H1,DATA_L1; //记录两次中断时长
#define DataDir P1DIR
#define DataPort P1OUT
#define Busy 0x80
/*******************************************************************/
/* */
/*信号输入端口设定 */
/* */
/* */
/*******************************************************************/
#define voice1=P2^3;
#define voice2=P2^4;
#define voice3=P2^5;
uchar IRCOM[7];
/*******************************************************************/
/* */
/*LCD控制端口设定 */
/* */
/* */
/*******************************************************************/
#define LCD_RW_H P2OUT|=BIT0 //P2.0
#define LCD_RW_L P2OUT&=~BIT0 //P2.0
#define LCD_EN_H P2OUT|=BIT1 //P2.1
#define LCD_EN_L P2OUT&=~BIT1 //P2.1
#define LCD_RS_H P2OUT|=BIT2 //P2.2
#define LCD_RS_L P2OUT&=~BIT2 //P2.2
//#define LCD_RW = P2^0;
//#define LCD_EN = P2^1;
//#define LCD_RS = P2^2;//LCD 控制
/*******************************************************************/
/* */
/*LCD设定 */
/* */
/* */
/*******************************************************************/
uchar cdis1[] = {"X:---"};
uchar cdis2[] = {"Y:---"};
#define lcd_busy();
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar dat);
void lcd_init();
void lcd_pos(uchar pos);
void delay(uchar x);
void delay1(uint ms);
void Interrupt_Init();
void voicechuli();
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时?忙?等待。lcd-busy为0时,闲?可写指令与数据。 */
/* */
/*******************************************************************/
void WaitForEnable(void)
{
P1DIR &= 0x00; //将P4口切换为输入状态
LCD_RS_L;
LCD_RW_H;
_NOP();
LCD_EN_H;
_NOP();
_NOP();
while((P1IN & Busy)!=0); //检测忙标志
LCD_EN_L;
P1DIR |= 0xFF; //将P4口切换为输出状态
}
/*void lcd_busy(void)
{
unsigned char busy;
do
{
LCD_RS_L;
LCD_RW_H;
LCD_EN_L;
P1=0xff;
LCD_EN_H;
delayNOP();
P1=0;
busy=0;
P1=0xff;
}
while(busy);
LCD_EN_L;
delayNOP();
}*/
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L?RW=L?E=高脉冲?D0-D7=指令码。 */
/* */
/*******************************************************************/
void LcdWriteCommand(uchar cmd,uchar chk)
{
if (chk) WaitForEnable(); // 检测忙信号?
LCD_RS_L;
LCD_RW_L;
_NOP();
DataPort = cmd; //将命令字写入数据端口
_NOP();
LCD_EN_H; //产生使能脉冲信号
_NOP();
_NOP();
LCD_EN_L;
}
/*void lcd_wcmd(uchar cmd)
{
if WaitForEnable();
LCD_RS_L;
LCD_RW_L;
LCD_EN_L;
delayNOP();
delayNOP();
DataPort = cmd;
delayNOP();
LCD_EN_H;
delayNOP();
LCD_EN_L;
} */
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H?RW=L?E=高脉冲?D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar data)
{
WaitForEnable(); //等待液晶不忙
LCD_RS_H;
LCD_RW_L;
_NOP();
DataPort = data; //将显示数据写入数据端口
_NOP();
LCD_EN_H; //产生使能脉冲信号
_NOP();
_NOP();
LCD_EN_L;
}
/* while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}*/
/**********************************************************/
void lcd_pos(uchar pos)
{
LcdWriteCommand(pos|0x80,1); //数据指针=80+地址变量
}
// void lcd_pos(uchar pos)
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
char m;
delay1(15);
LcdWriteCommand(0x38,0); //16*2显示?5*7点阵?8位数据
delay1(5);
LcdWriteCommand(0x38,0);
delay1(5);
LcdWriteCommand(0x38,0);
delay1(5);
LcdWriteCommand(0x0c,1); //显示开?关光标
delay1(5);
LcdWriteCommand(0x06,1); //移动光标
delay1(5);
LcdWriteCommand(0x01,1); //清除LCD的显示内容
delay1(10);
lcd_pos(0x00); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis1[m] != ' ')
{ //显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis2[m] != ' ')
{
lcd_wdat(cdis2[m]); //显示字符
m++;
}
}
/**********************************************************/
void delay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/**********************************************************/
//****************延时程序****************************
void delay1(uint ms)
{
uchar y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
}
}
}
//**************DCO初始化程序************
void InitializeClocks(void)
{
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
BCSCTL2 &= ~(DIVS_0); //SMCLK为0分频DCO SMCLK = DCO = 16MHz
/*IO口初始化,选择IO口方向,上拉,特殊功能*/
P2DIR &=~BIT3; //将P2.3口设置为输入,外部中断
P2OUT |=BIT3;
P2REN |=BIT3;
P2DIR &=~BIT4; //将P2.4口设置为输入,外部中断
P2OUT |=BIT4;
P2REN |=BIT4;
P2DIR &=~BIT5; //将P2.5口设置为输入,外部中断
P2OUT |=BIT5;
P2REN |=BIT5;
/* TMOD=0x11; //设置定时器1——3ms 16位计数方式
TH0=0x00; //设置定时器2 16位计数方式用于记录时间
TL0=0x00;
TH1=0x00;
TL1=0x00; //开计数 开中断 设置下降沿中断 设置优先级
EA=1; //中断总开关,ea设置中断允许寄存器ie中的ea位
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=1;
PX1=0; */
}
//**************定时器中断初始化程序************
void Interrupt_Init()
{
TACTL = TASSEL1 + TACLR; //选择SMCLK,清除TAR
TACTL |=MC1; //增计数模式
/*IO口初始化,选择IO口方向,上拉,特殊功能*/
/***********外部中断***************/
P2IES &=~BIT3; //P2.3口外部中断为shangs沿触发
P2IFG &=~BIT3; //清中断标准位
P2IE |=BIT3; //P2.3口外部中断使能
P2IES &=~BIT4; //P2.4口外部中断为shangs沿触发
P2IFG &=~BIT4; //清中断标准位
P2IE |=BIT4; //P2.4口外部中断使能
P2IES &=~BIT5; //P2.5口外部中断为shangs沿触发
P2IFG &=~BIT5; //清中断标准位
P2IE |=BIT5; //P2.5口外部中断使能
/***********开总中断************/
__enable_interrupt();
/* TMOD=0x11; //设置定时器1——3ms 16位计数方式
TH0=0x00; //设置定时器2 16位计数方式用于记录时间
TL0=0x00;
TH1=0x00;
TL1=0x00; //开计数 开中断 设置下降沿中断 设置优先级
EA=1; //中断总开关,ea设置中断允许寄存器ie中的ea位
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=1;
PX1=0; */
}
//***************显示程序*************************
void display(uint a,uint b)
{
IRCOM[0]=(char)(a/100);
IRCOM[1]=(char)((a%100)/10);
IRCOM[2]=(char)(a%10);
IRCOM[3]=(char)(b/100);
IRCOM[4]=(char)((b%100)/10);
IRCOM[5]=(char)(b%10);
lcd_pos(0x02);
lcd_wdat(IRCOM[0]); //X百位数显示
lcd_wdat(IRCOM[1]); //X十位数显示
lcd_wdat(IRCOM[2]); //X个位数显示
lcd_pos(0x42);
lcd_wdat(IRCOM[3]); //Y百位数显示
lcd_wdat(IRCOM[4]); //Y十位数显示
lcd_wdat(IRCOM[5]); //Y个位数显示
}
//*********声音信号处理程序*********************
void voicechuli()
{
float time0,time1;
uint s0,s1,x,y,a,b,c,d;
time0=(DATA_H0*256+DATA_L0)*0.001;//定义time0用于记录计算两声波ab差值
time1=(DATA_H1*256+DATA_L1)*0.001;//定义time1用于记录计算两声波ac差值
s0=(int)(time0*340);//ab差值
s1=(int)(time1*340);//ab差值
a=(int)(s0*s0/4);
b=(int)(300-a);
c=(int)(s1*s1);
d=(int)(300-c);
y=(int)((450*(a*d+c*d)+sqrtf(8*225^2*a*b*c*d+4*b*d(c-a)*(a*d-b*c)))/2*(a*d-b*c));
x=(int)((a*(y-225)*(y-225)-a*b)/b);
display(x,y);
}
/************************主函数****************************
文件名?main()
功能? 进入主菜单
入口参数?无
出口参数?无
************************************************************/
void main()
{
Interrupt_Init(); //对中断进行初始化
lcd_init(); //初始化LCD
while(1)
{
if(P2OUT&=~BIT5)
{
DATA_H1=TH1;
DATA_L1=TL1;
TH1=0;
TL1=0;
TR1=0;
voicechuli();
}
}
}
//***********外中断0程序*******************
Int0() interrupt 0//最近点收到声波触发中断开始计时
{
TR0=1;
TR1=1;
EX0=0;
}
//************外中断一程序*****************
Int1() interrupt 2//次近点收到声波触发中断停止计时
{
DATA_H0=TH0;
DATA_L0=TL0;
TH0=0;
TL0=0;
TR0=0;
EX1=0;
} */
此帖出自
小平头技术问答
一周热门 更多>