stm32 麦克纳姆轮底盘遥控(已修改)

stm32 麦克纳姆轮小车遥控(已修改)

本程序用于进行麦克纳姆轮小车遥控,已完成修改,能正常控制侧向移动。车内有RGB灯,用的是之前发布的程序。

项目文件已发布到GitHub,链接:Willian7004/Programs-for-STM32F103RCT6 (github.com)

代码如下,具体说明见注释

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "smg.h"
#include "remote.h"
#include "timer.h"
#include "beep.h"

//共阴数字数组
// 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, 全灭
u8 smg_num[] = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e, 0x01, 0x00};
u8 key = 0; //按键值
u8 num = 0x00; //数值
u8 num1 = 0x00; //数值
u8 smg_wei = 6; //数码管位选
u8 smg_duan = 0; //数码管段选
u8 smg_flag = 0; //数码管显示标志 0:正常显示 1:消除鬼影
u8 t = 0;
int a=0;
	int b=0;
	int c=0;
	int d=0;
	int e=0;
	int f=0;
	int g=0;
	int h=0;
//接线:PA0到3分别接第一块L298N的IN1到IN4,PA4到PA7分别接第二块L298N的IN4到IN1,第一块L298N的IN1和IN3控制电机正转,第二块相反
void wheel()  //电机正反转控制(正转向前,反转向后)
{              //1:正转 2:反转 0:停止
	if(a==1)     //a:左前轮 b:右前轮 c:左后轮 d:右后轮
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);}
	if(a==0)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);}
	if(a==2)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);}
	
	if(b==1)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);}
	if(b==0)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);}
	if(b==2)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);}
	
	if(c==1)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET);
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);}
	if(c==0)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);}
	if(c==2)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);}
	
	if(d==1)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);}
	if(d==0)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);}
	if(d==2)
	{HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);}
}

int main(void)
{

    HAL_Init();                    	//初始化HAL库
    Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M
    delay_init(72);                 //初始化延时函数
    uart_init(115200);	 	        //设置串口115200
    LED_Init();		  		        //初始化LED
    BEEP_Init();                    //初始化蜂鸣器
    LED_SMG_Init();                 //初始化数码管
    TIM4_Init(19, 7199);            //数码管2ms定时显示
    Remote_Init();			        //红外接收初始化
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
	
    while (1)
    {
    }

}


//定时器4中断服务函数调用
void TIM4_IRQHandler(void)
{
    if (__HAL_TIM_GET_IT_SOURCE(&TIM4_Handler, TIM_IT_UPDATE) != RESET)
    {
        __HAL_TIM_CLEAR_IT(&TIM4_Handler, TIM_IT_UPDATE);

        key = Remote_Scan();
//数字键为正式操作方案,行进方向为与数字键5的相对方向,0和退格控制旋转
        if (key)
        {
            switch (key)
            {
                case 104:
									num = smg_num[1];
								a=1;
								b=0;
								c=0;
								d=1;
								wheel();
                    break; //按键'1'

                case 152:
                  num = smg_num[2];  
								a=1;
								b=1;
								c=1;
								d=1;
								wheel();
                    break;     //按键'2'

                case 176:
                 num = smg_num[3];   
								a=0;
								b=1;
								c=1;
								d=0;
								wheel();
                    break;     //按键'3'

                case 48:
                 num = smg_num[4];   
								a=1;
								b=2;
								c=2;
								d=1;
								wheel();
                    break;      //按键'4'

                case 24:
                 num = smg_num[17];  
								a=0;
								b=0;
								c=0;
								d=0;
								wheel();
                    break;      //按键'5'

                case 122:
                  num = smg_num[5]; 
								a=2;
								b=1;
								c=1;
								d=2;
								wheel();
                    break;     //按键'6'

                case 16:
                 num = smg_num[6];   
								a=0;
								b=2;
								c=2;
								d=0;
								wheel();
                    break;      //按键'7'

                case 56:
                 num = smg_num[7];   
								a=2;
								b=2;
								c=2;
								d=2;
								wheel();
                    break;      //按键'8'

                case 90:
                 num = smg_num[8];   
								a=2;
								b=0;
								c=0;
								d=2;
								wheel();
                    break;      //按键'9'

                case 66:
									num = smg_num[9];
								a=2;
								b=1;
								c=2;
								d=1;
								wheel();
                    break;      //按键'0'

                case 82:
									num = smg_num[0];
								a=1;
								b=2;
								c=1;
								d=2;
								wheel();
                    break;     //按键'DELETE'

                case 162:
									a=1;								
								wheel();
                    break;//按键'POWER'

                case 98:
									a=2;								
								wheel();
                    break;//按键'UP'

                case 226:									
								b=1;								
								wheel();
                    break;//按键'ALIENTEK'

                case 34:									
								b=2;								
								wheel();
                    break;//按键'LEFT'

                case 2:
                num = smg_num[17];
								a=0;
								b=0;
								c=0;
								d=0;
								wheel();
								   break;//按键'PLAY'

                case 194:									
								c=1;
								wheel();
                    break;//按键'RIGHT'

                case 224:
								c=2;
								wheel();
                    break;//按键'VOL-'

                case 168:
								d=1;
								wheel();
                    break;//按键'DOWN'

                case 144:
								d=2;
								wheel();
                    break;//按键'VOL+'
            }
        }
        
        if (smg_wei == 6) //数码管位
        {
            smg_duan = num1;
        }
        else if (smg_wei == 7)
        {
            smg_duan = num;
        }

        if (smg_flag) LED_Write_Data(0x00, smg_wei); //消除鬼影(段码不显示)
        else 	  LED_Write_Data(smg_duan, smg_wei); //正常显示

        LED_Refresh();//数码管数据更新
        smg_flag = !smg_flag;

        if (smg_flag == 0) //正常显示才更新位码
        {
            smg_wei++;

            if (smg_wei == 8) smg_wei = 6;
        }

        t++;

        if (t == 250) 
        {
            t = 0;
            
        }
    }
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

路易斯720

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

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

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

打赏作者

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

抵扣说明:

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

余额充值