MSP430f149超声波测距(实验)详解

所用编辑软件为IAR,无仿真,仅用于口袋实验。可实现功能如下:

1、用超声波模块测量某个障碍物的距离;

2、可通过按键修改上下限报警值;

3、 在OLED屏上实时显示所测障碍物距离、已设定的距离测量的上下限报警值;

4、当超声波模块测的距离大于设定的上限值时,蜂鸣器以0.5Hz的频率报警。当超声波模块测得的距离小于设定的下限值时,蜂鸣器持续报警;

5、当超声波模块测得的距离处于设定的上限值和下限值之间时,蜂鸣器停止鸣叫,LED灯模块按D1~D8的顺序,两个两个地循环亮起;

文章分为三部分

一、手柄板原理图部分讲解

       1.原理图超声波模块及实物模块的安装。

二、基于IAR的编辑,完成上述功能的代码讲解

       1.代码设计及代码逻辑讲解

       2.部分代码展示讲解(结合原理图和手柄板实物)

三、注意事项

一、手柄板原理图部分讲解

1.原理图超声波模块及实物模块的安装。

 

 二、基于IAR的编辑,完成上述功能的代码讲解

 1.代码设计及代码逻辑讲解

        根据要求可以判断需要用到的元器件有:按钮、OLED屏、超声波模块、蜂鸣器、LED灯。

        接下来就根据他们的关系画简易的关系图:

 

       根据我们的逻辑进行编程。

1.先初始化我们已知所需要的引脚:四个按钮引脚,八个LED灯引脚,蜂鸣器引脚,超声波模块引脚。

2.编写函数led8()使其实现LED灯模块按D1~D8的顺序,两个两个地循环亮起。

void led8()
{
  Port_Init();
  
  GPIO_Init(P5,6,GPO,0);
  
  GPIO_Set(P6,0,0);
  delay_ms(100);
  GPIO_Set(P6,0,1);
  
  GPIO_Set(P4,0,0);
  GPIO_Set(P4,1,0);
  delay_ms(100);  
  GPIO_Set(P4,0,1);
  GPIO_Set(P4,1,1);

  GPIO_Set(P4,2,0);
  GPIO_Set(P4,3,0);
  delay_ms(100);
  GPIO_Set(P4,2,1);
  GPIO_Set(P4,3,1);
  
  GPIO_Set(P4,4,0);
  GPIO_Set(P4,5,0);
  delay_ms(100); 
  GPIO_Set(P4,4,1);
  GPIO_Set(P4,5,1);
  
  GPIO_Set(P4,6,0);
  GPIO_Set(P4,7,0);
  delay_ms(100); 
  GPIO_Set(P4,6,1);
  GPIO_Set(P4,7,1);

  Port_Init();
  
}

3.编写距离转化函数ex_num()

void ex_num()                   //距离转化函数
{
          
          ex_max = (int)(setmax * 100);          //先把cm为单位的最大距离放大100倍
          dis_max[0] =  ex_max/10000;
          dis_max[1] =  ex_max/1000%10;
          dis_max[2] =  ex_max/100%10;
          dis_max[3] =  ex_max/10%10;
          dis_max[4] =  ex_max%10;
          
          ex_min = (int)(setmin * 100);         //先把cm为单位的最小距离放大100倍
          dis_min[0] =  ex_min/10000;
          dis_min[1] =  ex_min/1000%10;
          dis_min[2] =  ex_min/100%10;
          dis_min[3] =  ex_min/10%10;
          dis_min[4] =  ex_min%10;
}

4.在User_IdleTask()函数中编写按钮代码(此处只展示其中一个按钮的代码)

if(GPIO_get(P1,6)!=1)
  {
    setmin++;      
    ex_num();
    
    OLED_DisplaySTR(0, 0, "setmin:", 8, 0);
    OLED_DisplayDEC(0, 1, dis_min[0], 8, 0);
    OLED_DisplayDEC(1, 1, dis_min[1], 8, 0);
    OLED_DisplayDEC(2, 1, dis_min[2], 8, 0);
    OLED_DisplaySTR(3, 1, ".", 8, 0);
    OLED_DisplayDEC(4, 1, dis_min[3], 8, 0);
    OLED_DisplayDEC(5, 1, dis_min[4], 8, 0);
    OLED_DisplaySTR(6, 1, "cm", 8, 0);
    
    OLED_DisplaySTR(0, 2, "setmax:", 8, 0);
    OLED_DisplayDEC(0, 3, dis_max[0], 8, 0);
    OLED_DisplayDEC(1, 3, dis_max[1], 8, 0);
    OLED_DisplayDEC(2, 3, dis_max[2], 8, 0);
    OLED_DisplaySTR(3, 3, ".", 8, 0);
    OLED_DisplayDEC(4, 3, dis_max[3], 8, 0);
    OLED_DisplayDEC(5, 3, dis_max[4], 8, 0);
   OLED_DisplaySTR(6, 3, "cm", 8, 0);
    OLED_Update();//oled更新显示
   }

5.在User_IdleTask()函数中编写判断DISTANT的范围代码,即大于setmax时蜂鸣器以0.5Hz的频率报警;小于setmin时蜂鸣器持续报警;处于上下限之间时LED灯模块按D1~D8的顺序,两个两个地循环亮起。(此处代码不展示,重点是if函数的运用)

6.完成编程开始调试,先测试有无代码编写错误,然后将按钮代码注释掉,标注断点,点击Debug without Downloading开始逐行或逐过程调试,检查代码是否符合所需功能。然后连接单片机进行单片机仿真,测试功能。到此试验结束。

三、注意事项

1.编写代码要有耐心,当出现报错是多数情况。

2.启用某个元器件时,先检查是否初始化过该引脚。

3.P14和超声波模块启动口冲突,可以换成P11或者P12。

4.单片机仿真时,必须连接外部电源,不然超声波模块可能会不工作。

 

注:本篇文章仅用于学习分享

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于MSP430微控制器的超声波测距程序的示例: ```c #include <msp430.h> #define TRIGGER_PIN BIT0 #define ECHO_PIN BIT1 volatile unsigned int distance = 0; void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停用看门狗定时器 P1DIR |= TRIGGER_PIN; // 设置TRIGGER_PIN为输出 P1DIR &= ~ECHO_PIN; // 设置ECHO_PIN为输入 P1OUT &= ~TRIGGER_PIN; // 将TRIGGER_PIN置为低电平 __delay_cycles(20000); // 延时20ms P1OUT |= TRIGGER_PIN; // 将TRIGGER_PIN置为高电平 __delay_cycles(10); // 延时10us P1OUT &= ~TRIGGER_PIN; // 将TRIGGER_PIN置为低电平 while (!(P1IN & ECHO_PIN)); // 等待ECHO_PIN变为高电平 TA0CTL = TASSEL_2 + MC_2 + TACLR; // 使用SMCLK作为时钟源,连续计数模式,清除计数器 TA0CCTL0 = CM_3 + CCIS_0 + CAP + CCIE; // 上升沿和下降沿捕获模式,捕获模式选择CCIxA,使能中断 __bis_SR_register(LPM0_bits + GIE); // 进入低功耗模式0,使能全局中断 while (1) { // 在这里可以使用distance变量进行距离的处理和显示 } } #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A(void) { static unsigned int start_time = 0; static unsigned int end_time = 0; if (TA0CCTL0 & CCI) // 检查捕获模式 { start_time = TA0CCR0; // 记录上升沿时间 TA0CCTL0 &= ~CCI; // 切换到下降沿捕获模式 } else { end_time = TA0CCR0; // 记录下降沿时间 distance = (end_time - start_time) / 58; // 计算距离,单位为厘米 TA0CCTL0 |= CCI; // 切换到上升沿捕获模式 } } ``` 这段代码实现了通过超声波测距模块测量距离,并将结果保存在distance变量中。你可以根据需要对distance变量进行处理和显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云缘若仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值