找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2497|回复: 0
收起左侧

STM32F103基于PS2手柄遥控小车

[复制链接]
ID:747099 发表于 2021-5-5 19:22 | 显示全部楼层 |阅读模式
接线图.jpg

单片机源程序如下:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"         
#include "pstwo.h"
#include "moto.h"
/*********************************************************
功能:通过PS2控制小车运动
硬件平台:STM32F103C8T6
时钟:8Mhz

硬件引脚分配:
//手柄接口
DI=PB12;        
DO=PB13 ;
CS=PB14;
CLK=PB15;

//L298N 电机驱动控制引脚
IN1=PA0;           //左侧电机正  
IN2=PA1;                //左侧电机负  
IN3=PA2;           //右侧电机正   
IN4=PA3;                //右侧电机负

LED = PC13;
**********************************************************/         
//#define go                         {IN1=1;IN2=0;IN3=0;IN4=1;}
//#define back                 {IN1=0;IN2=1;IN3=1;IN4=0;}
//#define stop                {IN1=1;IN2=1;IN3=1;IN4=1;}
//#define turnleft                {IN1=1;IN2=1;IN3=0;IN4=1;}
//#define turnright                {IN1=1;IN2=0;IN3=1;IN4=1;}



int speed;

char SysClock;       //申请存储系统时钟变量,单位MHz
char SystemClock_HSE(u8 PLL);
void MYRCC_DeInit(void);

int main(void)
{         
         u8 key=0;
        SystemClock_HSE(9);           //系统时钟初始化,时钟源外部晶振HSEs  8*9=72MHz;
        delay_init();                     //延时函数初始化         
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(9600);                 //串口初始化为9600
         LED_Init();                             //LED端口初始化
        PS2_Init();                                 
  //motor_Init();
        MotorInit();
        //printf("hello! \r\n");
        speed=10;
         
        while(1)
        {
        
                key=PS2_DataKey();
               
                 switch(key)
                 {
                         case 5:go;break;
                         case 7:back;break;
                         case 8:turnleft;break;
                         case 6:turnright;break;
                         case 9:LED_ON;break;
                         case 10:LED_OFF;break;
                         case 11:speed=(speed>=10)?10:speed+1;break;
                         case 12:speed=(speed<=0)?0:speed-1;break;
                        
                         default:stop;break;                        
                 }
                if(key!=0)                   //有按键按下
            {
                        printf("%d  is  pressed  \r\n",key);
            }
//                printf(" %5d %5d %5d %5d\r\n",PS2_AnologData(PSS_LX),PS2_AnologData(PSS_LY),
//                                              PS2_AnologData(PSS_RX),PS2_AnologData(PSS_RY) );
                  
       delay_ms(10);
        }                        
}



//不能在这里执行所有外设复位!否则至少引起串口不工作.                    
//把所有时钟寄存器复位                  
void MYRCC_DeInit(void)
{        
         RCC->APB1RSTR = 0x00000000;//复位结束                        
        RCC->APB2RSTR = 0x00000000;

  RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.         
  RCC->APB2ENR = 0x00000000; //外设时钟关闭.                           
  RCC->APB1ENR = 0x00000000;   
        RCC->CR |= 0x00000001;     //使能内部高速时钟HSION                                                                                                                                 
        RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]                                         
        RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
        RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP                     
        RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
        RCC->CIR = 0x00000000;     //关闭所有中断                 
}


/********************************************
           使用外部晶体作为系统时钟源
功能:
1.使用外部HSE时钟8M作为PLL输入
2.PLL倍频系数PLLMUL<=9(实际到达16时,还能正常倍频外部时钟)
3.输入参数:PLLMUL,PLL倍频系数
4.备注:官方手册上说,使用HSE作为系统时钟源时,最高可倍频到72MHz,但是实际可以倍频到128M系统还算稳定
********************************************/
//系统时钟初始化函数
//pll:选择的倍频数,从2开始,最大值为16               
//时钟源为外部晶振
//备注:当机身焊接了8M晶振时,就只能使用外部8M晶振作为时钟源,
//      用内部的HSI不好使,我反正没调出来,看各位有啥办法没
char SystemClock_HSE(u8 PLL)
{
        unsigned char temp=0;   
        MYRCC_DeInit();                    //复位并配置向量表
         RCC->CR|=1<<16;       //外部高速时钟使能HSEON
        while(!(RCC->CR>>17));//等待外部时钟就绪
        RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
        PLL-=2;//抵消2个单位
        RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
        RCC->CFGR|=1<<16;            //PLLSRC ON
        FLASH->ACR|=0x32;            //FLASH 2个延时周期
        RCC->CR|=0x01000000;  //PLLON
        while(!(RCC->CR>>25));//等待PLL锁定
        RCC->CFGR|=0x00000002;//PLL作为系统时钟         
        while(temp!=0x02)     //等待PLL作为系统时钟设置成功
        {   
                temp=RCC->CFGR>>2;
                temp&=0x03;
        }   

  SysClock=(PLL+2)*8;
  return SysClock;
}        

代码下载: 51黑论坛_基于STM32F103C8T6的PS2遥控小车源码及接线(已调).7z (443.59 KB, 下载次数: 30)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表