1. 接线
    VCC-5V; GDN-GND;
    TRIG-PB6; ECOH-PB9
    也可自行选择不冲突引脚
    引脚选择

     2. 代码部分

         csb.c //.c文件

#include "delay.h"
#include "csb.h"
uint overcount=0;

void CH_SR04_Init(void)
{ //引脚初始化  
	GPIO_InitTypeDef GPIO_InitStructer;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
	NVIC_InitTypeDef NVIC_InitStructer;
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	/*TRIG触发*/
	GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;//PB6
	GPIO_InitStructer.GPIO_Pin=GPIO_Pin_6;             
	GPIO_Init(GPIOB, &GPIO_InitStructer);
	/*ECOH回响*/
	GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;             //    PB9
	GPIO_Init(GPIOB, & GPIO_InitStructer);
	/*TIM2初始化*/
	TIM_DeInit(TIM2);
	TIM_TimeBaseInitStructer.TIM_Period=999;//定时周期为1000
	TIM_TimeBaseInitStructer.TIM_Prescaler=71; //分频系数72
	TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
	TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);
	//TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );//开启更新中断
	//设置中断优先级
	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);
	TIM_Cmd(TIM2, DISABLE);//关闭定时器使能
}
float Senor_distance(void)				//返回距离值
{
	float length=0,sum=0;
	u16 tim;
	uint i=0;
	
	while(i!=5)//测试五次算一次平均值
	{
		PBout(6)=1; //拉高信号,作为触发信号
		delay_us(20); //高电平信号超过10us
		PBout(6)=0;
		//等待信号回响
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
		TIM_Cmd(TIM2,ENABLE);//检测到,回响信号,开启TIM2计数
  	i+=1;//5次计算
  	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//回响信号消失了
  	TIM_Cmd(TIM2,DISABLE);//关闭定时器
  	tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间
	  length=(tim+overcount*1000)/58.0;
  	//length=(tim+overcount*1000)*0.0001*340/2;计算公式
  	sum=length+sum;
	  TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
	  overcount=0; //中断溢出次数清零
	}
	length=sum/5;
	return length;//距离作为函数返回值
}
 //当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
void TIM2_IRQHandler(void) 
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
	{
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
		overcount++;
  }
}

 csb.h

#ifndef _UW_H
#define _UW_H

#include "sys.h"

#define uint unsigned int
#define TRIG_Send  PBout(6)
#define ECHO_Reci  PBin(9)

void CH_SR04_Init(void);
float Senor_distance(void);


#endif

 main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "csb.h"

#include "beep.h"

float distance;
u8 i=20;
u8 j=0;
int main()
{
	float distance;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	CH_SR04_Init();
	uart_init(115200);
	delay_init();
	BEEP_Init();
	while(1)
	{
    printf("距离为:%f\n",Senor_distance());
	}
}

其他库文件使用正点原子库。所以可以直接用printf函数输出串口

在这里插入图片描述