STM32的超声波测距源程序
单片机源程序如下:
- #include "CHAO.h"
- #include "timer.h"
- #include "delay.h"
- #include "LED.h"
- #include "usart.h"
- #include "stm32f10x_exti.h"
- #include "stm32f10x_gpio.h"
- #define TRIG_PORT1 GPIOB //TRIG
- #define ECHO_PORT1 GPIOB //ECHO
- #define TRIG_PIN1 GPIO_Pin_14 //TRIG B14 TIM1
- #define ECHO_PIN1 GPIO_Pin_15 //ECHO B15
- #define TRIG_PORT2 GPIOA //ECHO A2
- #define ECHO_PORT2 GPIOA //ECHO A3
- #define TRIG_PIN2 GPIO_Pin_0 //TRIG A2 TIM2
- #define ECHO_PIN2 GPIO_Pin_1 //ECHO A2
- #define TRIG_PIN4 GPIO_Pin_8 //TRIG B8 TIM4
- #define ECHO_PIN4 GPIO_Pin_9 //ECHO B9
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK战舰STM32开发板
- //LED驱动代码
- //正点原子@ALIENTEK
- //版本:V1.0
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- //////////////////////////////////////////////////////////////////////////////////
- //初始化PB5和PE5为输出口.并使能这两个口的时钟
- //LED IO初始化
- u16 flag1=0;//蓝牙控制的关闭是否跟随
- u16 flag2=0;
- u16 flag4=0;
- u16 flagq=0;//前面
- u16 flagz=0;//左边
- u16 flagy=0;//右边
- u16 pwm3=186;//x
- u16 pwm4=155;
- void zadd(void)
- {
- if(pwm4>440)
- {
- pwm4=395;
- }
- else
- {
- pwm4=pwm4+1;
- }
- TIM_SetCompare4(TIM3,pwm4);
- }
- void yadd(void)
- {
- if(pwm3>440)
- {
- pwm3=405;
- }
- else
- {
- pwm3=pwm3+1;
- }
- TIM_SetCompare3(TIM3,pwm3);
- }
- void zjian(void)
- {
- if(pwm4<60)
- {
- pwm4=45;
- }
- else
- {
- pwm4=pwm4-1;
- }
- TIM_SetCompare4(TIM3,pwm4);
- }
- void yjian(void)
- {
- if(pwm3<60)
- {
- pwm3=45;
- }
- else
- {
- pwm3=pwm3-1;
- }
- TIM_SetCompare3(TIM3,pwm3);
- }
- void PD_USART2_Init(void)
- {
- GPIO_InitTypeDef GPIO_Initping;
- USART_InitTypeDef USART_Initping;
- NVIC_InitTypeDef NVIC_Initping;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
-
- GPIO_Initping.GPIO_Mode=GPIO_Mode_AF_PP;
- GPIO_Initping.GPIO_Pin=GPIO_Pin_2;
- GPIO_Initping.GPIO_Speed=GPIO_Speed_10MHz;
- GPIO_Init(GPIOA,&GPIO_Initping);
-
- GPIO_Initping.GPIO_Mode=GPIO_Mode_IN_FLOATING;
- GPIO_Initping.GPIO_Pin=GPIO_Pin_3;
- GPIO_Initping.GPIO_Speed=GPIO_Speed_10MHz;
- GPIO_Init(GPIOA,&GPIO_Initping);
-
- USART_Initping.USART_BaudRate=9600;
- USART_Initping.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
- USART_Initping.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
- USART_Initping.USART_Parity=USART_Parity_No;
- USART_Initping.USART_StopBits=USART_StopBits_1;
- USART_Initping.USART_WordLength=USART_WordLength_8b;
-
- USART_Init(USART2,&USART_Initping);
-
- USART_Cmd(USART2,ENABLE);//使能串口2
- USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启接收中断
-
- NVIC_Initping.NVIC_IRQChannel=USART2_IRQn;
- NVIC_Initping.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Initping.NVIC_IRQChannelPreemptionPriority=1;
- NVIC_Initping.NVIC_IRQChannelSubPriority=1;
- NVIC_Init(&NVIC_Initping);
- }
- void IN_Init(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能PB,PE端口时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.11
- GPIO_SetBits(GPIOA,GPIO_Pin_11); //PA.11输出高
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.12
- GPIO_SetBits(GPIOA,GPIO_Pin_12); //PA.12 输出高
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.12
- GPIO_SetBits(GPIOA,GPIO_Pin_7); //PA.12 输出高
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.12
- GPIO_SetBits(GPIOA,GPIO_Pin_6); //PA.12 输出高
- }
- float CHAO_Distance1; //计算出的距离
- float CHAO_Distance2; //计算出的距离
- float CHAO_Distance4; //计算出的距离
- void CHAO_Init1(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设为推挽输出模式
- GPIO_InitStructure.GPIO_Pin=TRIG_PIN1;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB ,&GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//设为输入
- GPIO_InitStructure.GPIO_Pin = ECHO_PIN1; //PB15接ECH0
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB ,&GPIO_InitStructure);
- //GPIOB.15 中断线以及中断初始化配置
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);
- EXTI_InitStructure.EXTI_Line=EXTI_Line15;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- }
- void CHAO_Init2(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PB端口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设为推挽输出模式
- GPIO_InitStructure.GPIO_Pin=TRIG_PIN2;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA ,&GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//设为输入
- GPIO_InitStructure.GPIO_Pin =ECHO_PIN2 ; //PA3接ECH0
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA ,&GPIO_InitStructure);
- //GPIOA.3 中断线以及中断初始化配置
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
- EXTI_InitStructure.EXTI_Line=EXTI_Line1;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键所在的外部中断通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- }
- void CHAO_Init4(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设为推挽输出模式
- GPIO_InitStructure.GPIO_Pin=TRIG_PIN4 ;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB ,&GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//设为输入
- GPIO_InitStructure.GPIO_Pin = ECHO_PIN4 ; //PB9接ECH0
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB ,&GPIO_InitStructure);
- //GPIOB.9 中断线以及中断初始化配置
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);
- EXTI_InitStructure.EXTI_Line=EXTI_Line9;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级2
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- }
- void EXTI15_10_IRQHandler(void)
- {
- delay_us(10); //延时10us
- if(EXTI_GetITStatus(EXTI_Line15) != RESET)
- {
- TIM_SetCounter(TIM1,0);
- if(flag1==1)
- {
- TIM_Cmd(TIM1, ENABLE); //开启时钟
- }
- else
- {
- TIM_Cmd(TIM1,DISABLE); //关闭时钟
- }
- while(GPIO_ReadInputDataBit(ECHO_PORT1,ECHO_PIN1)); //等待低电平
- TIM_Cmd(TIM1, DISABLE); //定时器2失能
- CHAO_Distance1=TIM_GetCounter(TIM1)*30*33/300.0; //计算距离&&UltrasonicWave_Distance<150
- // printf("distance1:%f cm",CHAO_Distance1);
- EXTI_ClearITPendingBit(EXTI_Line15); //清除EXTI7线路挂起位
- }
- }
- void EXTI1_IRQHandler(void)
- {
- delay_us(10); //延时10us
- if(EXTI_GetITStatus(EXTI_Line1) != RESET)
- {
- TIM_SetCounter(TIM2,0);
- if(flag2==1)
- {
- TIM_Cmd(TIM2, ENABLE); //开启时钟
- }
- else
- {
- TIM_Cmd(TIM2,DISABLE); //关闭时钟
- }
- while(GPIO_ReadInputDataBit(ECHO_PORT2,ECHO_PIN2)); //等待低电平
- TIM_Cmd(TIM2, DISABLE); //定时器2失能
- CHAO_Distance2=TIM_GetCounter(TIM2)*100*500.0; //计算距离&&UltrasonicWave_Distance<150
-
- // if(CHAO_Distance2>0)
- // {
- // printf("distance2:%f cm",CHAO_Distance2);
- // }
- EXTI_ClearITPendingBit(EXTI_Line1); //清除EXTI7线路挂起位
- }
- }
- void EXTI9_5_IRQHandler(void)
- {
- delay_us(10); //延时10us
- if(EXTI_GetITStatus(EXTI_Line9) != RESET)
- {
- TIM_SetCounter(TIM4,0);
- if(flag4==1)
- {
- TIM_Cmd(TIM4, ENABLE); //开启时钟
- }
- else
- {
- TIM_Cmd(TIM4,DISABLE); //关闭时钟
- }
- while(GPIO_ReadInputDataBit(ECHO_PORT1,ECHO_PIN4)); //等待低电平
- TIM_Cmd(TIM4, DISABLE); //定时器2失能
- CHAO_Distance4=TIM_GetCounter(TIM4)*5*34/200.0; //计算距离&&UltrasonicWave_Distance<150
- // if(CHAO_Distance4>0)
- // {
- // printf("distance4:%f cm",CHAO_Distance4);
- // }
- EXTI_ClearITPendingBit(EXTI_Line9); //清除EXTI7线路挂起位
- }
- }
- /*
- * 函数名:UltrasonicWave_StartMeasure
- * 描述 :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
- * 输入 :无
- * 输出 :无
- */
- void CHAO_ceju1(void)
- {
- GPIO_SetBits(TRIG_PORT1,TRIG_PIN1); //送>10US的高电平RIG_PORT,TRIG_PIN这两个在define中有?
- delay_us(20); //延时20US
- GPIO_ResetBits(TRIG_PORT1,TRIG_PIN1);
- }
- void CHAO_ceju2(void)
- {
- GPIO_SetBits(TRIG_PORT2,TRIG_PIN2); //送>10US的高电平RIG_PORT,TRIG_PIN这两个在define中有?
- delay_us(20); //延时20US
- GPIO_ResetBits(ECHO_PORT2,TRIG_PIN2);
- }
- void CHAO_ceju4(void)
- {
- GPIO_SetBits(TRIG_PORT1,TRIG_PIN4); //送>10US的高电平RIG_PORT,TRIG_PIN这两个在define中有?
- delay_us(20); //延时20US
- GPIO_ResetBits(ECHO_PORT1,ECHO_PIN4);
- }
- //void bijiao(void)
- //{
- //if( CHAO_Distance1<10)
- //{
- // LED0=0;
- //}
- //else
- //{
- //LED0=1;
- //}
- //}
- //void GenSui_Init(void)
- //{
- //if( CHAO_Distance1>1&&CHAO_Distance1<10)
- //{
- // IN1=0;
- // IN2=0;
- // IN3=0;
- // IN4=0;
- //}
- //else
- // if(CHAO_Distance1>=10&&CHAO_Distance1<30)
- //{
- //// stop();
- // IN1=1;
- // IN2=0;
- // IN3=0;
- // IN4=1;
- //}
- ////else
- //// if(CHAO_Distance1>=20&&CHAO_Distance1<40)
- //// {
- ////// forward();
- //// IN1=1;
- //// IN2=0; //左边电机
- //// IN3=0;
- //// IN4=1; //右边电机
- //// }
- ////else
- ////{
- //// flagz=1;//左边
- //// flagy=1;//右边
- ////}
- ////if(CHAO_Distance2>0&&CHAO_Distance2<20&&flagz==1)
- ////{
- //////turnreft();
- ////}
- ////else
- ////{
- //// flagz=0;//左边
- ////}
- ////if(CHAO_Distance4>0&&CHAO_Distance4<20&&flagy==1)
- ////{
- //////turnleft();
- ////}
- ////else
- ////{
- //// flagy=0;//右边
- ////}
- //}
- void USART2_IRQHandler(void)
- {
- u8 res;
-
- if(USART_GetITStatus(USART2,USART_IT_RXNE))
- {
- res= USART_ReceiveData(USART2);
- USART_SendData(USART2,res);
-
- if(res==0x08)//开启跟随
- {
- flag1=1;
- flag2=1;
- flag4=1;
- }
- if(res==0x09)//关闭跟随
- {
- flag1=0;
- flag2=0;
- flag4=0;
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- }
- if(res==0x01)//前进
- {
- IN1=1;
- IN2=0; //左边电机
- IN3=0;
- IN4=1; //右边电机
- }
- if(res==0x02)//后退
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于stm32体感手势手环.rar
(2.95 MB, 下载次数: 116)
|