微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 基于STM32写的一个HC-SR04模块程序,用串口显示失败,求指正,谢谢!

基于STM32写的一个HC-SR04模块程序,用串口显示失败,求指正,谢谢!

时间:10-02 整理:3721RD 点击:
.h文件内容:
#ifndef __HC_SR04_H
#define __HC_SR04_H

#define Trig PBout(5)
#define Echo PAin(2)

void GPIO_Config(void);
void TIM_Config(void);
float HC_SR04_Init(void);
void NVIC_Config(void);

#endif

.c文件内容:
#include "stm32f10x.h"
#include "hc-sr04.h"
#include "sys.h"
#include "delay.h"
u32 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 GPIO_Config(void)
函数说明:配置相应管脚,Trig->PB.5;Echo->TIM2_CH3(PA.2)
入口参数:无
返回值:无
*********************************************************/
void GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitTypeStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
       
       
        GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_2;
        GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitTypeStruct);
       
        GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitTypeStruct);
}
/**********************************************************************
函数名称:void TIM_Config(void)
函数说明:配置TIM2_CH3,通过TIM2计算HC-SR4返回的高电平时间
入口参数:无
返回值:无
**********************************************************************/
void TIM_Config(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
       
        TIM_TimeBaseInitTypeStruct.TIM_ClockDivision=TIM_CKD_div1;
        TIM_TimeBaseInitTypeStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitTypeStruct.TIM_Period=5999;
        TIM_TimeBaseInitTypeStruct.TIM_Prescaler=719;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruct);
       
        TIM_Cmd(TIM2,DISABLE);
        NVIC_Config();
       

       
}
/***********************************************************************
函数名称:float HC_SR04_Init(void)
函数说明:对超声波模块进行相应的配置
入口参数:无
返回值:
************************************************************************/
float HC_SR04_Init(void)
{
        float time=0;
       
        Trig=1;            //给超声波模块20us的高电平
        delay_us(20);
        Trig=0;
       
        while(!Echo);     //等待回响信号为高
        while(Echo)       //回响信号为高则开启TIM2进行计时
        {
                TIM_Cmd(TIM2,ENABLE);
        }
        time=TIM_GetCounter(TIM2)+overcount*60000;  //获取TIM2的值,单位为us
    TIM2->CNT=0;  
        delay_ms(60);
       
        return time;
       
}
       
void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  {
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
overcount++;
  }
}

主函数内容:
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "lcd.h"
#include "hc-sr04.h"
int main(void)
{
        float s=0;
        float temp=0;
    uart_init(115200);
        GPIO_Config();
    TIM_Config();
        NVIC_Config();
       
        temp=HC_SR04_Init();
        s=340*temp/2000000;
       
        while(1)
        {
                printf("%f\n",temp);//打印时间
                printf("%f\n",s);   //打印距离
        }
}

先把串口调试好把!

就是在串口无显示,检查好多次了,写了好多个,有些可以显示但数值不变!

没什么大问题

你好 你的问题解决了吗 我现在也出现了这样的问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top