基于stm32的智能小车(带oled屏,按键控制模式)

1.项目简介及材料

a.主要功能

        通过oled和按键做了一个小菜单,按键控制小车的两种模式,详细代码我已经上传到了优快云,点我主页免费下载工程文件(免费)。欢迎各位大佬加我QQ2703867620讨论技术和指正我的错误,如果有新手有疑惑看不懂的也欢迎加我Q讨论。

        为了方便移植修改引脚,我把引脚封装在了.h头文件里面了。

b.使用材料

4个麦轮+4个联轴器+4个TT电机

1个底板(网上有,也可以自己3D打印)

2对锂电池和降压器(7号5号干电池都可以,能输出7-12V都可以)

2个L298N驱动模块

1个oled屏幕

避障和循迹模块(网上一般都是10元以内,还包邮)

1个stm32板子(都可以,我把引脚封装在了.h头文件里面了,方便移植修改引脚)

若干字母线和按键

2.L298N驱动模块

         每个L298N驱动模块可以独立驱动2个轮子,本项目为四麦轮使用使用2个L298N驱动模块,界限情况如下:

        其中第一个L298N驱动模块接电源正极7V供电,此时另一个接单片机5.5V给单片机供电,GNG接单片机GND和带电源负极。另一个L298N驱动模块不需要接单片机。其中供电的电源我选择的是锂电池,然后在网上购买了一个变压器,可以调节输出电压(这里在7-12V都可以)

        因为本项目需要使用pwm调速,所以要将L298N驱动模块的跳线帽拔掉接入单片机的通用计时器口(我使用的是tim3)

3.麦克纳姆轮

        麦轮我采用的是ABBA的安装方式(请注意安装方式,会影响后续的程序调试,麦轮的具体原理可在B站抖音搜索麦克纳姆轮会有详细讲解,我就不再赘述了)

4.代码讲解(完整的工程文件我已经上传,在我上一篇博客下载免费,为了方便使用不同的板子移植我把GPIO口在.h头文件里面进行了封装)

a.电机驱动.c文件

void motor_init() 

初始化四个轮子对应的8个GPIO口

void pwm_init()

初始化通用计时器使能PWM的4个通道(我选择的是TIM3,这里不懂的私我QQ2703867620)

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)

回调函数(使能复用功能,开启通用计时器)

void motor_go(uint16_t speed)

目录

a.L298N驱动模块

b.麦克纳姆轮

2.代码讲解(完整的工程文件我已经上传,在我上一篇博客下载免费,为了方便使用不同的板子移植我把GPIO口在.h头文件里面进行了封装)

a.电机驱动.c文件

void motor_init() 

void pwm_init()

void motor_go(uint16_t speed)

void motor_right(uint16_t speed)                同上

void motor_left(uint16_t speed)                  同上

void motor_back(uint16_t speed)               同上

void motor_stop()                                       同上

b.循迹模块.c文件

void xunji_init() 

void xunji_control() 

b.避障模块

void bizhang_init() 

void bizhang_control()

c.oled部分代码和按键控制代码(使用状态机,不堵塞程序)

d.附加尾灯模块


给GPIO口写入高低电平,使轮子转起来(传入速度参数,改变PWM占空比,控制速度)

void motor_right(uint16_t speed)                同上

void motor_left(uint16_t speed)                  同上

void motor_back(uint16_t speed)               同上

void motor_stop()                                       同上

#include "./BSP/motor/motor.h"
#include "./BSP/oled/oled1.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"

TIM_HandleTypeDef tim3;

void motor_init()
{
    GPIO_InitTypeDef gpio_init_struct;
    
    __HAL_RCC_GPIOF_CLK_ENABLE();
    
    gpio_init_struct.Pin = motor_pin_IN_all;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(motor_gpio_IN, &gpio_init_struct);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_IN_all, GPIO_PIN_RESET);
}

void pwm_init()
{
    TIM_ClockConfigTypeDef sClockSourceConfig;
    TIM_MasterConfigTypeDef sMasterConfig;
    TIM_OC_InitTypeDef sConfigOC;
    
    tim3.Instance = TIM3;
    tim3.Init.Prescaler = 36 - 1;
    tim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    tim3.Init.Period = 100 - 1;
    tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    HAL_TIM_PWM_Init(&tim3);
    
    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    HAL_TIM_ConfigClockSource(&tim3, &sClockSourceConfig);
    
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&tim3, &sMasterConfig);

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&tim3, &sConfigOC, TIM_CHANNEL_1);
    HAL_TIM_PWM_ConfigChannel(&tim3, &sConfigOC, TIM_CHANNEL_2);
    HAL_TIM_PWM_ConfigChannel(&tim3, &sConfigOC, TIM_CHANNEL_3);
    HAL_TIM_PWM_ConfigChannel(&tim3, &sConfigOC, TIM_CHANNEL_4);
    HAL_TIM_PWM_Start(&tim3,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&tim3,TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&tim3,TIM_CHANNEL_3);
    HAL_TIM_PWM_Start(&tim3,TIM_CHANNEL_4);
}

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM3)
    {
        GPIO_InitTypeDef gpio_init_struct;
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_TIM3_CLK_ENABLE();

        gpio_init_struct.Pin = motor_pin_pwm1_ENA|motor_pin_pwm1_ENB;
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;            /* ÍÆÍ츴Óà */
        gpio_init_struct.Pull = GPIO_PULLUP;                /* ÉÏÀ­ */
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;      /* ¸ßËÙ */
        HAL_GPIO_Init(motor_gpio_pwm1, &gpio_init_struct);
        
        gpio_init_struct.Pin = motor_pin_pwm2_ENA|motor_pin_pwm2_ENB;
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;            /* ÍÆÍ츴Óà */
        gpio_init_struct.Pull = GPIO_PULLUP;                /* ÉÏÀ­ */
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;      /* ¸ßËÙ */
        HAL_GPIO_Init(motor_gpio_pwm2, &gpio_init_struct);
        
        __HAL_RCC_AFIO_CLK_ENABLE();
    }
}

void motor_go(uint16_t speed)
{
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_RESET);
    
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, speed);
}

void motor_right(uint16_t speed)
{
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_SET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_SET);
    
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, speed);
}

void motor_left(uint16_t speed)
{
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_SET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_SET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_RESET);
    
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, speed);
}

void motor_back(uint16_t speed)
{
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_SET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_SET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_SET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_SET);
    
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, speed);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, speed);
}

void motor_stop()
{
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_RESET);
    
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, 0);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, 0);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, 0);
    __HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, 0);
}

b.循迹模块.c文件

void xunji_init() 

        初始化循迹模块的两个GPIO口(启用为输入模式)

void xunji_control() 

        根据循迹模块输入信号,调用电机函数。

        如果前面有路,循迹模块会在对应的GPIO口输入高电平即1。

        如果前面无路,循迹模块会在对应的GPIO口输入低电平即0。

#define xunji_right             HAL_GPIO_ReadPin(xunji_gpio, xunji_pin_right)
#define xunji_left              HAL_GPIO_ReadPin(xunji_gpio, xunji_pin_left)

        其中输入信号的在.h头文件里进行了如上封装(读取GPIO口输入高低电平)

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/xunji/xunji.h"
#include "./BSP/motor/motor.h"
#include "./BSP/weideng/weideng.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
#include "./BSP/oled/oled1.h"

void xunji_init()
{
    GPIO_InitTypeDef gpio_init_struct;
    
    __HAL_RCC_GPIOD_CLK_ENABLE();
    
    gpio_init_struct.Pin = xunji_pin_right|xunji_pin_left;
    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(xunji_gpio, &gpio_init_struct);
}

void xunji_control()
{
    if(xunji_right == 1 && xunji_left == 1)
    {
        oled_go();
        motor_go(100);
        weideng_of();
    }
    
    if(xunji_right == 1 && xunji_left == 0)
    {
        oled_right();
        motor_right(80);
        weideng_of();
    }
    
    if(xunji_right == 0 && xunji_left == 1)
    {
        oled_left();
        motor_left(80);
        weideng_of();
    }
    
    if(xunji_right == 0 && xunji_left == 0)
    {
        oled_stop();
        motor_stop();
        weideng_on();
    }
}

注意:oled的对应程序在后面介绍。尾灯是我的附加模块,也在后面介绍

b.避障模块

void bizhang_init() 

        初始化避障模块的两个GPIO口(启用为输入模式)

void bizhang_control()

        根据避障模块输入信号,调用电机函数。

        如果前面无障碍物,循迹模块会在对应的GPIO口输入高电平即1。

        如果前面有障碍物,循迹模块会在对应的GPIO口输入低电平即0。

#define bizhang_right           HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_6)
#define bizhang_left            HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_1)

        其中输入信号的在.h头文件里进行了如上封装(读取GPIO口输入高低电平)

#include "./BSP/bizhang/bizhang.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/motor/motor.h"
#include "./BSP/weideng/weideng.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
#include "./BSP/oled/oled1.h"

void bizhang_init()
{
    GPIO_InitTypeDef gpio_init_struct;

    __HAL_RCC_GPIOE_CLK_ENABLE();

    gpio_init_struct.Pin = E_bizhang_pin_right;
    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOE, &gpio_init_struct);
    
    gpio_init_struct.Pin = F_bizhang_pin_left;
    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOE, &gpio_init_struct);
}

void bizhang_control()
{
    if(bizhang_right == 1 && bizhang_left == 1)
    {
        oled_go();
        motor_go(100);
        weideng_of();
    }
    
    if(bizhang_right == 1 && bizhang_left == 0)
    {
        oled_right();
        motor_right(80);
        weideng_of();
    }
    
    if(bizhang_right == 0 && bizhang_left == 1)
    {
        oled_left();
        motor_left(80);
        weideng_of();
    }
    
    if(bizhang_right == 0 && bizhang_left == 0)
    {
        oled_stop();
        motor_stop();
        weideng_on();
    }
}

c.oled部分代码和按键控制代码(使用状态机,不堵塞程序)

oled的配置代码我是移植的江科大的。但他是标准库,使用我根据自己的理解将其改成了HAL库,可以正常使用,详细代码见我上一个博客,其中oled取模我使用的是PCtoLCD2002.exe软件,如下,如果想要这个软件的下载方式的私信我或者加我QQ2703867620免费。

 以下是我的key.c文件

里面的代码逻辑我将单独创建一个博客讲解我的按键实现逻辑

#include "./BSP/key/key.h"
#include "./BSP/weideng/weideng.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/oled/oled1.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
#include "./BSP/xunji/xunji.h"
#include "./BSP/bizhang/bizhang.h"
#include "./BSP/motor/motor.h"

TIM_HandleTypeDef tim6;


void key0_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    __HAL_RCC_GPIOE_CLK_ENABLE();
    
    gpio_init_struct.Pin = key0_pin;
    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(key0_gpio, &gpio_init_struct);
    
    gpio_init_struct.Pin = key1_pin;
    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(key0_gpio, &gpio_init_struct);
    
}
void tim2_init()
{
    
    tim6.Instance = TIM6;
    tim6.Init.Prescaler = 71;
    tim6.Init.Period = 999;
    HAL_TIM_Base_Init(&tim6);

    HAL_TIM_Base_Start_IT(&tim6);
}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM6)
    {
        __HAL_RCC_TIM6_CLK_ENABLE();
        HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(TIM6_IRQn);
    }
}

void TIM6_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&tim6);
}

uint8_t key0_flag = 0;
uint8_t key0_count = 1;
uint8_t key1_flag = 0;
uint8_t key1_count = 0;


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM6)
    {
        if(key0_read == 1 && key0_flag == 0)
        {
            key0_count++;
            if(key0_count == 3) key0_count = 1;
            key0_flag = 1;
            key1_count = 0;
        }
        if(key0_read == 0)
        {
            key0_flag = 0;
        }
        
        if(key1_read == 0 && key1_flag == 0)
        {
            key1_count++;
            if(key1_count == 2) key1_count = 1;
            key1_flag = 1;
        }
        if(key1_read == 1)
        {
            key1_flag = 0;
        }
    }
}

//¹öÂÖ&·µ»Ø
//È·¶¨
void menu_1()
{
    if(key1_count == 0)
    {
        switch(key0_count)
        {
            case 1:
            {
				motor_stop();
				weideng_on();
                OLED_ReverseArea(88, 0, 126, 20);
                OLED_Update();
            }break;
            case 2:
            {
				motor_stop();
				weideng_on();
                OLED_ReverseArea(88, 20, 126, 20);
                OLED_Update();
            }break;
        }
    }
    if(key1_count == 1 && key0_count == 1)
    {
        xunji_control();
    }
    if(key1_count == 1 && key0_count == 2)
    {
        bizhang_control();
    }
}
#include "./BSP/oled/oled1.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
#include "./SYSTEM/delay/delay.h"

void oled_mode()
{
    OLED_Clear();
    OLED_ShowImage(0, 0, 100, 64, Diode);
    OLED_ShowChinese(90, 0, "寻迹");
    OLED_ShowChinese(90, 20, "避障");
}

void oled_go()
{
    OLED_Clear();
    OLED_ShowImage(0, 0, 100, 64, Diode);
    OLED_ShowChinese(100, 0, "前");
    OLED_ShowChinese(100, 20, "进");
	OLED_ShowChinese(0, 48, "当前车速:");
	OLED_ShowNum(75, 52, 100, 3, OLED_6X8);
    OLED_Update();
}

void oled_right()
{
    OLED_Clear();
    OLED_ShowImage(0, 0, 100, 64, Diode);
    OLED_ShowChinese(100, 0, "右");
    OLED_ShowChinese(100, 20, "转");
	OLED_ShowChinese(0, 48, "当前车速:");
	OLED_ShowNum(75, 52, 80, 2, OLED_6X8);
    OLED_Update();
}

void oled_left()
{
    OLED_Clear();
    OLED_ShowImage(0, 0, 100, 64, Diode);
    OLED_ShowChinese(100, 0, "左");
    OLED_ShowChinese(100, 20, "转");
	OLED_ShowChinese(0, 48, "当前车速:");
	OLED_ShowNum(75, 52, 80, 2, OLED_6X8);
    OLED_Update();
}

void oled_stop()
{
    OLED_Clear();
    OLED_ShowImage(0, 0, 100, 64, Diode);
    OLED_ShowChinese(100, 0, "停");
    OLED_ShowChinese(100, 20, "止");
	OLED_ShowChinese(0, 48, "当前车速:");
	OLED_ShowNum(75, 52, 0, 1, OLED_6X8);
    OLED_Update();
}

void oled_qidong()
{
    OLED_Clear();
    OLED_ShowImage(0, 0, 100, 64, Diode);
    OLED_ShowChinese(100, 0, "启");
    OLED_ShowChinese(100, 20, "动");
    OLED_ShowChinese(100, 40, "中");
    OLED_Update();
}

d.附加尾灯模块

这部分就非常简单了,我们接触是他们32的第一个实验点灯(开个玩笑,不是点亮第一个电容哈)

#include "./BSP/weideng/weideng.h"

void weideng_Init(void)
{

    GPIO_InitTypeDef GPIO_InitStruct;

    __HAL_RCC_GPIOE_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    GPIO_InitStruct.Pin = weideng_pin_A1|weideng_pin_A2;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin = weideng_pin_B1;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void weideng_on()
{
    HAL_GPIO_WritePin(GPIOE, weideng_pin_A1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOE, weideng_pin_A2, GPIO_PIN_SET);
//    HAL_GPIO_WritePin(GPIOB, weideng_pin_B1, GPIO_PIN_SET);
//    HAL_GPIO_WritePin(GPIOA, weideng_pin_B2, GPIO_PIN_RESET);
}

void weideng_of()
{
    HAL_GPIO_WritePin(GPIOE, weideng_pin_A1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOE, weideng_pin_A2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, weideng_pin_B1, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, weideng_pin_B2, GPIO_PIN_RESET);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值