相关知识:
源代码:
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "usart.h"
#include "exti.h"
#include "tim.h"
#include "motor.h"
#include "SysTick.h"
#include "HC_SR04.h"
int main()
{
float Length = 0;
usart_init();
HC_SR04Config();
while(1)
{
Length = Getlength();
printf("%.3f\r\n",Length);
ms_delay(500);
}
}
main.h
#include "stm32f10x.h"
void delay(uint16_t time);
HCSR_04.c
#include "stm32f10x.h"
#include "HC_SR04.h"
#include "SysTick.h"
uint16_t mscount = 0;
void HC_SR04Config(void)
{
GPIO_InitTypeDef GPIO_HR04Init;
TIM_TimeBaseInitTypeDef TIM_hcsr04init;
NVIC_InitTypeDef NVIC_HR04init;
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1);
//开启GPIO时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM4, ENABLE );
//配置GPIO
// Trig pb11
GPIO_HR04Init.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_HR04Init.GPIO_Pin = GPIO_Pin_11;
GPIO_HR04Init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_HR04Init);
// echo pb10接收
GPIO_HR04Init.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入高电平
GPIO_HR04Init.GPIO_Pin = GPIO_Pin_10;
GPIO_HR04Init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_HR04Init);
//配置定时器结构体
TIM_hcsr04init.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
TIM_hcsr04init.TIM_CounterMode = TIM_CounterMode_Up;
TIM_hcsr04init.TIM_Period = 100-1;
TIM_hcsr04init.TIM_Prescaler =72-1;
TIM_ITConfig( TIM4, TIM_IT_Update, ENABLE);
TIM_TimeBaseInit( TIM4, &TIM_hcsr04init);
TIM_Cmd( TIM4,DISABLE);
// 配置中断结构体
NVIC_HR04init.NVIC_IRQChannel = TIM4_IRQn;
NVIC_HR04init.NVIC_IRQChannelCmd = ENABLE;
NVIC_HR04init.NVIC_IRQChannelPreemptionPriority =0;
NVIC_HR04init.NVIC_IRQChannelSubPriority =0;
NVIC_Init(&NVIC_HR04init);
}
//打开定时器
void open_tim4(void)
{
TIM_SetCounter( TIM4, 0);
mscount = 0;
TIM_Cmd( TIM4,ENABLE);
}
//关闭定时器
void close_tim4(void)
{
TIM_Cmd( TIM4,DISABLE);
}
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
mscount++;
}
}
//获取定时器的值
int GetEhco(void)
{
uint32_t t =0;
t=TIM_GetCounter( TIM4);
TIM4->CNT = 0;
ms_delay(50);
return t;
}
//获取超声波测距离
float Getlength(void)
{
int i=0;
uint32_t t=0;
float sum =0;
float length= 0;
while(i != 5)
{
TRIG_Send(1);
us_delay(20);
TRIG_Send(0);
while(ECHO_Reci == 0);
open_tim4();
i=i+1;
while(ECHO_Reci == 0);
close_tim4();
t = GetEhco();
length =((float)t/58.0);
sum = sum+ length;
}
length = sum/5.0;
return length;
}
HCSR_04.h
//#ifndef__HC_SR04_H
//#define__HC_SR04_H
#include "stm32f10x.h"
void HC_SR04Config(void);
void open_tim4(void);
void close_tim4(void);
void TIM4_IRQHandler(void);
int GetEhco(void);
float Getlength(void);
#define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)
#define TRIG_Send(a) if(a) \
GPIO_SetBits(GPIOB,GPIO_Pin_11); \
else \
GPIO_ResetBits(GPIOB,GPIO_Pin_11)
//#endif
SysTick.c
#include "SysTick.h"
#include "stm32f10x.h"
void ms_delay(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);
for(i=0;i<ms;i++)
{
while( !((SysTick->CTRL)&(1<<16)));
}
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
void us_delay(uint32_t us)
{
uint32_t i;
SysTick_Config(72);
for(i=0;i<us;i++)
{
while( !((SysTick->CTRL)&(1<<16)) );
}
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
SysTick.h
#include "stm32f10x.h"
void ms_delay(uint32_t ms);
void us_delay(uint32_t us);