模块详细信息就不贴了
整体流程就是初始化IO口和定时器
然后等待响应然后开启定时器使能,统计定时器的时间,然后计算距离
#include "sr04.h"
#include "delay.h"
#include "usart.h"
u32 Count_update,Distance1;
//超声波模块Trig、Echo初始化
void Ultras_GPIO_Init(void)
{
//设置Trig引脚GPIO的输出模式为推挽输出
//设置Echo引脚GPIO的输入模式为浮空输入
//并打开相应GPIO的时钟
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure TRIG Button */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_TRIG_Pin; //配置TRIG的引脚是PB1
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_TRIG_PORT, &GPIO_InitStructure); //端口 B
/* Configure ECHO Button */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //模式设置成浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_ECHO_Pin; //PB0
GPIO_Init(GPIO_ECHO_PORT, &GPIO_InitStructure);
}
//定时器TIM3初始化
void Ultras_TIM3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* 开启定时器3的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//定时时间 1us 计数一次
//这个就是自动装载的计数值,计数器的值从零开始
TIM_TimeBaseStructure.TIM_Period = 65535; //计数值记一次 1us
// 这个就是预分频系数,当由于为0时表示不分频所以要减1
TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);
// 使用的采样频率之间的分频比例
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//向上计数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//初始化定时器3
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3, TIM_FLAG_Update); /* 清除溢出中断标志 */
// TIM_Cmd(TIM3, ENABLE); //计数器使能,开始工作 先关闭时钟 等待使用
}
//超声波模块初始化
void Ultrasonic_Init(void)
{
Ultras_GPIO_Init();
Ultras_TIM3_Init();
}
void GetDistance(void)//根据定时器的值计算距离
{
u8 i;
u32 UltrasonicWave_Distance,s_Distance=0;
//这里取六次的数据的平均值
for(i=0;i<6;i++)
{
GPIO_SetBits(GPIO_TRIG_PORT,GPIO_TRIG_Pin); //送>10US的高电平
delay_us(15); //延迟15us
GPIO_ResetBits(GPIO_TRIG_PORT,GPIO_TRIG_Pin);
while(GPIO_ReadInputDataBit(GPIO_ECHO_PORT,GPIO_ECHO_Pin) ==RESET); //等待高电平
TIM_Cmd(TIM3, ENABLE); //开启时钟
while(GPIO_ReadInputDataBit(GPIO_ECHO_PORT,GPIO_ECHO_Pin) !=RESET); //等待低电平
TIM_Cmd(TIM3, DISABLE); //定时器3关闭使能
UltrasonicWave_Distance=TIM_GetCounter(TIM3)*170/10000; //计算距离
TIM_SetCounter(TIM3,0);//清空TIM3的值
s_Distance+=UltrasonicWave_Distance;
}
s_Distance=s_Distance/6;
printf("Distance:%d cm\r\n",s_Distance);
delay_ms(200);
}
#ifndef __SR04_H
#define __SR04_H
#include "sys.h"
#include "stm32f10x.h"
#define GPIO_TRIG_PORT GPIOB
#define GPIO_ECHO_PORT GPIOB
#define GPIO_TRIG_Pin GPIO_Pin_1
#define GPIO_ECHO_Pin GPIO_Pin_0
void Ultrasonic_Init(void);
void GetDistance(void);
void Ultras_GPIO_Init(void);
void Ultras_TIM3_Init(void);
void TIM3_IRQHandler(void);
u32 calculer(u32 count);
void Display(u32 Distance);
#endif
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "oled.h"
#include "timer.h"
#include "sr04.h"
int main(void)
{
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化为115200
LED_Init(); //初始化与LED连接的硬件接口
OLED_Init();
OLED_ShowString(0,0,"Welcome To STM32",16);
Ultrasonic_Init();
printf("I'm ok!\r\n");
//TIM3_Int_Init(1999,7199);//Tout= (arr+1)(psc+1)/TCLK;
//TIM3_PWM_Init(1999,719);//PWM周期为20ms = (7200*200)/72000000
while(1)
{
GetDistance();
}
}
串口显示如下