基于Stm32的超声波测距、OLED显示、BEEP蜂鸣报警

1.目标/目的

本人做移动机器人,超声波亦或者是红外测距报警都是肯定的,一个小实验,目的是超声测距,OLED显示前方障碍的距离,距离过小时,蜂鸣器报警,且距离越小报警蜂鸣频率越快。

2.硬件

(1)stm32f1

(2)超声波HC-SRO4

(3)OLED12864

(4)BEEP

3.硬件参数

(1)单片机stm32f1


(2)超声波模块HC-SRO4


1:使用电压:DC5V         

2:静态电流:小于2mA
3:电平输出:高5V           

4:电平输出:底0V
5:感应角度:不大于15  

6:探测距离:2cm-450cm      

7:高精度:可达0.3cm

 板上接线方式,VCC---+5Vtrig(控制端)--PA8、  echo(接收端)--PA7、out(空脚)、GND--地

  注: TRIP引脚是内部上拉10K的电阻,用单片机的IO口拉低TRIP引脚,然后给一个10us以上的脉冲信号。

 OUT脚为此模块作为防盗模块时的开关量输出脚,测距模块不用此脚! 


    采用IO口TRIG触发测距,给最少10us的高电平信号。模块自动发送8个40khz的方波,自动检测是否有信号返回;有信号返回,通过IO口ECHO输出一个高电平,同时开定时器计时,当此口变为低电平时就可以读定时器的值,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;us/58=厘米或者us/148=英寸;(us为回响高电平信号持续时间)建议测量周期为 60ms以上,以防止发射信号对回响信号的影响。

(3)OLED12864


如图用的IIC通信。SCL---PB6,SCL---PB7

(4)BEEP(无源)

    无源蜂鸣器意思是需要加音频驱动信号才能使其发出声音,与有源蜂鸣器相对应。有源蜂鸣器只需要通上直流电即会发出蜂鸣声,有源蜂鸣器内部自带振荡器!


+接PA11,-接GND,定时器PWM脉冲驱动。

4.程序

附程序


  • 25
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
好的,对于您的问题,您可以按照以下步骤进行操作: 1. 硬件连接:将超声波模块连接到STM32的GPIO引脚上。其中,一个引脚连接到STM32的Trigger引脚,另一个引脚连接到STM32的Echo引脚。此外,还需要连接一个蜂鸣器或LED灯,用于发出报警信号。 2. 编写程序:首先需要初始化STM32的GPIO引脚,然后设置超声波模块的Trigger引脚为输出模式,Echo引脚为输入模式。接着,循环发送超声波信号,在接收到回波信号后,根据时间计算出距离,如果距离小于一定值,则发出报警信号。具体的程序可以参考以下代码: ``` #include "stm32f10x.h" #define TRIG_PIN GPIO_Pin_0 #define ECHO_PIN GPIO_Pin_1 #define BEEP_PIN GPIO_Pin_2 void delay_us(int us) { TIM2->ARR = us; TIM2->EGR |= TIM_EGR_UG; TIM2->SR &= ~TIM_SR_UIF; TIM2->CR1 |= TIM_CR1_CEN; while(!(TIM2->SR & TIM_SR_UIF)); } void init_gpio() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = TRIG_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ECHO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = BEEP_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } int main(void) { int distance; int i; init_gpio(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM2->PSC = 71; TIM2->CR1 &= ~TIM_CR1_CEN; while(1) { GPIO_WriteBit(GPIOA, TRIG_PIN, 0); delay_us(2); GPIO_WriteBit(GPIOA, TRIG_PIN, 1); delay_us(10); GPIO_WriteBit(GPIOA, TRIG_PIN, 0); i = 0; while(GPIO_ReadInputDataBit(GPIOA, ECHO_PIN) == 0 && i < 20000) { i++; delay_us(1); } if(i >= 20000) { distance = -1; } else { TIM2->CNT = 0; TIM2->CR1 |= TIM_CR1_CEN; i = 0; while(GPIO_ReadInputDataBit(GPIOA, ECHO_PIN) == 1 && i < 20000) { i++; delay_us(1); } if(i >= 20000) { distance = -1; } else { TIM2->CR1 &= ~TIM_CR1_CEN; distance = TIM2->CNT / 58; } } if(distance > 0 && distance < 20) { GPIO_WriteBit(GPIOA, BEEP_PIN, 1); delay_us(500000); GPIO_WriteBit(GPIOA, BEEP_PIN, 0); delay_us(500000); } else { GPIO_WriteBit(GPIOA, BEEP_PIN, 0); } } } ``` 3. 编译烧录:将以上程序编译生成hex文件,然后使用烧录器烧录到STM32中。烧录完成后,将超声波模块和蜂鸣器/LED灯连接到相应的引脚上即可。 注意:以上代码仅供参考,具体实现可能需要根据您的硬件和需求进行修改。同时,超声波模块和蜂鸣器/LED灯的具体连接方式也需要根据硬件进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值