2024-09-01
售卖作品
00

目录

功能
接线方式
实物效果
原理
倒车雷达代码
帮助、问询

为了便于开发,我做了一块扩展板子:

https://blog.csdn.net/x1131230123/article/details/108772807

扩展板有一些常用器件,这样开发MSP430 F5529程序的时候,就不用杜邦线连接了。当然也可以选择杜邦线连接器件,效果都一样。

超声波模块的读取:

https://blog.csdn.net/x1131230123/article/details/107528311

功能

何为倒车雷达?

车辆倒车时候的一个警报系统,比如车辆距离墙壁的距离200mm以下时候,蜂鸣器就开始响。

并且距离越小,蜂鸣器的声音越是急促(2次声音间隔短就是急促)。

功能1、oled显示超声波测距距离

功能2、距离越小,蜂鸣器的声音越是急促

接线方式

c
//OLED----MSP430 //VCC-----3.3V //GND-----GND //SCL------P3.1 //SDA------P3.0 //蜂鸣器----MSP430 //VCC-----3.3V //GND-----GND //DAT------P2.4 //超声波----MSP430 //VCC-----3.3V //GND-----GND //TRIG------P1.3 //ECHO------P1.2

实物效果

在这里插入图片描述

在这里插入图片描述

原理

https://qq742971636.blog.csdn.net/article/details/107528311

倒车雷达代码

这段代码是一个使用超声波模块进行测距的程序。下面是对代码的解释:

首先,包含了一些所需的头文件和库。

#include "OLED.h": 这是一个显示屏的头文件,用于控制OLED显示屏。

#include <msp430.h>: 这是MSP430单片机的头文件。

接下来,定义了一些变量和标志位:

unsigned int END_Date, STA_Date: 超声波模块的开始时间和结束时间,用于计算超声波的传播时间。

unsigned char over_flag: 溢出标志位,用于判断是否发生了溢出。

unsigned int cap_fail_count: 失败计数,用于超声波捕获失败的计数。

float distance: 最终测得的距离值,单位为毫米。

定义了一些定时器相关的变量:

unsigned int timer1time: 定时器的计数器。

unsigned int mingjiao_time: 触发蜂鸣器鸣叫的时间间隔,根据测得的距离决定。

unsigned int open: 打开标志位,用于控制蜂鸣器的开关。

定义了一些宏和函数:

BEEPOPEN: 使能蜂鸣器,配置相关的IO口和定时器。

BEEPCLOSE: 关闭蜂鸣器,停止定时器并设置IO口。

主函数main():

对MSP430单片机进行初始化配置。

配置定时器和IO口。

OLED显示屏初始化。

进入主循环,循环执行以下步骤:

激发超声波,发送触发信号,并开始计时。

等待超声波捕获完成,并计算时间差,根据时间差计算距离。

将测得的距离值显示在OLED屏上。

根据距离值判断是否需要触发蜂鸣器,并控制蜂鸣器的开关。

定时器中断函数TIMER0_A1():

当定时器0的捕获中断发生时,根据电平变化判断是开始时间还是结束时间,并记录下对应的时间值。

定时器中断函数TIMER1_A0_ISR():

当定时器1的中断发生时,根据计数器的值判断是否需要触发蜂鸣器,并控制蜂鸣器的开关。

总体来说,这段代码实现了超声波模块的测距功能,并根据测得的距离控制蜂鸣器的开关,并将测得的距离值显示在OLED屏上。

部分代码:

c
_EINT(); while (1) { /* 激发超声波 */ over_flag = 0; cap_fail_count = 0; //开捕获 P1OUT |= BIT3; delay_us(20); /* 高电平延时20us */ P1OUT &= ~BIT3; while (over_flag == 0) { delay_us(100); cap_fail_count++; if (cap_fail_count > 10000) { break; } } TA0CCTL1 = 0; /* 关闭补货 */ /* 得到时间 */ if (END_Date > STA_Date) distance = END_Date - STA_Date; else distance = 65535 + END_Date - STA_Date; distance = distance * 340 / 2 / 1000; /* 计算距离 */ if ((int) distance > 1000) /* 大于1m不算数 */ { continue; } //显示 count = 0; dis[count++] = (int) distance % 10000 / 1000 + '0'; dis[count++] = (int) distance % 1000 / 100 + '0'; dis[count++] = (int) distance % 100 / 10 + '0'; dis[count++] = (int) distance % 10 + '0'; dis[count++] = 'm'; dis[count++] = 'm'; dis[count++] = 0; OLED_ShowString(0, 2, dis); if (distance < 200) { mingjiao_time = distance / 10; //距离越大 mingjiao_time越大 声音间隔就大 不急促 open = 1; //打开标志 定时器会判断 } else { open = 0; //关闭标志 蜂鸣器关闭 BEEPCLOSE; } delay_ms(200); } } #pragma vector=TIMER0_A1_VECTOR __interrupt void TIMER0_A1() { switch (__even_in_range(TA0IV, 4)) { case 0x00: break; case 0x02: /* 通道1捕获中断 */ //捕获能力 break; default: break; } TA0CCTL1 &= ~CCIFG; } // Timer1 A0 interrupt service routine #pragma vector=TIMER1_A0_VECTOR __interrupt void TIMER1_A0_ISR(void) { if (open) { if (timer1time > mingjiao_time) { timer1time = 0; BEEPOPEN; P1OUT |= BIT0; delay_ms(20); P1OUT &= ~BIT0; BEEPCLOSE; } else { timer1time++; } } }

完整代码:https://github.com/xddun/blog_code_search

帮助、问询

csharp
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!