电赛MSP430F5529之超声波测距+OLED 显示(含主要代码)

这篇具有很好参考价值的文章主要介绍了电赛MSP430F5529之超声波测距+OLED 显示(含主要代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、超声波介绍

二、部分代码

三、总结


前言

哎,又双叒叕,电赛延期了,看起来像是遥遥无期,但是肯定要考虑大局,大家就继续抓紧时间学习知识,巩固自己的知识,更进一步。好了,今天主要是继承上一篇博文(OLED显示)写的,主要是写超声波测距的(US-015)


一、超声波介绍

利用TI公司的MSP430F5529单片机+超声波模块+OLED 实现

这里主要是利用单片机定时器的捕获功能来捕获超声波高电平持续时间,再计算得到距离,最后再在OLED 屏幕上显示出来,上图:

msp430超声波测距代码,MSP430F5529,单片机,msp,经验分享,其他,c语言

这里是把数字用了32号的,比较清晰,大家也可以自己更改

具体怎么接OLED 屏幕上一讲里面代码也有详细介绍,这里的超声波模块的Trig我接的是1.3,Echo接的是1.2

P1.2 为echo       设置为捕获模式
介绍:P1.2 具有端口中断的通用数字I / O ,TA0 CCR1捕获:CCI1A输入,比较:Out1输出  BSL接收输入
P1.3 为Trig         设置为 数字i/o模式
介绍:P1.3 具有端口中断的通用数字I / O , TA0 CCR2捕获:CCI2A输入,比较:Out2输出
 


二、部分代码

超声波模块初始化

void US_015_Init(void)
{

    P1OUT &= ~( BIT2 + BIT3 );
    P1DIR |=  BIT3;
    P1SEL |=  BIT2;

    TA0CTL   = TASSEL__SMCLK + ID__8 + MC_2 + TACLR + TAIE;
    TA0CCTL1 = CM_1 + SCS +CAP + CCIE + CCIS_0;
}
void Hc_sr_Open(void)           //生成一个持续10us的高电平
{
    Trig1(1);//这里就是把P1.2置1,即P1OUT |= BIT2
    __delay_cycles(250);//这里我把系统时钟升为25MHZ,因此250/25000000=10us
    Trig1(0);置0
}

   我们选用的是P1.2, 根据端口定义,使用的是TA0CCR1,捕获输入引脚通过TA0CCTL1寄存器控制,捕获值存储在TA0CCR1中。
  TASSEL(时钟源选择):SMCLK; ID分频(下面介绍):(这里分频系数会影响后面计算)4MHz/8 = 500k;计数模式:0  ==> 0xFFFF;  定时器清零位 ;中断使能。
  TA0CCTL1:上升沿捕获 ;同步捕捉;捕获模式;中断使能;CCI1A输入。

(这里查了一下SCS和CAP都有两种模式,但是这里直接就是把寄存器代码搞上去,没有分出0和1两种模式,这里搞不太懂,哪位大佬解惑解惑?)

这里ID分频有两种写法,但是总共有四种分频:
msp430超声波测距代码,MSP430F5529,单片机,msp,经验分享,其他,c语言

 MC的四种模式:停止、增加模式、连续上升、增减模式msp430超声波测距代码,MSP430F5529,单片机,msp,经验分享,其他,c语言

 CM的四种模式:不捕获、上升沿捕获、下降沿捕获、上升下降都捕获 msp430超声波测距代码,MSP430F5529,单片机,msp,经验分享,其他,c语言

原理:这里其实就是复用P1.2口为捕获,通过P1.3发出一个10us的高电平给超声波TRIG口触发进行测距,模块内部就返回一个信号,P1.2就捕获一个返回的高电平持续时间,再计算得出距离

公式:s=高电平持续时间*声速340/2(因为上面分频采用了8分频,因此我下面计算就不用除以2

定时中断函数:

#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{

    switch(__even_in_range(TA0IV,14))//采用这个range函数就是为了使switch函数效率高
    {
      case  0:break;                                 // No interrupt
      case  2:
          state =  TA0CCTL1 >> 14;
          TA0CCTL1 &= ~CCIFG;//标志位清零
          if( TA0CCTL1 & CM_1){//开始捕获高电平时间
              cap_new = TA0CCR1;
              TA0CCTL1 &= ~CM_1;
              TA0CCTL1 |=  CM_2;
          }else if ( TA0CCTL1 & CM_2){
              cap_old = TA0CCR1;
              cap_data = ( cap_old - cap_new ) * 0.34/10/6.25;//这里外面解释!
              Gui_DrawFont_Num32(10,50,BLUE,GRAY0,cap_data/100);//显示数字
              Gui_DrawFont_Num32(37,50,BLUE,GRAY0,cap_data/10%10);
              Gui_DrawFont_Num32(64,50,BLUE,GRAY0,cap_data%10);
        

              TA0CCTL1 &= ~CM_2;
              TA0CCTL1 |=  CM_1;
          }else
          break;                           // CCR1 not used
      case  4: break;                          // CCR2 not used
      case  6: break;                          // reserved
      case  8: break;                          // reserved
      case 10: break;                          // reserved
      case 12: break;                          // reserved
      case 14:
          TA0CTL &= ~TAIFG;
          if(cap_old   < cap_new ){
              cap_N += 1;
          }
          break;                          // overflow
      default: break;
    }
}

这里其实都挺好理解的,就是大家可能对那个cap_data计算不太理解,首先为什么不除以2,是因为上面分频系数为8,(如果改为4,那么就应该除以2了),具体我也是测试出来的,至于为啥我觉得可能是分频系数为4时分频后频率为1MHZ,这样分频速率是最为正确的,但是8分频后为500KHZ就影响了原有的,相当于除以2了,哪位大佬可以帮忙解答哈哈,MSP430F5529我研究不是很长哈哈。然后后面除以10是因为计算的结果是MM为单位,我这里是以CM为单位,因此除以10;除以6.25是因为我升的时钟频率为25MHZ,跟原先的定时器4MHZ不对应,因此要换算即25/4=6.25,因此除以6.25。

最后面主函数:

int main(void) {


    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    upVcc();//升压
    timerup();//时钟频率升为25MHZ
    Lcd_Init();
    LCD_LED_SET;//通过IO控制背光亮
    Lcd_Clear(WHITE); //清屏
    Hc_sr_Init();
    __bis_SR_register(GIE);//开启中断
    Gui_DrawFont_GBK16(10,0,BLUE,GRAY0,"电子2班");
    Gui_DrawFont_GBK16(10,20,BLUE,GRAY0,"Dis:");
    Gui_DrawFont_GBK24(100,60,BLUE,GRAY0,"CM");
    while(1){

        Hc_sr_Open();

        __delay_cycles(1000000);
    }
}

对了,漏了一些声明

#define Trig1(a)  if(a==1) P1OUT |= BIT3; else P1OUT &= ~BIT3

unsigned int cap_new = 0;           // 首次捕捉的ta0r值
unsigned int cap_old = 0;           // 第二次捕捉的ta0r值

char cap_N = 0;                     // 溢出次数
char state = 0x00;                  // 状态
u16 cap_data ;                  // 距离值,u16

三、总结

到这里你可能对超声波测距有一个概念了,但是不够,一定要亲自上手实验,多琢磨,不要贪图省事,这样对你没有好处。

其实这里无非就是对定时器的应用,然后一些测量结果可能会出现误差,这是无法避免的,但是大体上影响不大,如果你不追求高精度测距和长距离测距的话,那么超声波测距是很好的选择!

这里我也是才学习这款单片机不久,有哪里写的不好的请见谅,有错误可以随时指正,欢迎大家踊跃评论,一起探讨交流,一起进步,谢谢!

题外话

挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”

学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈文章来源地址https://www.toymoban.com/news/detail-620042.html

到了这里,关于电赛MSP430F5529之超声波测距+OLED 显示(含主要代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MSP430F5529——中断理解

    认识低功耗模式; MSP430的中断,需要两个部分,一部分是打开中断,另外一部分是编写中断服务函数 首先我们得知道__bis_SR_register和_BIS_SR是一个玩意。查看宏定义可知  _BIS_SR()可传入的参数 然后我们查看x的值,发现里面有八个可以传入的值 我们这里只需要关系GIE就可以

    2024年02月16日
    浏览(53)
  • 05:OLED模块【MSP430F5529】

    目录 实物图 字模取字         字模软件         取模步骤         1.设置软件         2.取模         3.输出数据  代码 type.h oledfont.h oled.h oled.c main.c 下面图片中,可以看到OLED模块的四个接口:GND,VCC,SCL,SDA GND VCC SCL SDA 接地 接电源3.3V/5V 接P3.5 接P3.6       

    2024年02月16日
    浏览(46)
  • MSP430F5529库函数学习——串口

    波特率计算网站;导入MSP430Ware,查看例程;原理图和中文开发手册获取 目录 GPIO_setAsPeripheralModuleFunctionInputPin()和GPIO_setAsPeripheralModuleFunctionOutputPin 函数声明  作用 参数 selectedPort selectedPins 使用 USCI_A_UART_init() 函数声明  作用 参数 baseAddress param  USCI_A_UART_enable() 函数

    2024年02月16日
    浏览(67)
  • msp430f5529学习笔记(2)时钟系统

    写在前~本章将会详细的讲解msp430f5529单片机的时钟系统及其使用方法。如有不妥的地方欢迎各位大佬斧正!!! 目录 什么是时钟系统和时钟源 MSP430f5529时钟源和时钟系统介绍 产生时钟信号的时钟源: 时钟配置        在单片机中,单片机每开始一个周期的工作就需要一个节

    2024年02月17日
    浏览(45)
  • MSP430F5529库函数GPIO学习

    导入MSP430Ware,查看例程;数据手册以及原理图获取 建议不是很了解寄存器的看完我的MSP430F5529学习笔记  目录 GPIO_setAsOutputPin() 函数声明 作用 参数 selectedPort selectedPins 修改的寄存器 使用 与GPIO_setAsOutputPin()参数一致的函数  GPIO_setOutputHighOnPin() GPIO_setOutputLowOnPin()

    2024年02月15日
    浏览(66)
  • MSP430F5529学习笔记(6)——导入MSP430Ware,查看例程

    MSP430WARE下载; 目录 在线版本 下载MSP430Ware 查看例程 导入例程  离线版本 下载MSP430Ware  查看例程 导入例程 MSP430Ware里面有很多例程和库函数使用手册,我们可以查看学习。非常重要 (1) 打开CCS——view——Resource Explorer  之后我们会进入如下界面 (2)  点击MSP430——Embe

    2024年02月13日
    浏览(54)
  • MSP430F5529学习笔记(五)——串口|UART

            我们在使用MSP430的时候大家会发现插上usb线后电脑上有两个端口标识,那么在进行串口通信时选择哪个呢。其实如图所示,上面的端口是用来进行串口通信的,下面的则是用来进行程序的下载,大家在使用的时候多加分辨即可。          当然熟悉单片机操作的

    2024年02月16日
    浏览(46)
  • 06:PWM与电机驱动【MSP430F5529】

    电机型号: 工作方式: 原理图以及接线: 根据官方例程,主要代码为drive.c drive.h main.c (后面好像使用的时候会有什么冲突导致1或者2通道无法正常运行,不太记得了,可以到实物上实验一下子) 下面是智能送药小车使用PWM驱动电机相关代码与注释(在实物中,均能正常运行)

    2024年02月15日
    浏览(49)
  • MSP430F5529单片机入门学习笔记1

    本笔记整理自B站教程 MSP430F5529单片机学习视频汇总 右边部分写错了,看的时候注意 注意#include“driverlib.h”头文件时要注意: 添加MSP430F5xx_6xx文件夹到当前工程下 MSP430F5xx_6xx文件夹是在导入的msp430ware_3_80_13_03包中找 把上述MSP430F5xx_6xx文件夹的路径包含进来 有三个系统时钟可

    2024年02月06日
    浏览(47)
  • MSP430F5529库函数定时器A——捕获实验

    需提前学习:MSP430F5529库函数学习——串口;MSP430F5529库函数定时器A——硬件PWM 目录 引脚手册获取 实验目的 代码 代码解析 串口数据发送部分 数据捕获部分 定时器部分可选参数 设置定时器部分 捕获部分可选参数 设置捕获引脚部分 中断处理 TA2IV_TACCR2解析 TA2IV_TAIFG解析 主函

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包