欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2024/3/12 编程问答 85 豆豆
生活随笔 收集整理的这篇文章主要介绍了 STM32基础——超声波测距+OLED显示+蜂鸣器报警 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

此代码的格式可以直接烧录到STMF03C8T6最小系统中,烧录在其它芯片需要自己进行代码移植,功能是使用超声波模块进行测距,距离会显示在OLED屏幕上,并且当测量到的数据小于设定的范围是,蜂鸣器报警,可以适用在智能小车的倒车提示功能上。因为三个模块的代码过多,只展示一部分,完整代码私聊拿。


超声波测距模块代码:
.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;//TrigGPIO_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;//EchoGPIO_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=500msTIM_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

总结

以上是生活随笔为你收集整理的STM32基础——超声波测距+OLED显示+蜂鸣器报警的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。