[资料] MSP430F149超声波测距
829 查看
5 回复
 楼主 | 发布于 2018-02-26 | 只看楼主
分享到:

//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=SMCLKXT2

 

  //-----------------------------

 

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

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

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

  TBCTL|=ID_3;

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

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

  //定时器开始计数(连续计数模式00xFFFF

  TBCTL|=MC_2;

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

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

  LcdDisplayStr(2,6,"mm");

  _EINT();

 

 for(;;)

  {

       StartModule();

   }

}

 

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

#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 ) (1 )
回复 举报

回复于 2018-02-27 沙发

注释很详细,谢谢分享
(0 )
评论 (0) 举报

回复于 2018-03-07 2#

学习学习,谢谢分享
(0 )
评论 (0) 举报

回复于 2019-01-04 3#

感谢分享!!需要机器人(工业,服务)的设计方案;自动化设备改造(螺丝机,点胶机等)以及个电子相关的新产品研发(微信调控暖手宝温度等)。 
(0 )
评论 (0) 举报

回复于 2019-01-12 4#

感谢分享!!
(0 )
评论 (0) 举报

回复于 2019-02-14 5#

谢谢分享
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部