STM32基础——超声波测距+OLED显示+蜂鸣器报警

此代码的格式可以直接烧录到STM32F103C8T6最小系统中,烧录在其它芯片需要自己进行代码移植,功能是使用超声波模块进行测距,距离会显示在OLED屏幕上,并且当测量到的数据小于设定的范围是,蜂鸣器报警,可以适用在智能小车的倒车提示功能上。因为三个模块的代码过多,只展示一部分,完整代码链接:链接:https://pan.baidu.com/s/1C_6wRmxlSd5LQObKm4QKCQ
提取码:3a2k
在这里插入图片描述
在这里插入图片描述
超声波测距模块代码:
.c文件

#include "stm32f10x.h"                  // Device header

#include "HCSR04.h"
#include "delay.h"

int N=0;
float distance=0;
void My_CSB_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//GPIO初始化,定时器初始化,初始化外部中断

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PB端口时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	//PB10-Trig(输入)所以PB6是输出模式 PB11-Echo(输出)
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//Trig
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(GPIOB, &GPIO_InitStructure);	

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//Echo
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 //下拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	//溢出时间tim=(arr+1)*(psc+1)/72000000	50000*72/72000000=500ms
	
	TIM_TimeBaseStructure.TIM_Period = 49999;
	TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 

	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断	
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级2级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure); 

	TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
	{
		N += 1;		   
	}
	TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
}
	int count=0;
float Distance(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_10);//预先拉低Trig引脚
	GPIO_SetBits(GPIOB, GPIO_Pin_10);
	delay_us(20);
	GPIO_ResetBits(GPIOB, GPIO_Pin_10);//发出10us的脉冲
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);	//等待信号发出,信号发出,计数器置0,信号发出,变为高电平,引脚置1
//N=0;
	TIM2->CNT=0;//us级别读取
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 1); //等待信号接受,信号发出过程中,引脚一直置位1 
	count=TIM2->CNT;
//单位cm
//v = 340m/s = 34000cm/s = 34000cm/10^6us = 0.034cm/us
//s = vt/2 = t*0.034/2 = t*0.017 ≈ t/58	
	distance=(float)count/58.5;					
	return distance;
}

.h文件

#ifndef __HCSR04_H
#define __HCSR04_H	 
#include "sys.h"

void My_CSB_Init(void);//初始化
float Distance(void);//距离
	    
#endif

  • 18
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
STM32F10C8是一款具有强大功能的ARM Cortex-M3内核的微控制器,集成了丰富的外设和多个通信接口。而nRF24L01是一款低功耗、低成本的2.4GHz无线收发模块,可以支持SPI接口进行通信。超声波测距是一种常见的测量物体距离的方法,通过发射超声波并接收回波来计算物体与传感器的距离。而OLED显示则是一种高对比度、大视角和快响应速度的显示技术。 结合上述组件,我们可以通过以下步骤实现STM32F10C8和nRF24L01的通信来进行超声波测距,最后将测量结果显示OLED屏幕上: 1. 首先,将STM32F10C8和nRF24L01通过SPI接口进行连接,并将nRF24L01配置为接收模式。 2. 在STM32F10C8上编写代码,使用超声波传感器测量物体与传感器之间的距离。这可以通过发送超声波信号并接收回波的时间来实现。 3. 使用STM32F10C8的SPI接口,将测量结果通过nRF24L01发送到接收机。 4. 在另一个STM32F10C8上将接收机连接到nRF24L01,并将其配置为发送模式。 5. 在接收机一侧编写代码,接收来自发送机的测量结果,并将数据解析为距离值。 6. 使用STM32F10C8的SPI接口将距离值发送到OLED屏幕。 7. 在OLED屏幕上显示最终的测量结果。 通过以上步骤,我们可以实现将超声波测距的结果通过nRF24L01模块传输到另一个STM32F10C8,并将其显示OLED屏幕上。这样的系统可以广泛应用于距离测量、智能家居等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值