国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標(biāo)題: 基于STM32單片機(jī)紅外遙控智能小車(chē)程序 [打印本頁(yè)]

作者: 路漫漫    時(shí)間: 2020-6-9 01:29
標(biāo)題: 基于STM32單片機(jī)紅外遙控智能小車(chē)程序
本項(xiàng)目采用STM32單片機(jī)和L298電機(jī)驅(qū)動(dòng)模塊,簡(jiǎn)單連線制作;后期會(huì)加入避障和循跡功能;
1.硬件選型


2.源程序
主函數(shù)
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"     
#include "remote.h"
#include "motorcon.h"
#include "exti.h"
#include "beep.h"
/************************************************
開(kāi)發(fā)板:STM32F10x+L298N直流電機(jī)驅(qū)動(dòng)器
項(xiàng)目名稱(chēng):基于STM32紅外遙控智能小車(chē)設(shè)計(jì)  
功能:1.紅外遙控小車(chē)前進(jìn)、后退,左轉(zhuǎn)彎、右轉(zhuǎn)彎
       2.小車(chē)前進(jìn)后退0-10檔加減速、指定檔位變速
端口定義:IN1--GPIOC_pin0
           IN2--GPIOC_pin1
                     IN3--GPIOC_pin2
                     IN4--GPIOC_pin3
                     ENA--GPIOF_pin0
                     ENB--GPIOF_pin1
                     STM32電源---VCC 3.3V
    電源配置:直流電機(jī)驅(qū)動(dòng)L298電源--VCC 6.0V
     特別注意:STM32單片機(jī)和L298N共地連接
日期:2020年6月4日,第一次
************************************************/

int main(void)
{     
      
    delay_init();             //延時(shí)函數(shù)初始化      
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級(jí)分組為組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
    uart_init(115200);         //串口初始化為115200
     LED_Init();                 //LED端口初始化
    LCD_Init();   
    KEY_Init();         
    Remote_Init();            //紅外接收初始化            
  Motor_IOconfig();  //電機(jī)端口初始化
    BEEP_Init();             //初始化蜂鳴器IO
    EXTIX_Init();             //初始化外部中斷輸入
     
     POINT_COLOR=RED;        //設(shè)置字體為紅色
    LCD_ShowString(30,50,200,16,16,"STM32+L289N");
    LCD_ShowString(30,70,200,16,16,"REMOTE INTELLIGENCE CAR");   
    LCD_ShowString(30,90,200,16,16,"PARAMETER DISPLAY");
    LCD_ShowString(30,110,200,16,16,"2020/6/4");

       LCD_ShowString(30,130,200,16,16,"KEYVALA:");   
       LCD_ShowString(30,150,200,16,16,"KEYCONT:");   
       LCD_ShowString(30,170,200,16,16,"SYMBOLY:");     
    LCD_ShowString(30,190,200,16,16,"SPEED LEVEL:");            
    while(1)
    {
            
            if(flagforward==1)
            {motor_Sforward();}
            if(flagback==1)
            {motor_Sback();}
//            if(flagleft==1)
//            {motor_left();}
//            if(flagright==1)
//            {motor_right();}
//            if(flagstop==1)
//            {motor_stop();}   
    }
}
頭文件exti.h

#ifndef __EXTI_H
#define __EXIT_H     
#include "sys.h"
        
void EXTIX_Init(void);//外部中斷初始化   

extern u8 flagforward,flagback;//flagleft,flagright,flagstop;
extern u8 num,di_num,gao_num;
#endif
源程序exti.c

#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
#include "beep.h"
#include "remote.h"
#include "lcd.h"
#include "motorcon.h"

//外部中斷0服務(wù)程序,0-15位IO中斷

void EXTIX_Init(void)
{

       EXTI_InitTypeDef EXTI_InitStructure;
       NVIC_InitTypeDef NVIC_InitStructure;

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //使能復(fù)用功能時(shí)鐘

   //GPIOB.9      中斷線以及中斷初始化配置 下降沿觸發(fā) //REMOTE IN
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//GPIO與中斷線的映射關(guān)系
      EXTI_InitStructure.EXTI_Line=EXTI_Line9;    //中斷線9,取值范圍為0-15
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    //中斷模式
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿觸發(fā)中斷
      EXTI_Init(&EXTI_InitStructure);     

   //NVIC中斷優(yōu)先級(jí)設(shè)置
      NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;            //使能紅外接收二極管所對(duì)應(yīng)的外部中斷通道
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;    //搶占優(yōu)先級(jí)2,
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                    //子優(yōu)先級(jí)0
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中斷通道
      NVIC_Init(&NVIC_InitStructure);

  

}
u8 key;
u8 flagforward=0,flagback=0;//flagleft=0,flagright=0,flagstop=0;
u8 num=0,di_num=10,gao_num=0;
//外部中斷9服務(wù)程序 ,中斷線5-9
void EXTI9_5_IRQHandler(void)
{
   
    if(EXTI_GetITStatus(EXTI_Line9)!=RESET) //判斷某個(gè)中斷線是否有中斷產(chǎn)生
    {
      u8 *str=0;           //***定義字符換指針str**//
        key=Remote_Scan();   //接收紅外發(fā)送數(shù)值
        if(key)
        {     
            LCD_ShowNum(86,130,key,3,16);        //顯示鍵值
            LCD_ShowNum(86,150,RmtCnt,3,16);    //顯示按鍵次數(shù)         
            switch(key)
            {
                case 0:str="ERROR";break;               
                case 162:str="POWER";    //停車(chē)
                       //  flagstop=1;
                motor_stop();
                         break;        
                case 98:str="UP";  
                flagforward=1,flagback=0;  //前進(jìn)
                        break;        
                case 2:str="PLAY";break;         
                case 226:str="ALIENTEK";break;         
                case 194:str="RIGHT";  //右轉(zhuǎn)
                      //   flagright=1,flagleft=0;
               motor_right();               
                break;      
                case 34:str="LEFT";   //左轉(zhuǎn)
                      //  flagleft=1,flagright=0;  
                motor_left();               
                        break;         
                case 224:str="VOL-";  //減速
                         if(num!=0)
                                     num--;
                                 else
                                     num=0;
                                 motor_reddisp();
                         break;         
                case 168:str="DOWN";    //后退
                                 flagback=1,flagforward=0;
                                 break;           
                case 144:str="VOL+";  //加速
                                 num++;
                                 if(num==10)
                                     num=10;
                                 motor_reddisp();
                                 break;        
                                 
                case 104:str="1";num=0;gao_num=0;di_num=10;break;         //指定檔位
                case 152:str="2";num=1;gao_num=1;di_num=9;break;      
                case 176:str="3";num=2;gao_num=2;di_num=8;break;        
                case 48:str="4";num=3;gao_num=3;di_num=7;break;            
                case 24:str="5";num=4;gao_num=4;di_num=6;break;            
                case 122:str="6";num=5;gao_num=5;di_num=5;break;         
                case 16:str="7";num=6;gao_num=6;di_num=4;break;                                   
                case 56:str="8";num=7;gao_num=7;di_num=3;break;     
                case 90:str="9";num=8;gao_num=8;di_num=2;break;
                case 66:str="0";num=9;gao_num=9;di_num=1;break;
                case 82:str="DELETE";num=10;gao_num=10;di_num=0;break;         
            }
            LCD_Fill(86,170,116+8*8,170+16,WHITE);    //清楚之前的顯示
            LCD_ShowString(86,170,200,16,16,str);    //顯示SYMBOLY
            LCD_ShowNum(86,190,num,3,16);    //顯示按鍵次數(shù)   
            
        }
        BEEP=!BEEP;   
        EXTI_ClearITPendingBit(EXTI_Line9); //清除LINE0上的中斷標(biāo)志位  
    }
   
}
源文件motorcon.h

#ifndef _MOTORCON_H
#define _MOTORCON_H
#include "sys.h"

#define uint unsigned int
#define uchar unsigned char

#define IN1 PCout(0)
#define IN2 PCout(1)
#define IN3 PCout(2)
#define IN4 PCout(3)
#define ENA PFout(0)
#define ENB PFout(1)

void Motor_IOconfig(void);   
void motor_Sforward(void);
void motor_Sback(void);
void motor_left(void);
void motor_right(void);
void motor_stop(void);
void motor_redkchange(void);
void motor_reddisp(void);

#endif
源程序motorcon.c
#include "motorcon.h"
extern u8 num,di_num,gao_num;
void Motor_IOconfig()
{
     GPIO_InitTypeDef  GPIO_InitStructure;     
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOF,ENABLE);     //使能GPIOC和GPIOF端口時(shí)鐘
            
         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;    //GPIOC端口配置
         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;          //推挽輸出
         GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;         //IO口速度為50MHz
         GPIO_Init(GPIOC, &GPIO_InitStructure);               
       GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);   
       //GPIO_C的0,1,2,3端口初始化為低電平,即IN1-IN4端口
   
       GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;//設(shè)置引腳模式為推免輸出模式,,IO口速度為50MHz
       GPIO_Init(GPIOF,&GPIO_InitStructure);
       GPIO_ResetBits(GPIOF,GPIO_Pin_0|GPIO_Pin_1);    //GPIO_F的0,1端口初始化為低電平,即ENA端口
}

/*電機(jī)前進(jìn)函數(shù)*/
void motor_Sforward()
{
    uchar i;
      IN1=1;
      IN2=0;
   
            for(i=0;i<di_num;i++)
            {
                ENA=0; //PWM低電平輸出
            }         
      for(i=0;i<gao_num;i++)
            {
               ENA=1; //PWM高電平輸出
            }
        
}

/*電機(jī)后退函數(shù)*/
void motor_Sback()
{
   uchar i;
     IN1=0;
     IN2=1;
     for(i=0;i<di_num;i++)
    {
       ENA=0;
    }
    for(i=0;i<gao_num;i++)
    {
       ENA=1;
    }
}

/*左轉(zhuǎn)彎函數(shù)*/
void motor_left()
{
     ENB=1;
    IN3=0;
    IN4=1;
   
}   
/*右轉(zhuǎn)彎函數(shù)*/
void motor_right()
{
    ENB=1;
    IN3=1;
    IN4=0;
   
}
/*電機(jī)停止函數(shù)*/
void motor_stop()
{
    ENA=0;
      ENB=0;
}

/*紅外數(shù)據(jù)處理函數(shù)*/
void motor_reddisp()
{

    switch(num)
   {
      case 0:
             gao_num=0;      //高電平持續(xù)時(shí)間為1,低電平為3
             di_num=10;
             break;
      case 1:
             gao_num=1;     //高電平持續(xù)時(shí)間為8,低電平持續(xù)時(shí)間為2
             di_num=9;
             break;
     case 2:
            gao_num=2;    //高電平持續(xù)時(shí)間為7,低電平持續(xù)時(shí)間為3
            di_num=8;
            break;
    case 3:
           gao_num=3;  //高電平持續(xù)時(shí)間為6,低電平持續(xù)時(shí)間為4
           di_num=7;
           break;
    case 4:
           gao_num=4;  //高電平持續(xù)時(shí)間為5,低電平持續(xù)時(shí)間為5
           di_num=6;
           break;
    case 5:
           gao_num=5;  //高電平持續(xù)時(shí)間為4,低電平持續(xù)時(shí)間為0
           di_num=5;
           break;
    case 6:
           gao_num=6;  //高電平持續(xù)時(shí)間為6,低電平持續(xù)時(shí)間為4
           di_num=4;
           break;
    case 7:
           gao_num=7;  //高電平持續(xù)時(shí)間為7,低電平持續(xù)時(shí)間為3
           di_num=3;
           break;
    case 8:
           gao_num=8;  //高電平持續(xù)時(shí)間為8,低電平持續(xù)時(shí)間為2
           di_num=2;
           break;
    case 9:
           gao_num=9;  //高電平持續(xù)時(shí)間為9,低電平持續(xù)時(shí)間為1
           di_num=1;
           break;
    case 10:
           gao_num=10;  //高電平持續(xù)時(shí)間為10,低電平持續(xù)時(shí)間為0
           di_num=0;
           break;
   }
}






歡迎光臨 ELEOK (http://www.afoofa.cn/) Powered by Discuz! X5.0