×
单片机 > 单片机程序设计 > 详情

STM32F103 超声波 串口输出数据

发布时间:2020-05-28 发布时间:
|

#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即可。但是不要忘了在此之前还要对编译器相关配置,这里请自行百度,很简单的。

关键字:STM32F103  超声波  串口输出数据

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式