十,stm32超声波串口打印距离

相关知识:

源代码:
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);
效果展示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值