这段程序的中断到底该怎么改呢?程序是从51上移植过来的

2019-03-24 10:12发布

这个程序是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;

} */




此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
qiushenghua
2019-03-25 02:24
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章