标题: msp430f5529的超声波测距,一直在lcd上显示0m?求大神指点 [打印本页]

作者: 两个半橙子    时间: 2021-6-9 22:45
标题: msp430f5529的超声波测距,一直在lcd上显示0m?求大神指点
#include <lcd.h>
#include <msp430f5529.h>
#include <string.h>


unsigned char Range[]= " maxD: 50 M ";
unsigned char distance[] = "distance:";
unsigned char ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
uint lastCCR1;


unsigned int  t=0;
unsigned long S=0;
unsigned char disbuff[4] = {0,0,0,0};


void delayms(unsigned int m)
         {
           unsigned int i, j;
           for(i=0; i<m; i++)
             for(j=0; j<1000; j++);
         }


void Conut(void)
        {
                   S=(t*1.7)/100;     //算出来是CM
                   if((S>=700))       //超出测量范围显示“-”
                   {
                    DisplayOneChar(10, 1, ASCII[11]);
                    DisplayOneChar(11, 1, ASCII[10]);  //显示点
                    DisplayOneChar(12, 1, ASCII[11]);
                    DisplayOneChar(13, 1, ASCII[11]);
                    DisplayOneChar(14, 1, ASCII[12]);  //显示M
                   }
                   else
                   {
                    disbuff[0]=S%1000/100;
                    disbuff[1]=S%1000%100/10;
                    disbuff[2]=S%1000%100%10;
                    DisplayOneChar(10, 1, ASCII[disbuff[0]]);
                    DisplayOneChar(11, 1, ASCII[10]);  //显示点
                    DisplayOneChar(12, 1, ASCII[disbuff[1]]);
                    DisplayOneChar(13, 1, ASCII[disbuff[2]]);
                    DisplayOneChar(14, 1, ASCII[12]);  //显示M
                   }
       }


void  StartModule()                 //启动模块
        {
           uint i;
           P6OUT|=BIT0  ;                            //启动一次模块
           __delay_cycles(20);      //20个机器周期,20μs
           P6OUT&=~BIT0 ;
        }


void  Initclock()
       {
          UCSCTL3 = SELREF_2;//FLL参考时钟源REFO
          UCSCTL4 |= SELA_2; //先设置ACLK为REFO
          //测试晶振是否失效,并清除故障失效标志位
          do
          {
            UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                          //清除XT2、XT1、DCO故障失效标志位
            SFRIFG1 &= ~OFIFG;            //清除晶振故障失效中断标志位
          }while (SFRIFG1&OFIFG);         //测试晶振故障失效中断标志位


          __bis_SR_register(SCG0);        //关闭FLL
          UCSCTL1 = DCORSEL_5;            //选择DCO的工作频率范围
          UCSCTL2 |= 249;                 //(259+1)*32768 = 8Mhz
          __bic_SR_register(SCG0);        //启用FLL
          __delay_cycles(2500000);        //延时,等待DCO工作稳定
          UCSCTL4 |=SELM_3 + SELS_3;      //主时钟、子时钟均配置为dcoclk
          UCSCTL5 |=DIVM_3 + DIVS_3;      //主时钟、子时钟8分频
       }


void  SetTIMEA()
       {
           t=0;
           lastCCR1=0;
           TA0CTL = CM_3+TACLR+TASSEL_2+ID_2+MC_2+TAIE;  //计数清0,选子系统时钟做时钟源,连续计数模式,定时器允许中断


       }


int main(void)
{
        WDTCTL = WDTPW | WDTHOLD;        // stop watchdog timer
        P6DIR|=BIT0;
        P1DIR&=~BIT2;
        P1SEL|=BIT2;
        Initclock();
        P6OUT&=~BIT0 ;
        InitLcd1602();
        SetTIMEA();
        TA0CCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
        LcdShowStr(2,0,Range);
        LcdShowStr(0,1,distance);
        _EINT();
        while(1)
        {


            StartModule();
            Conut();
            delayms(10);


        }
}


#pragma vector = TIMER0_A1_VECTOR       //CCR1捕获产生中断
__interrupt void TIMER0_A1__ISR(void)
{
    TA0CCTL1&=~CCIFG;//中断标志清零
    switch(__even_in_range(TA0IV,14))
    {
    case 0:
        break;
    case 2:                //CCR1捕获中断
      if(P1IN&BIT2==1)
           {
             lastCCR1 = TA0CCR1;
             TA0CCTL1 = CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
           }
      else
      {
            _DINT();                               //关闭全局中断
            t=TA0CCR1-lastCCR1;
            TA0CCR1 = 0;
            TA0CCTL1= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
            _EINT();
      }
      break;
    case 4:
      break;
    case 6:
      break;
    case 8:
      break;
    case 0x0A:
      break;
    case 0x0C:
      break;
    case 0x0E:                                       //定时器溢出中断
       if(TA0CCTL1&COV)
          TA0CCTL1&=~COV;
      break;
    default:
      break;
   }
}


作者: lidalinqing    时间: 2021-7-6 01:00
兄弟你定义的接口是哪里?我怎么看不懂




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1