基于STM32倒车雷达系统

本例程基于STM32F103C8T6最小核心板实现例程;

所用的模块有:HC-SR04超声波模块、蜂鸣器模块(注意蜂鸣器是有源蜂鸣器还是无源蜂鸣器)、0.96寸OLED显示屏(IIC协议)、两个按键;

网盘分享:
链接: https://pan.baidu.com/s/14gtosC5O8F-54T_N5Qj_sg?pwd=1ywq 提取码: 1ywq

成品如图所示;我们可以给定报警的阈值,一个按键用于增加一个用于减少;有条件的可以可以增加几个用于警示的LED;

屏幕的第一行显示的当前的测算的距离,第二行则是自己可以通过按键来调节的给定距离;当距离小于给定阈值的话,屏幕上会发出警告“Warning!!”并且蜂鸣器发出声响。下图是发出警报:

 我们来看一下超声波模块的时序图

时序最开始Trigger先拉高电平,开始时序您只需向触发输入提供一个短的 10uS 脉冲即可开始测距。SRF04 将发出 40khz 的 8 周期超声波脉冲,并将其回声线升高。然后,它会侦听回声,一旦检测到回声,它就会再次降低回声线。因此,回波线是一个脉冲,其宽度与到物体的距离成正比。通过对脉冲进行计时,可以计算以英寸/厘米或其他任何方式为单位的范围。如果未检测到任何内容,则 SRF04 将在大约 36 毫秒后降低其回声线。具体的计算,我们看代码,下面是超声波模块的代码:

#include "stm32f10x.h"                  // Device header
#include "Timer.h"
#include "Delay.h"
#include "OLED.h"


uint32_t Distance=0;
uint32_t B_now=0;

void HC_SR04_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//复用时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//TRIG
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;//ECHO
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
	
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置外部中断的模式为中断模式。这意味着当相应的触发条件满足时,
													   //会触发一个中断请求,而不是事件模式(在事件模式下,只会产生一个事件信号,而不会触发中断)
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//边沿触发
	EXTI_Init(&EXTI_InitStructure);
	EXTI_ClearITPendingBit(EXTI_Line14);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//中断优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
}

void HC_SR04_Compute(void)
{
	uint32_t Average_Distance = 0;
	for (uint8_t i =0;i < 8;i ++)
	{
		/**********时序*************/
		GPIO_SetBits(GPIOB, GPIO_Pin_13);//启动信号
		Delay_us(20);
		GPIO_ResetBits(GPIOB, GPIO_Pin_13);
		Delay_us(60);
		Average_Distance = Average_Distance + Distance;
	}
	Average_Distance = Average_Distance/8;//8次平均值,数据更稳定
	B_now = Average_Distance;
	OLED_ShowNum(1, 5, Average_Distance, 4);//OLED显示
}

void EXTI15_10_IRQHandler(void)
{
	if (EXTI_GetITStatus(EXTI_Line14) == SET)
	{
		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 1)//读取引脚的状态判断是否为上升沿
		{
			num = 0;
			TIM_SetCounter(TIM2, 0);//定时器计数清0
			TIM_Cmd(TIM2, ENABLE);//启动定时器
		}
		else if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)//判断是否为下降沿
		{
			TIM_Cmd(TIM2, DISABLE);//关闭定时器
			Distance = (num * 1000 + TIM_GetCounter(TIM2)) * 0.34/2;//计算距离
		}
		EXTI_ClearITPendingBit(EXTI_Line14);//清除标志位
	}
}

 最后,按键加减的功能,我们通过在主函数来实现;

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Timer.h"
#include "Key.h"
#include "OLED.h"
#include "Buzzer.h"
#include "HC-SR04.h"

uint16_t flag=30,KeyNum;

int main(void)
{
	Timer_Init();
	Key_Init();
	OLED_Init();
	Buzzer_Init();
	HC_SR04_Init();

	while(1)
	{
		OLED_ShowString(1, 1, "Now:");
		OLED_ShowString(1, 9, "mm");
		OLED_ShowString(2, 1, "Set:");
		OLED_ShowString(2, 9, "mm");
	    OLED_ShowNum(2, 5,flag,4);
		KeyNum = Key_GetNum();
		if (KeyNum == 1)//调节阈值
		{
			Delay_us(200);
			if (KeyNum == 1)
			{
				flag++;
			}
		}

		if (KeyNum == 2)
		{
			Delay_us(200);
			if (KeyNum == 2)
			{
				flag--;
			}
		}
		
		HC_SR04_Compute();
		
		if (B_now <= flag)//判断是否报警
		{
			Buzzer_ON();
			OLED_ShowString(3, 1, "   Warning!!!   ");
			Delay_ms(100);
			OLED_Clear();
		}
		else
		{
			Buzzer_OFF();
		}
	}
	
}

最后,感谢你能看到这里,如果有不对的地方欢迎指正,感谢你的观看!

网盘分享:
链接: https://pan.baidu.com/s/14gtosC5O8F-54T_N5Qj_sg?pwd=1ywq 提取码: 1ywq 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值