TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F149超声波测距程序

/P1.0发出信号,P4.0接收信号,将距离显示到显示屏上

#include<msp430x14x.h>      

#include "12864.h"

#define CPU_F ((double)8000000) 

#define DelayUs(x) __delay_cycles((unsigned long)(CPU_F*(double)x/1000000.0)) 

#define DelayMs(x) __delay_cycles((unsigned long)(CPU_F*(double)x/1000.0))

 

 unsigned int width;

 float float_range;

 unsigned int_range;

 unsigned int i=0; 

 unsigned int int_range100,int_range10,int_range1;

 

void StartModule()

{

  P1OUT|=BIT0;

  DelayUs(100);

  P1OUT&=~BIT0;

  DelayMs(70);

}

 

 void main() 

  WDTCTL=WDTPW+WDTHOLD;         //关闭看门狗 

  P1DIR|=BIT0;

  P4SEL|=BIT0;                          //P4.0作为捕获模块功能的输入端输入方波 

 

   //——-开晶振XT2——— 

 

   BCSCTL1&=~XT2OFF;                //打开XT2振荡器 

   do 

   { 

   IFG1 &= ~OFIFG;                     // 清除振荡器失效标志 

   for (i=256;i>0;i–);                     // 延时,等待XT2起振 

   } 

  while ((IFG1 & OFIFG) != 0);            // 判断XT2是否起振 

 

  BCSCTL2 =SELM_2+SELS;             //选择MCLK=SMCLK为XT2 

 

  //—————————– 

 

  TBCCTL0&=~(CCIS1+CCIS0);          // 捕获源为P4.0,即CCI0A(也是CCI0B) 

  TBCCTL0|=CM_2+SCS+CAP;           //下降沿捕获,同步捕获,工作在捕获模式 

  TBCCTL0|=CCIE;                     //允许捕获比较模块提出中断请求 

  TBCTL|=ID_3; 

  TBCTL|=TBSSEL_2;                   //选择时钟MCLK 

  TBCTL|=TBCLR;                      //定时器清零, 

  //定时器开始计数(连续计数模式0~0xFFFF) 

  TBCTL|=MC_2; 

  LcdInit();   //初始化液晶屏

  LcdDisplayStr(1,0,"测得的距离:");

  LcdDisplayStr(2,6,"mm");

  _EINT(); 

 

 for(;;)

  {

       StartModule();

   } 

 

//―――――定时器TB的CCR0的中断:用于检测脉冲上升与下降沿―――― 

#pragma vector=TIMERB0_VECTOR        

__interrupt void TimerB0(void) 

   if(TBCCTL0&CM0)                        //捕获到上升沿 

     { 

       TBCTL|=TBCLR; 

       TBCCTL0=(TBCCTL0&(~CM0))|CM1;    //改为下降沿捕获:CM0置零,CM1置一 

     } 

   else if(TBCCTL0&CM1)                    //捕获到下降沿 

     { 

       width=TBCCR0;                  //记录下结束时间 

       TBCCTL0=(TBCCTL0&(~CM1))|CM0;    //改为上升沿捕获:CM1置零,

       float_range=0.2125*width;//计算距离,单位毫米

       int_range=(int)float_range;

       int_range1=int_range%10;

       int_range10=(int_range-int_range1)/10%10;

       int_range100=(int_range-int_range1-int_range10)/100%10;

         LcdDisplayStr(2,4,"");//里面什么也不写,相当于给它定位置

         Send(1,int_range100+0x30);//写入数字,但是只能显示一个数字

         Send(1,int_range10+0x30);

         Send(1,int_range1+0x30);

     } 

 

}

灰小子:

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F149超声波测距程序
分享到: 更多 (0)