STM32-通行闸机2(HAL库)

通行闸机2(HAL库)


文章目录

  • 通行闸机2(HAL库)
  • 必看
    • 一、我们需要用stm32cubeMX进行项目相关配置。
    • 硬件设计
    • 软件设计
      • 5、 进行接下来 HC—SR04超声波 的选择与配置,这里我们选择GPIOA-Pin11(HCSR04_TRIG1),GPIOA-Pin12(HCSR04_TRIG2)
      • 6、 接下来 es08a舵机 进行GPIO口的选择与配置,这里我们选择GPIOB-Pin6。
      • 7、 接下来 红外遥控模块 进行GPIO口的选择与配置,这里我们选择GPIOA-Pin3。
      • 8、 这里我也开启了USART1串口,用来输出到电脑上
      • 9、 接下来我们进行项目相关信息的设置,这里我们可以进行项目名称,项目保存地址,开发环境的选择
    • 二、MDK5中的代码编写
      • 超声波测距代码:
        • HCSR04.c
        • HCSR04.h
      • es08a舵机旋转 模拟开门关门代码
      • 红外遥控 代码
        • HW_remote.c
        • HW_remote.h
      • 串口一,在usart.c文件中添加下面函数
      • 最后,在给大家main.c的代码
        • main.c
    • STM32-通行闸机1
    • 完整效果



必看

说明,文章分为两部分,先看另一篇文章

另一部分在—》通行闸机1(STM32HAL库)


一、我们需要用stm32cubeMX进行项目相关配置。

具体详情请看----》STM32通行闸机1(HAL库)

硬件设计

  • 两个超声波模块
  • 一个红外遥控
  • 一个红外避障
  • 一个舵机(接CH340的5v引脚,单独供电)
  • 一个0.96寸OLED屏幕
  • 一个STM32F103C8T6
  • 一个CH340
  • 一个ST-Link v2

在这里插入图片描述

软件设计

  • 使用了TIM1_CH1、TIM2_CH1、TIM3_CH1、TIM4_CH1
  • 使用了USART1
  • 模拟IIC

在这里插入图片描述

5、 进行接下来 HC—SR04超声波 的选择与配置,这里我们选择GPIOA-Pin11(HCSR04_TRIG1),GPIOA-Pin12(HCSR04_TRIG2)

13、选择GPIOA-Pin11,GPIOA-Pin12引脚,点击进行设置

14、将引脚功能设置为输出模式

15、点击GPIOA-Pin11,GPIOA-Pin12,看图设置

16、设置别名GPIOA-Pin11(HCSR04_TRIG1),GPIOA-Pin12(HCSR04_TRIG2)

在这里插入图片描述

在这里插入图片描述

配置PA0(TIM2CH1)给超声波1的ECHO口

在这里插入图片描述

在这里插入图片描述

配置PA6(TIM3CH1)给超声波2的ECHO口

在这里插入图片描述

在这里插入图片描述

设置别名

在这里插入图片描述

6、 接下来 es08a舵机 进行GPIO口的选择与配置,这里我们选择GPIOB-Pin6。

在这里插入图片描述

在这里插入图片描述

7、 接下来 红外遥控模块 进行GPIO口的选择与配置,这里我们选择GPIOA-Pin3。

我们需要使用定时器TIM1_CH1

在这里插入图片描述

在这里插入图片描述

8、 这里我也开启了USART1串口,用来输出到电脑上

在这里插入图片描述

9、 接下来我们进行项目相关信息的设置,这里我们可以进行项目名称,项目保存地址,开发环境的选择

注意:选择生成路径时,不能有中文路径

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

点击生成 GENERATE CODE后会生成项目文件,生成后界面如下图。

在这里,我们可以直接点击OPEN PROJECT,也可以在项目创建目录下打开

接下来给大家介绍第二种从创建目录下打开的方法。

二、MDK5中的代码编写

我们首先需要了解文件夹结构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们需要在Core文件夹中添加自定义的文件,添加教程在 通行闸机1

这是完整的文件样式,图一,图二,图三

在这里插入图片描述

(图一)

在这里插入图片描述

(图二)

在这里插入图片描述

(图三)

完成后,我们打开MDK-ARM文件,打开项目工程

超声波测距代码:

由于代码过于多,这里就直接给到大家,将下面的代码添加到HCSR04.c

HCSR04.c
#include "stm32f1xx_hal.h"
#include "HCSR04.h"

float distant1;      //测量距离
float distant2;      //测量距离
uint32_t measure_Buf1[3] = {
   0};   //存放定时器计数值的数组
uint32_t measure_Buf2[3] = {
   0};   //存放定时器计数值的数组
uint8_t  measure_Cnt1 = 0;    //状态标志位
uint8_t  measure_Cnt2 = 0;    //状态标志位
uint32_t high_time1;   //超声波模块返回的高电平时间
uint32_t high_time2;   //超声波模块返回的高电平时间
 
//===============================================读取距离
void SR04_GetData1(void)
{
   
switch (measure_Cnt1){
   
	case 0:
         TRIG1_H;
         delay_us(30);
         TRIG1_L;
    
		measure_Cnt1++;
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
		HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);	//启动输入捕获       或者: __HAL_TIM_ENABLE(&htim5);                                                                                    		
        break;
	case 3:
		high_time1 = measure_Buf1[1]- measure_Buf1[0];    //高电平时间						
		distant1=(high_time1*0.034)/2;  //单位cm
        printf("\r\n-超声波1检测距离为-%.2f-cm-\r\n",distant1);          
		measure_Cnt1 = 0;  //清空标志位
        TIM2->CNT=0;     //清空计时器计数
		break;
				
	}
   HAL_Delay(100);
}
//===============================================读取距离
void SR04_GetData2(void)
{
   
switch (measure_Cnt2){
   
	case 0:
         TRIG2_H;
         delay_us(30);
         TRIG2_L;
    
		measure_Cnt2++;
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
		HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);	//启动输入捕获       或者: __HAL_TIM_ENABLE(&htim5);                                                                                    		
        break;
	case 3:
		high_time2 = measure_Buf2[1]- measure_Buf2[0];    //高电平时间						
		distant2=(high_time2*0.034)/2;  //单位cm
        printf("\r\n-超声波2检测距离为-%.2f-cm-\r\n",distant2);          
		measure_Cnt2 = 0;  //清空标志位
        TIM3->CNT=0;     //清空计时器计数
		break;
				
	}
   HAL_Delay(100);
}
 
 
//===============================================us延时函数
    void delay_us(uint32_t us)//主频72M
{
   
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
	{
   
		;
	}
}
 

由于代码过于多,这里就直接给到大家,将下面的代码添加到HCSR04.h

HCSR04.h
#ifndef __HCSR04_H
#define __HCSR04_H
#include "main.h"
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安赫'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值