标题:
基于STM32F103ZET6单片机的超声波程序(两个超声波)
[打印本页]
作者:
罹墨1993
时间:
2017-5-12 16:49
标题:
基于STM32F103ZET6单片机的超声波程序(两个超声波)
分享一个超声波的程序,实测可用。
0.png
(62.05 KB, 下载次数: 72)
下载附件
2017-5-12 17:34 上传
单片机源程序如下:
#include "tim_wave.h"
#include "systick.h"
#include "usart.h"
#include "bsp_led.h"
#include "wave3.h"
// 中断优先级配置
static void GENERAL_TIM_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 设置中断组为0
NVIC_InitStructure.NVIC_IRQChannel = WAVE_TIM_IRQ ; // 设置中断来源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 设置主优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 设置抢占优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
static void GENERAL_TIM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 输入捕获通道 GPIO 初始化
RCC_APB2PeriphClockCmd(WAVE1_TIM_CH1_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = WAVE1_TIM_CH1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(WAVE1_TIM_CH1_PORT, &GPIO_InitStructure);
/*-----------------------------------------------------------------------------------------------------------------*/
RCC_APB2PeriphClockCmd(WAVE2_TIM_CH1_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = WAVE2_TIM_CH1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(WAVE2_TIM_CH1_PORT, &GPIO_InitStructure);
/*-----------------------------------------------------------------------------------------------------------------*/
}
///*
// * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
// * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
// * 另外三个成员是通用定时器和高级定时器才有.
// *-----------------------------------------------------------------------------
// *typedef struct
// *{ TIM_Prescaler 都有
// * TIM_CounterMode TIMx,x[6,7]没有,其他都有
// * TIM_Period 都有
// * TIM_ClockDivision TIMx,x[6,7]没有,其他都有
// * TIM_RepetitionCounter TIMx,x[1,8,15,16,17]才有
// *}TIM_TimeBaseInitTypeDef;
// *-----------------------------------------------------------------------------
// */
/* ---------------- PWM信号 周期和占空比的计算--------------- */
// ARR :自动重装载寄存器的值
// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)
static void GENERAL_TIM_Mode_Config(void)
{
// 开启定时器时钟,即内部时钟CK_INT=72M
WAVE_TIM_APBxClock_FUN(WAVE_TIM_CLK,ENABLE);
/*--------------------时基结构体初始化-------------------------*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Period=WAVE_TIM_PERIOD;
// 驱动CNT计数器的时钟 = Fck_int/(psc+1)
TIM_TimeBaseStructure.TIM_Prescaler= WAVE_TIM_PSC;
// 时钟分频因子 ,配置死区时间时需要用到
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
// 计数器计数模式,设置为向上计数
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 重复计数器的值,没用到不用管
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
// 初始化定时器
TIM_TimeBaseInit(WAVE_TIM, &TIM_TimeBaseStructure);
/*--------------------输入捕获结构体初始化-------------------*/
TIM_ICInitTypeDef TIM_ICInitStructure;
// 配置输入捕获的通道,需要根据具体的GPIO来配置
TIM_ICInitStructure.TIM_Channel = WAVE1_TIM_CHANNEL_x;
// 输入捕获信号的极性配置
TIM_ICInitStructure.TIM_ICPolarity = WAVE_TIM_STRAT_ICPolarity;
// 输入通道和捕获通道的映射关系,有直连和非直连两种
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
// 输入的需要被捕获的信号的分频系数
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
// 输入的需要被捕获的信号的滤波系数
TIM_ICInitStructure.TIM_ICFilter = 0;
// 定时器输入捕获初始化
TIM_ICInit(WAVE_TIM, &TIM_ICInitStructure);
/*---------------------------------------------------------------------------------------------------------------*/
TIM_ICInitStructure.TIM_Channel = WAVE2_TIM_CHANNEL_x;
// 输入捕获信号的极性配置
TIM_ICInitStructure.TIM_ICPolarity = WAVE_TIM_STRAT_ICPolarity;
// 输入通道和捕获通道的映射关系,有直连和非直连两种
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
// 输入的需要被捕获的信号的分频系数
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
// 输入的需要被捕获的信号的滤波系数
TIM_ICInitStructure.TIM_ICFilter = 0;
// 定时器输入捕获初始化
TIM_ICInit(WAVE_TIM, &TIM_ICInitStructure);
/*---------------------------------------------------------------------------------------------------------------*/
// 清除更新和捕获中断标志位
TIM_ClearFlag(WAVE_TIM, TIM_FLAG_Update|WAVE1_TIM_IT_CCx|WAVE2_TIM_IT_CCx);
// 开启更新和捕获中断
TIM_ITConfig (WAVE_TIM, TIM_IT_Update |WAVE1_TIM_IT_CCx|WAVE2_TIM_IT_CCx, ENABLE );
// 使能计数器
TIM_Cmd(WAVE_TIM, ENABLE);
}
static void WAVE_TRIG_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义TRIG_GPIO结构体
RCC_APB2PeriphClockCmd(WAVE1_TRIG_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = WAVE1_TRIG_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(WAVE1_TRIG_GPIO_PORT, &GPIO_InitStructure);
/*------------------------------------------------------------------------------------------------------------------*/
RCC_APB2PeriphClockCmd(WAVE2_TRIG_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = WAVE2_TRIG_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(WAVE2_TRIG_GPIO_PORT, &GPIO_InitStructure);
/*------------------------------------------------------------------------------------------------------------------*/
}
void WAVE_Start(void)
{
//Time_Start();
GPIO_SetBits(WAVE1_TRIG_GPIO_PORT,WAVE1_TRIG_GPIO_PIN);
GPIO_SetBits(WAVE2_TRIG_GPIO_PORT,WAVE2_TRIG_GPIO_PIN);
SysTick_Delay_us(20);
GPIO_ResetBits(WAVE1_TRIG_GPIO_PORT,WAVE1_TRIG_GPIO_PIN);
GPIO_ResetBits(WAVE2_TRIG_GPIO_PORT,WAVE2_TRIG_GPIO_PIN);
//SysTick_Delay_ms(20);
}
extern float Distance1,Distance2;
extern u8 W1_TIM3CH1_CAPTURE_STA,W2_TIM3CH1_CAPTURE_STA; //输入捕获状态
//bit7:捕获完成标志
//bit6:捕获到高点平标志
//bit5~0:捕获到高电平后定时器溢出的次数
extern u32 W1_TIM3CH1_CAPTURE_VAL,W2_TIM3CH1_CAPTURE_VAL;//输入捕获值
uint32_t time1,time2;
void Dis_Print(void)
{
if(W1_TIM3CH1_CAPTURE_STA&0X80) //成功捕获到了一次高电平
{
time1=W1_TIM3CH1_CAPTURE_STA&0X3F;
time1*=5000; //溢出时间总和
time1+=W1_TIM3CH1_CAPTURE_VAL; //得到总的高电平时间
Distance1=time1*340/200.0;
//printf("Distance1:%f cm\r\n",Distance1);
//printf("Time1:%d s\r\n",time1);
W1_TIM3CH1_CAPTURE_STA=0; //开启下一次捕获
}
if(W2_TIM3CH1_CAPTURE_STA&0X80) //成功捕获到了一次高电平
{
time2=W2_TIM3CH1_CAPTURE_STA&0X3F;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
tim_wave.rar
(3.02 KB, 下载次数: 172)
2017-5-12 16:48 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
asdwqw
时间:
2018-5-7 11:34
只有.c文件,没有工程文件
作者:
zhou792008
时间:
2018-5-7 22:15
幸苦了!
作者:
zhou792008
时间:
2018-5-7 22:17
楼主请问你这个是控制多少w的头子的,能交流一下电路吗?
作者:
大bai
时间:
2018-8-19 13:27
谢谢!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1