标题: STM32F103AGV小车程序 [打印本页]

作者: ForrestWuuu    时间: 2019-6-22 22:21
标题: STM32F103AGV小车程序
功能:同时实现自主循迹、自动避障、红外遥控、舵机运动

单片机源程序如下:
  1. //连接方式 :请参考interface.h文件
  2. #include "stm32f10x.h"
  3. #include "interface.h"
  4. #include "LCD1602.h"
  5. #include "IRCtrol.h"
  6. #include "motor.h"
  7. #include "uart.h"
  8. #include "redvoid.h"
  9. #include "UltrasonicCtrol.h"

  10. //全局变量定义
  11. unsigned int speed_count=0;//占空比计数器 50次一周期
  12. char front_left_speed_duty=SPEED_DUTY;
  13. char front_right_speed_duty=SPEED_DUTY;
  14. char behind_left_speed_duty=SPEED_DUTY;
  15. char behind_right_speed_duty=SPEED_DUTY;

  16. unsigned char tick_5ms = 0;//5ms计数器,作为主函数的基本周期
  17. unsigned char tick_1ms = 0;//1ms计数器,作为电机的基本计数器
  18. unsigned char tick_200ms = 0;//刷新显示

  19. char ctrl_comm = COMM_STOP;//控制指令
  20. char ctrl_comm_last = COMM_STOP;//上一次的指令
  21. unsigned char continue_time=0;
  22. unsigned char bt_rec_flag=0;//蓝牙控制标志位

  23. unsigned char duoji_count=0;
  24. unsigned char zhuanjiao = 11;

  25. void DuojiMid()
  26. {
  27.         zhuanjiao = 12;
  28.         Delayms(300);
  29. }

  30. void DuojiRight()
  31. {
  32.         zhuanjiao = 14;
  33.         Delayms(300);
  34. }

  35. void DuojiLeft()
  36. {
  37.         zhuanjiao = 10;
  38.         Delayms(300);
  39. }

  40. //循迹,通过判断三个光电对管的状态来控制小车运动
  41. void SearchRun(void)
  42. {
  43.         //三路都检测到
  44.         if(SEARCH_M_IO == BLACK_AREA && SEARCH_L_IO == BLACK_AREA && SEARCH_R_IO == BLACK_AREA)
  45.         {
  46.                 ctrl_comm = COMM_UP;
  47.                 DuojiLeft();
  48.                 return;
  49.         }
  50.         if(VOID_R_IO == BARRIER_Y && VOID_L_IO == BARRIER_Y)
  51.         {
  52.                 VoidRun();
  53.         }
  54.         else if(VOID_L_IO == BARRIER_Y)
  55.         {
  56.                 VoidRun();
  57.         }
  58.         else if(VOID_R_IO == BARRIER_Y)
  59.         {
  60.                 VoidRun();
  61.         }
  62.         else if(SEARCH_R_IO == BLACK_AREA)//右
  63.         {
  64.                 ctrl_comm = COMM_RIGHT;
  65.         }
  66.         else if(SEARCH_L_IO == BLACK_AREA)//左
  67.         {
  68.                 ctrl_comm = COMM_LEFT;
  69.         }
  70.         else if(SEARCH_M_IO == BLACK_AREA)//中
  71.         {
  72.                 ctrl_comm = COMM_UP;
  73.         }
  74.         if(SEARCH_M_IO == WHITE_AREA && SEARCH_L_IO == WHITE_AREA && SEARCH_R_IO == WHITE_AREA)
  75.                 {
  76.                         continue_time--;//200ms 无接收指令就停车
  77.                         if(continue_time == 0)
  78.                         {
  79.                                 continue_time = 1;
  80.                                 CarStop();
  81.                         }
  82.                 if(ir_rec_flag == 1)//接收到红外信号
  83.                         {
  84.                                 ir_rec_flag = 0;
  85.                                 switch(ctrl_comm)
  86.                                 {
  87.                                         case COMM_UP:    CarGo();break;
  88.                                         case COMM_DOWN:  CarBack();break;
  89.                                         case COMM_LEFT:  CarLeft();break;
  90.                                         case COMM_RIGHT: CarRight();break;
  91.                                         case COMM_STOP:  CarStop();DuojiRight();break;
  92.                                         default : break;
  93.                                 }
  94.                                 LCD1602WriteCommand(ctrl_comm);
  95.                         }
  96.         }
  97. }


  98. int main(void)
  99. {
  100.         delay_init();
  101.         GPIOCLKInit();
  102.         UserLEDInit();
  103.         LCD1602Init();
  104.         IRCtrolInit();
  105.         TIM2_Init();
  106.         MotorInit();
  107.         ServoInit();
  108.        
  109.         RedRayInit();
  110.         //USART3Conf(9600);

  111. while(1)
  112. {         
  113.                          if(tick_5ms >= 5)
  114.                 {
  115.                         tick_5ms = 0;
  116.                         tick_200ms++;
  117.                         if(tick_200ms >= 40)
  118.                         {
  119.                                 tick_200ms = 0;
  120.                                 LEDToggle(LED_PIN);
  121.                         }
  122. //                        continue_time--;//200ms 无接收指令就停车
  123. //                        if(continue_time == 0)
  124. //                        {
  125. //                                continue_time = 1;
  126. //                                CarStop();
  127. //                        }
  128.                         //do something
  129.                         SearchRun();
  130.                         if(ctrl_comm_last != ctrl_comm)//指令发生变化
  131.                         {
  132.                                 ctrl_comm_last = ctrl_comm;
  133.                                 switch(ctrl_comm)
  134.                                 {
  135.                                         case COMM_UP:    CarGo();break;
  136.                                         case COMM_DOWN:  CarBack();break;
  137.                                         case COMM_LEFT:  CarLeft();break;
  138.                                         case COMM_RIGHT: CarRight();break;
  139.                                         case COMM_STOP:  CarStop();break;
  140.                                         default : break;
  141.                                 }
  142.                                 Delayms(10);//防抖
  143.                                 LCD1602WriteCommand(ctrl_comm);
  144.                         }
  145.                 }
  146.                
  147. }
  148. }
复制代码

所有资料51hei提供下载:
移动机器人.zip (5.58 MB, 下载次数: 73)



作者: 伊特    时间: 2019-8-2 18:42
谢谢,有没有连接图呐




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1