久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4803|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

基于STM32單片機(jī)紅外遙控智能小車程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:475371 發(fā)表于 2020-6-8 15:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 flytohign 于 2020-6-9 10:23 編輯

本項(xiàng)目采用STM32單片機(jī)和L298電機(jī)驅(qū)動(dòng)模塊,簡(jiǎn)單連線制作;后期會(huì)加入避障和循跡功能;/************************************************
開發(fā)板:STM32F10x+L298N直流電機(jī)驅(qū)動(dòng)器
項(xiàng)目名稱:基于STM32紅外遙控智能小車設(shè)計(jì)
功能:1.紅外遙控小車前進(jìn)、后退,左轉(zhuǎn)彎、右轉(zhuǎn)彎
2.小車前進(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
特別注意:電機(jī)驅(qū)動(dòng)和單片機(jī)分別供電,要特別主要STM32單片機(jī)和L298N共地連接
                這個(gè)我開始沒注意,花費(fèi)了不少時(shí)間
日期:2020年6月4日,第一次
************************************************/
1.硬件選型

由于程序設(shè)計(jì)過程中涉及第三方代碼,我貼出我自己設(shè)計(jì)的主要函數(shù),應(yīng)該很容易能夠搭建項(xiàng)目的;
主要設(shè)計(jì)函數(shù)就是我定義的motorcon.h和motorcon.c文件,包括一些紅外小車的前進(jìn)、后退、左轉(zhuǎn)和右轉(zhuǎn),暫停等;
在中斷函數(shù)exti.c和exti.h中完成紅外遙控信號(hào)的識(shí)別,并數(shù)據(jù)處理;

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

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

  46.        LCD_ShowString(30,130,200,16,16,"KEYVALA:");   
  47.        LCD_ShowString(30,150,200,16,16,"KEYCONT:");   
  48.        LCD_ShowString(30,170,200,16,16,"SYMBOLY:");     
  49.     LCD_ShowString(30,190,200,16,16,"SPEED LEVEL:");            
  50.     while(1)
  51.     {
  52.             
  53.             if(flagforward==1)
  54.             {motor_Sforward();}
  55.             if(flagback==1)
  56.             {motor_Sback();}
  57. //            if(flagleft==1)
  58. //            {motor_left();}
  59. //            if(flagright==1)
  60. //            {motor_right();}
  61. //            if(flagstop==1)
  62. //            {motor_stop();}   
  63.     }
  64. }
復(fù)制代碼


頭文件exti.h
定義了外部變量flagforward,flagback和num,di_num,gao_num
  1. #ifndef __EXTI_H
  2. #define __EXIT_H     
  3. #include "sys.h"
  4.         
  5. void EXTIX_Init(void);//外部中斷初始化   

  6. extern u8 flagforward,flagback;//flagleft,flagright,flagstop;
  7. extern u8 num,di_num,gao_num;
  8. #endif
復(fù)制代碼


源程序exti.c
中斷程序,采用重映射功能將紅外接收端口映射到中斷線;這一步很重要;
然后根據(jù)中斷函數(shù)的紅外接收號(hào),執(zhí)行相應(yīng)功能;
這里特別注意前進(jìn)和后退的中斷識(shí)別設(shè)計(jì),采用flagforward,flagback標(biāo)志位來(lái)標(biāo)記前進(jìn)和后退指令;
這一步想了好久,不這樣的話前進(jìn)和后退 小車沒反應(yīng);
  1. #include "exti.h"
  2. #include "led.h"
  3. #include "key.h"
  4. #include "delay.h"
  5. #include "usart.h"
  6. #include "beep.h"
  7. #include "remote.h"
  8. #include "lcd.h"
  9. #include "motorcon.h"

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

  11. void EXTIX_Init(void)
  12. {

  13.        EXTI_InitTypeDef EXTI_InitStructure;
  14.        NVIC_InitTypeDef NVIC_InitStructure;

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

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

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

  28.   

  29. }
  30. u8 key;
  31. u8 flagforward=0,flagback=0;//flagleft=0,flagright=0,flagstop=0;
  32. u8 num=0,di_num=10,gao_num=0;
  33. //外部中斷9服務(wù)程序 ,中斷線5-9
  34. void EXTI9_5_IRQHandler(void)
  35. {
  36.    
  37.     if(EXTI_GetITStatus(EXTI_Line9)!=RESET) //判斷某個(gè)中斷線是否有中斷產(chǎn)生
  38.     {
  39.       u8 *str=0;           //***定義字符換指針str**//
  40.         key=Remote_Scan();   //接收紅外發(fā)送數(shù)值
  41.         if(key)
  42.         {     
  43.             LCD_ShowNum(86,130,key,3,16);        //顯示鍵值
  44.             LCD_ShowNum(86,150,RmtCnt,3,16);    //顯示按鍵次數(shù)         
  45.             switch(key)
  46.             {
  47.                 case 0:str="ERROR";break;               
  48.                 case 162:str="POWER";    //停車
  49.                        //  flagstop=1;
  50.                 motor_stop();
  51.                          break;        
  52.                 case 98:str="UP";  
  53.                 flagforward=1,flagback=0;  //前進(jìn)
  54.                         break;        
  55.                 case 2:str="PLAY";break;         
  56.                 case 226:str="ALIENTEK";break;         
  57.                 case 194:str="RIGHT";  //右轉(zhuǎn)
  58.                       //   flagright=1,flagleft=0;
  59.                motor_right();               
  60.                 break;      
  61.                 case 34:str="LEFT";   //左轉(zhuǎn)
  62.                       //  flagleft=1,flagright=0;  
  63.                 motor_left();               
  64.                         break;         
  65.                 case 224:str="VOL-";  //減速
  66.                          if(num!=0)
  67.                                      num--;
  68.                                  else
  69.                                      num=0;
  70.                                  motor_reddisp();
  71.                          break;         
  72.                 case 168:str="DOWN";    //后退
  73.                                  flagback=1,flagforward=0;
  74.                                  break;           
  75.                 case 144:str="VOL+";  //加速
  76.                                  num++;
  77.                                  if(num==10)
  78.                                      num=10;
  79.                                  motor_reddisp();
  80.                                  break;        
  81.                                  
  82.                 case 104:str="1";num=0;gao_num=0;di_num=10;break;         //指定檔位
  83.                 case 152:str="2";num=1;gao_num=1;di_num=9;break;      
  84.                 case 176:str="3";num=2;gao_num=2;di_num=8;break;        
  85.                 case 48:str="4";num=3;gao_num=3;di_num=7;break;            
  86.                 case 24:str="5";num=4;gao_num=4;di_num=6;break;            
  87.                 case 122:str="6";num=5;gao_num=5;di_num=5;break;         
  88.                 case 16:str="7";num=6;gao_num=6;di_num=4;break;                                   
  89.                 case 56:str="8";num=7;gao_num=7;di_num=3;break;     
  90.                 case 90:str="9";num=8;gao_num=8;di_num=2;break;
  91.                 case 66:str="0";num=9;gao_num=9;di_num=1;break;
  92.                 case 82:str="DELETE";num=10;gao_num=10;di_num=0;break;         
  93.             }
  94.             LCD_Fill(86,170,116+8*8,170+16,WHITE);    //清楚之前的顯示
  95.             LCD_ShowString(86,170,200,16,16,str);    //顯示SYMBOLY
  96.             LCD_ShowNum(86,190,num,3,16);    //顯示按鍵次數(shù)   
  97.             
  98.         }
  99.         BEEP=!BEEP;   
  100.         EXTI_ClearITPendingBit(EXTI_Line9); //清除LINE0上的中斷標(biāo)志位  
  101.     }
  102.    
  103. }
復(fù)制代碼


源文件motorcon.h
定義了一些端口;
還有電機(jī)控制函數(shù);
  1. #ifndef _MOTORCON_H
  2. #define _MOTORCON_H
  3. #include "sys.h"

  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. #define IN1 PCout(0)
  7. #define IN2 PCout(1)
  8. #define IN3 PCout(2)
  9. #define IN4 PCout(3)
  10. #define ENA PFout(0)
  11. #define ENB PFout(1)

  12. void Motor_IOconfig(void);   
  13. void motor_Sforward(void);
  14. void motor_Sback(void);
  15. void motor_left(void);
  16. void motor_right(void);
  17. void motor_stop(void);
  18. void motor_redkchange(void);
  19. void motor_reddisp(void);

  20. #endif
復(fù)制代碼


源程序motorcon.c
這一步為核心控制環(huán)節(jié);
分別設(shè)計(jì)了前進(jìn)和后退的PWM控制函數(shù)。實(shí)現(xiàn)小車 的前進(jìn)后退的變速運(yùn)行;
檔位可能具體數(shù)值有問題,但是能基本實(shí)現(xiàn)變速調(diào)節(jié);效果不錯(cuò);
  1. #include "motorcon.h"
  2. extern u8 num,di_num,gao_num;
  3. void Motor_IOconfig()
  4. {
  5.      GPIO_InitTypeDef  GPIO_InitStructure;     
  6.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOF,ENABLE);     //使能GPIOC和GPIOF端口時(shí)鐘
  7.             
  8.          GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;    //GPIOC端口配置
  9.          GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;          //推挽輸出
  10.          GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;         //IO口速度為50MHz
  11.          GPIO_Init(GPIOC, &GPIO_InitStructure);               
  12.        GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);   
  13.        //GPIO_C的0,1,2,3端口初始化為低電平,即IN1-IN4端口
  14.    
  15.        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;//設(shè)置引腳模式為推免輸出模式,,IO口速度為50MHz
  16.        GPIO_Init(GPIOF,&GPIO_InitStructure);
  17.        GPIO_ResetBits(GPIOF,GPIO_Pin_0|GPIO_Pin_1);    //GPIO_F的0,1端口初始化為低電平,即ENA端口
  18. }

  19. /*電機(jī)前進(jìn)函數(shù)*/
  20. void motor_Sforward()
  21. {
  22.     uchar i;
  23.       IN1=1;
  24.       IN2=0;
  25.    
  26.             for(i=0;i<di_num;i++)
  27.             {
  28.                 ENA=0; //PWM低電平輸出
  29.             }         
  30.       for(i=0;i<gao_num;i++)
  31.             {
  32.                ENA=1; //PWM高電平輸出
  33.             }
  34.         
  35. }

  36. /*電機(jī)后退函數(shù)*/
  37. void motor_Sback()
  38. {
  39.    uchar i;
  40.      IN1=0;
  41.      IN2=1;
  42.      for(i=0;i<di_num;i++)
  43.     {
  44.        ENA=0;
  45.     }
  46.     for(i=0;i<gao_num;i++)
  47.     {
  48.        ENA=1;
  49.     }
  50. }

  51. /*左轉(zhuǎn)彎函數(shù)*/
  52. void motor_left()
  53. {
  54.      ENB=1;
  55.     IN3=0;
  56.     IN4=1;
  57.    
  58. }   
  59. /*右轉(zhuǎn)彎函數(shù)*/
  60. void motor_right()
  61. {
  62.     ENB=1;
  63.     IN3=1;
  64.     IN4=0;
  65.    
  66. }
  67. /*電機(jī)停止函數(shù)*/
  68. void motor_stop()
  69. {
  70.     ENA=0;
  71.       ENB=0;
  72. }

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

  76.     switch(num)
  77.    {
  78.       case 0:
  79.              gao_num=0;      //高電平持續(xù)時(shí)間為1,低電平為3
  80.              di_num=10;
  81.              break;
  82.       case 1:
  83.              gao_num=1;     //高電平持續(xù)時(shí)間為8,低電平持續(xù)時(shí)間為2
  84.              di_num=9;
  85.              break;
  86.      case 2:
  87.             gao_num=2;    //高電平持續(xù)時(shí)間為7,低電平持續(xù)時(shí)間為3
  88.             di_num=8;
  89.             break;
  90.     case 3:
  91.            gao_num=3;  //高電平持續(xù)時(shí)間為6,低電平持續(xù)時(shí)間為4
  92.            di_num=7;
  93.            break;
  94.     case 4:
  95.            gao_num=4;  //高電平持續(xù)時(shí)間為5,低電平持續(xù)時(shí)間為5
  96.            di_num=6;
  97.            break;
  98.     case 5:
  99.            gao_num=5;  //高電平持續(xù)時(shí)間為4,低電平持續(xù)時(shí)間為0
  100.            di_num=5;
  101.            break;
  102.     case 6:
  103.            gao_num=6;  //高電平持續(xù)時(shí)間為6,低電平持續(xù)時(shí)間為4
  104.            di_num=4;
  105.            break;
  106.     case 7:
  107.            gao_num=7;  //高電平持續(xù)時(shí)間為7,低電平持續(xù)時(shí)間為3
  108.            di_num=3;
  109.            break;
  110.     case 8:
  111.            gao_num=8;  //高電平持續(xù)時(shí)間為8,低電平持續(xù)時(shí)間為2
  112.            di_num=2;
  113.            break;
  114.     case 9:
  115.            gao_num=9;  //高電平持續(xù)時(shí)間為9,低電平持續(xù)時(shí)間為1
  116.            di_num=1;
  117.            break;
  118.     case 10:
  119.            gao_num=10;  //高電平持續(xù)時(shí)間為10,低電平持續(xù)時(shí)間為0
  120.            di_num=0;
  121.            break;
  122.    }
  123. }
復(fù)制代碼


硬件實(shí)物設(shè)計(jì)
實(shí)物很簡(jiǎn)單,通過一個(gè)L298驅(qū)動(dòng)器驅(qū)動(dòng)前后輪,前輪轉(zhuǎn)向,后輪驅(qū)動(dòng)前進(jìn)后退;
在加入任一單片機(jī)控制器就可以制作了。要實(shí)現(xiàn)變檔,估計(jì)單純的51/52單片機(jī)很難實(shí)現(xiàn)。



復(fù)制代碼









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:475371 發(fā)表于 2020-6-8 22:41 | 只看該作者
admin 發(fā)表于 2020-6-8 22:12
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)

好的,給我點(diǎn)時(shí)間哈,我盡量補(bǔ)全
回復(fù)

使用道具 舉報(bào)

板凳
ID:249746 發(fā)表于 2020-6-30 21:45 | 只看該作者
有原理圖和代碼嗎?正在搞這個(gè),大家交流一下?
回復(fù)

使用道具 舉報(bào)

地板
ID:1053168 發(fā)表于 2022-11-21 16:35 | 只看該作者
朋友為什么按照你的代碼做了,為什么#include "motorcon.h" 這個(gè)函數(shù) 旁邊是紅色的x啊??
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品欧美乱码久久久久久1区2区 | 98久久 | 亚洲免费在线 | 欧美福利视频 | 色站综合 | 亚洲欧美激情网 | 精品国产一区二区三区久久久蜜月 | 中文字幕在线视频免费视频 | 精品国产乱码久久久久久影片 | a级在线 | 激情国产在线 | 国产黄色大片网站 | 欧美一级久久精品 | 三级成人片 | 精品国产高清一区二区三区 | 91视频电影 | 日本精品一区 | 成人av播放 | 91久久精品国产91久久性色tv | 日韩精品一区二区三区 | 国产成人亚洲精品自产在线 | 99精品欧美一区二区蜜桃免费 | 国产成人精品免费 | 久干网 | 国产一区三区在线 | 99re99| 亚洲高清在线观看 | av国产精品毛片一区二区小说 | 久久婷婷麻豆国产91天堂 | 亚洲精品久久久久avwww潮水 | 99精品久久久 | 亚洲精品日韩精品 | 国产精品69毛片高清亚洲 | 红桃成人在线 | 欧美激情久久久 | 亚洲精品电影在线观看 | 国产aaaaav久久久一区二区 | 欧美日韩在线观看视频 | 亚洲视频欧美视频 | 婷婷去俺也去 | 亚洲成人免费在线观看 |