基于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); //打印距离
}
}
#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); //打印距离
}
}
先把串口调试好把!
就是在串口无显示,检查好多次了,写了好多个,有些可以显示但数值不变!
没什么大问题
你好 你的问题解决了吗 我现在也出现了这样的问题