为了便于开发,我做了一块扩展板子:
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
csharphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!