STM32F103 超声波 串口输出数据

    本人小白一个,正在利用课外时间学习32,不久前刚做过超声波实验,但是,几天没碰,感觉忘记了很多。在重新学习的路上,我觉得有必要总结一下,防止自己忘记,同时,也希望能帮助到有需要的人。

话不多说,先上硬货。

#include "cj.h"
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"

unsigned int overcount=0;


void NVIC_Config(void)//优先级设置
{
NVIC_InitTypeDef NVIC_InitStructer;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;//
NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructer);
}

void CH_SR04_Init(void)//超声波模块初始化
{
GPIO_InitTypeDef GPIO_InitStructer;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructer);//设置PB8作为触发引脚


GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO_InitStructer);//设置PB9作为接受引脚

TIM_DeInit(TIM2);
TIM_TimeBaseInitStructer.TIM_Period=65534;
TIM_TimeBaseInitStructer.TIM_Prescaler=71; //经过预分频后,计数器的值,每隔0.5us就加一。
TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//
TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);

    //TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//
NVIC_Config();
TIM_Cmd(TIM2,DISABLE);//

}


 

float Senor_Using(void)//测距函数
{
float length=0,sum=0;
u16 tim;
unsigned int i=0;

while(i!=5)
{

PBout(8)=1; //
delay_us(20); //
PBout(8)=0;

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
TIM_Cmd(TIM2,ENABLE);//
i+=1;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//
TIM_Cmd(TIM2,DISABLE);//

tim=TIM_GetCounter(TIM2);//

length=(tim+overcount*1000)/58.0;//

sum=length+sum;
TIM2->CNT=0; //
overcount=0; //
delay_ms(100);
}
length=sum/5;
return length;//
}

void TIM2_IRQHandler(void) //
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  {
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//
overcount++;

  }
}
 

由于是复制粘贴过来的,所以只是对部分地方进行了注释。其实很简单,就是通过一个引脚输出超过10us高电平作为脉冲信号,在设置一个引脚作为接收引脚。当接收到高电平,就开启定时器计数,当检测到低电平,就停止计数。将数值取出来,通过公式计算即可得到距离。最后是这个串口输出,直接#include "stdio.h"后直接用pirntf即可。但是不要忘了在此之前还要对编译器相关配置,这里请自行百度,很简单的。如有不对之处,还请各位大佬多多指正,小生在此先谢过了。

我曾许下十年,只为最美的遇见。

我是西伯利亚螂,打不死,冻不坏的小强。

猜你喜欢

转载自blog.csdn.net/qq_41821562/article/details/82831805