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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4783|回復: 3
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:475371 發表于 2020-6-8 15:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 flytohign 于 2020-6-9 10:23 編輯

本項目采用STM32單片機和L298電機驅動模塊,簡單連線制作;后期會加入避障和循跡功能;/************************************************
開發板:STM32F10x+L298N直流電機驅動器
項目名稱:基于STM32紅外遙控智能小車設計
功能:1.紅外遙控小車前進、后退,左轉彎、右轉彎
2.小車前進后退0-10檔加減速、指定檔位變速
端口定義:IN1--GPIOC_pin0
IN2--GPIOC_pin1
IN3--GPIOC_pin2
IN4--GPIOC_pin3
ENA--GPIOF_pin0
ENB--GPIOF_pin1
STM32電源---VCC 3.3V
電源配置:直流電機驅動L298電源--VCC 6.0V
特別注意:電機驅動和單片機分別供電,要特別主要STM32單片機和L298N共地連接
                這個我開始沒注意,花費了不少時間
日期:2020年6月4日,第一次
************************************************/
1.硬件選型

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

2.源程序
主函數
  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. 開發板:STM32F10x+L298N直流電機驅動器
  13. 項目名稱:基于STM32紅外遙控智能小車設計  
  14. <font color="#ff0000">功能:1.紅外遙控小車前進、后退,左轉彎、右轉彎
  15.        2.小車前進后退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.     電源配置:直流電機驅動L298電源--VCC 6.0V
  24.      特別注意:STM32單片機和L298N共地連接
  25. 日期:2020年6月4日,第一次
  26. ************************************************/

  27. int main(void)
  28. {     
  29.       
  30.     delay_init();             //延時函數初始化      
  31.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
  32.     uart_init(115200);         //串口初始化為115200
  33.      LED_Init();                 //LED端口初始化
  34.     LCD_Init();   
  35.     KEY_Init();         
  36.     Remote_Init();            //紅外接收初始化            
  37.   Motor_IOconfig();  //電機端口初始化
  38.     BEEP_Init();             //初始化蜂鳴器IO
  39.     EXTIX_Init();             //初始化外部中斷輸入
  40.      
  41.      POINT_COLOR=RED;        //設置字體為紅色
  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. }
復制代碼


頭文件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
復制代碼


源程序exti.c
中斷程序,采用重映射功能將紅外接收端口映射到中斷線;這一步很重要;
然后根據中斷函數的紅外接收號,執行相應功能;
這里特別注意前進和后退的中斷識別設計,采用flagforward,flagback標志位來標記前進和后退指令;
這一步想了好久,不這樣的話前進和后退 小車沒反應;
  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服務程序,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);    //使能復用功能時鐘

  16.    //GPIOB.9      中斷線以及中斷初始化配置 下降沿觸發 //REMOTE IN
  17.       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);//GPIO與中斷線的映射關系
  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;//下降沿觸發中斷
  21.       EXTI_Init(&EXTI_InitStructure);     

  22.    //NVIC中斷優先級設置
  23.       NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;            //使能紅外接收二極管所對應的外部中斷通道
  24.       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;    //搶占優先級2,
  25.       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                    //子優先級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服務程序 ,中斷線5-9
  34. void EXTI9_5_IRQHandler(void)
  35. {
  36.    
  37.     if(EXTI_GetITStatus(EXTI_Line9)!=RESET) //判斷某個中斷線是否有中斷產生
  38.     {
  39.       u8 *str=0;           //***定義字符換指針str**//
  40.         key=Remote_Scan();   //接收紅外發送數值
  41.         if(key)
  42.         {     
  43.             LCD_ShowNum(86,130,key,3,16);        //顯示鍵值
  44.             LCD_ShowNum(86,150,RmtCnt,3,16);    //顯示按鍵次數         
  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;  //前進
  54.                         break;        
  55.                 case 2:str="PLAY";break;         
  56.                 case 226:str="ALIENTEK";break;         
  57.                 case 194:str="RIGHT";  //右轉
  58.                       //   flagright=1,flagleft=0;
  59.                motor_right();               
  60.                 break;      
  61.                 case 34:str="LEFT";   //左轉
  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);    //顯示按鍵次數   
  97.             
  98.         }
  99.         BEEP=!BEEP;   
  100.         EXTI_ClearITPendingBit(EXTI_Line9); //清除LINE0上的中斷標志位  
  101.     }
  102.    
  103. }
復制代碼


源文件motorcon.h
定義了一些端口;
還有電機控制函數;
  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
復制代碼


源程序motorcon.c
這一步為核心控制環節;
分別設計了前進和后退的PWM控制函數。實現小車 的前進后退的變速運行;
檔位可能具體數值有問題,但是能基本實現變速調節;效果不錯;
  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端口時鐘
  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;//設置引腳模式為推免輸出模式,,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. /*電機前進函數*/
  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. /*電機后退函數*/
  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. /*左轉彎函數*/
  52. void motor_left()
  53. {
  54.      ENB=1;
  55.     IN3=0;
  56.     IN4=1;
  57.    
  58. }   
  59. /*右轉彎函數*/
  60. void motor_right()
  61. {
  62.     ENB=1;
  63.     IN3=1;
  64.     IN4=0;
  65.    
  66. }
  67. /*電機停止函數*/
  68. void motor_stop()
  69. {
  70.     ENA=0;
  71.       ENB=0;
  72. }

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

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


硬件實物設計
實物很簡單,通過一個L298驅動器驅動前后輪,前輪轉向,后輪驅動前進后退;
在加入任一單片機控制器就可以制作了。要實現變檔,估計單純的51/52單片機很難實現。



復制代碼









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

使用道具 舉報

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

好的,給我點時間哈,我盡量補全
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线色网 | 久久精品成人热国产成 | 91一区二区 | 欧美色欧美亚洲另类七区 | 亚洲第一av| 成人毛片视频免费 | 成人免费在线视频 | 一区二区三区免费网站 | 精品在线观看一区二区 | 成人欧美一区二区三区在线观看 | 日韩免费一区 | 91精品一区| 国产免费一区二区三区 | av一区二区三区在线观看 | 91偷拍精品一区二区三区 | 久久精品一级 | 午夜影院在线播放 | 亚洲欧美国产精品一区二区 | 欧美一区二区三区一在线观看 | 午夜a级理论片915影院 | 久久精品亚洲精品国产欧美kt∨ | 久久99精品久久久 | 午夜理伦三级理论三级在线观看 | 波多野结衣中文字幕一区二区三区 | 日韩av成人在线观看 | 91人人澡人人爽 | 成人精品一区 | 国产午夜精品视频 | 久草电影网 | 午夜不卡福利视频 | 热久久免费视频 | 91观看 | 久久av网 | 日韩av免费在线电影 | 色偷偷888欧美精品久久久 | 精品国产伦一区二区三区观看说明 | 狠狠爱免费视频 | 97国产一区二区 | 日皮视频免费 | 正在播放一区二区 | 日韩视频在线一区 |