找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2435|回复: 3
打印 上一主题 下一主题
收起左侧

迷宫机器人的程序,基于stm32的开发板写的,用了pid算法

[复制链接]
跳转到指定楼层
楼主
ID:448250 发表于 2018-12-17 23:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "stm32f10x.h"
  2. #include "stdio.h"
  3. #include "delay.h"
  4. #include "tft.h"
  5. #include "math.h"
  6. #include "stm32_init.h"
  7. #include "motor.h"
  8. #include "pid.h"
  9. #include "math.h"

  10. #define pi 3.1415926535898
  11. #define TwoPi 6.2831853071796

  12. #define ZhiXing 1
  13. #define HouZhuan 2
  14. #define ZuoZhuan 3
  15. #define YouZhuan 4

  16. #define ZhengZhuan 0
  17. #define FanZhuan 1

  18. #define NoWall 0
  19. #define YouGenQiang 1
  20. #define ZuoGenQiang 2
  21. //#define ShuangGenQiang 3
  22. #define YouGenQiangXia 4
  23. #define ZuoGenQiangXia 5
  24. //#define ShuangGenQiangXia 6

  25. #define X_ZhengFangXiang 1
  26. #define Y_ZhengFangXiang 2
  27. #define X_FuFangXiang 3
  28. #define Y_FuFangXiang 4

  29. #define YiGeTime1  96000        //95000
  30. //#define YiGeTime2 94000
  31. #define YiGeTime3 99000

  32. #define BanGeTime1 47500

  33. #define ZhongDianZuoBiao 7

  34. #define Active 1
  35. #define Dead 2

  36. #define FenZhiID_MAX_3FangXiang 2
  37. #define FenZhiID_MAX_2FangXiang 1

  38. #define XunLu 0
  39. #define FanHui 1
  40. #define ChongCi 2

  41. #define YES 1
  42. #define NO 0

  43. #define XiuZhengZhuanWanYiGeTime 85000  //90000

  44. #define GenQiangYuZhi1 0x80
  45. #define GenQiangYuZhi2 0xff

  46. #define MAX_SuDu 400
  47. #define MIN_SuDu 500

  48. u16 tim2_count=0;//程序循环周期
  49. u16 shuju[4];//定义第一组、2、4、6、8
  50. u16 shuju1[4];//定义第二组、1、3、5、7
  51. u16 qian,hou,zuo,you,zuoshang,zuoxia,youshang,youxia;//&0xf00
  52. u16 youshang2,youxia2,zuoshang2,zuoxia2;//&0xfc0,0xf80
  53. u16 youshang3,youxia3,zuoshang3,zuoxia3;//

  54. u8 GenQiangFlag=0;//跟墙标志,做跟、右跟、双跟
  55. u8 YunXingFlag=0;//运行标志,直行、左转、右转、后转
  56. u8 QianJinFangXiang=0;//前进方向,Y正、Y负、X正、X负
  57. u8 XunLuFanHuiChongCiFlag=XunLu;//寻路返回冲刺标志

  58. u8 YiZouGuoGeShu=0;//已经走过的格数
  59. u8 FenZhiDuiZhan=0;//分支堆栈
  60. //u8 FenZhiID=0;//分支ID
  61. u8 FenZhiID_MAX=0;//分支ID的最大值
  62. u8 CunChuLuJingShuZuXiaBiao=0;//存储路径数组下标
  63. u8 ChongCiLuJingXiaBiao=0;//冲刺路径下标
  64. u32 YiGeTime_PanDuan=0;//判断一格的时间,默认为时间1,转弯后为时间2,下次满格变成时间3
  65. u8 LianXuZhiXing_Count=0;//判断是否连续直行,连续直行需要改变一格时间

  66. u8 YouShangGenQiang_YuZhi=0;//右上跟墙阈值
  67. u8 YouXiaGenQiang_YuZhi=0;//右下跟墙阈值
  68. u8 ZuoShangGenQiang_YuZhi=0;//左上跟墙阈值
  69. u8 ZuoXiaGenQiang_YuZhi=0;//左下跟墙阈值

  70. u8 YouShangGenQiang_Count=0;//右上跟墙计数
  71. u8 YouXiaGenQiang_Count=0;//右下跟墙计数
  72. u8 ZuoShangGenQiang_Count=0;//左上跟墙计数
  73. u8 ZuoXiaGenQiang_Count=0;//左下跟墙计数

  74. const u16 juli[201];//查表,速度与距离的关系
  75. const int sin_figure[451];

  76. u8 LuJingZuoBiao[128][2];//路径坐标
  77. u8 FenZhiDianZuoBiao[64][2];//分支点坐标
  78. u8 FenZhiID[64];//分支ID
  79. u8 FenZhiQiWangFangXiang[64][4]; //分支期望方向
  80. u8 LuJingQiWangFangXiang[1];//路径期望方向

  81. float zuolun=0;
  82. float youlun=0;
  83. u16 zuolunint=0;
  84. u16 youlunint=0;

  85. int x_point=0;
  86. int y_point=0;
  87. u32 zuolun_juli=0;
  88. u32 youlun_juli=0;

  89. u32 hecheng_juli=0;//合成距离

  90. u8 FenZhi_ZhiZhen=0;


  91. void CaiYang(void);
  92. void XianShiZhi(void);
  93. int ABS_2(int x);
  94. void QianXiangPanDuan(void);//前向判断
  95. void YouZhuanChuLi(void);
  96. void ZuoZhuanChuLi(void);
  97. void HouZhuanChuLi(void);
  98. void JiSuanZuoBiao(void);//计算坐标
  99. void QiBu_Init(void);//起步初始化
  100. void JiLuFenZhiDianJiXuanZeFangXiang(void);//记录分支点及选择方向
  101. void GenJuQiWangFangXiangJiSuanQianJinFangXiang(void);//根据期望方向计算前进方向
  102. void XianLuJing(void);//显示路径坐标
  103. void GenJuLuJingQiWangFangXiangJiSuanQianJinFangXiang(void);//根据路径期望方向计算前进方向
  104. void AnLuJingFanHui(void);//按路径返回
  105. void GenQiangZiChengXu(void);//跟墙子程序
  106. void AnLuJingChongCi(void);//按路径冲刺
  107. void ZhuanWanQianDaoWei(void);//转弯前到位
  108. void ChongCiQianXiangPanDuan(void);
  109. void QiBu_Init2(void);

  110. /******************************************************
  111. *入口参数:无
  112. *出口参数:无
  113. *功能:主函数
  114. ******************************************************/
  115. int main(void)
  116. {
  117.         
  118.         RCC_Configuration();//RCC配置
  119.         GPIO_Configuration();//GPIO配置
  120.         EXTI_Configuration();//初始化PA9外部中断
  121.         NVIC_Configuration();//嵌套向量中断控制器配置
  122.         TIM2_Int_Init(999,359);//tim2初始化
  123.         SPI_Configuration();
  124.         GPIO_SetBits(GPIOE,GPIO_Pin_15);//打开TFT电源
  125.         delay(0xffffff);//延时
  126.         Lcd_Init();//初始化TFT屏
  127.         LCD_Clear(0);//清屏显示黑色        
  128.         QiBu_Init();//起步初始化
  129.         
  130.         CaiYang();
  131.         while(qian>0x200)
  132.         {
  133.                 CaiYang();
  134.                 delay(10000);
  135.         }
  136.         
  137.         Init_Motor(400,ZhengZhuan,400,ZhengZhuan);//直行
  138.         delay(15000000);
  139.         
  140.         while(1)
  141.         {
  142.                 if(tim2_count>=20)//20*5ms=100ms
  143.                 {
  144.                         tim2_count=0;        

  145.                         if(YunXingFlag==ZhiXing)//2800//3300
  146.                         {
  147.                                 zuolun_juli = juli[zuolunint-400];
  148.                                 youlun_juli = juli[youlunint-400];
  149.                                 hecheng_juli += (zuolun_juli + youlun_juli);
  150.                         }
  151.                         if(hecheng_juli>YiGeTime_PanDuan)//
  152.                         {
  153.                                 hecheng_juli=0;                        
  154.                                 JiSuanZuoBiao();
  155.                         }
  156.                         CaiYang();
  157.                         if(XunLuFanHuiChongCiFlag==XunLu)//寻路
  158.                         {
  159.                                 QianXiangPanDuan();
  160.                         }
  161.                         else if(XunLuFanHuiChongCiFlag==ChongCi)
  162.                         {
  163.                                 ChongCiQianXiangPanDuan();
  164.                         }
  165.                 }
  166.         }
  167. }        
  168. /**********************冲刺前向判断***********************/
  169. void ChongCiQianXiangPanDuan(void)
  170. {
  171.         char msg[20];
  172.         if(qian>0x500)//qian zhuang qiang
  173.         {               
  174.                 if((you<0x200)&&(zuo<0x200))
  175.                 {
  176.                                 if(x_point==LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0])
  177.                                 {
  178.                                                 if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1]<y_point)
  179.                                                 {
  180.                                                         LuJingQiWangFangXiang[0]=Y_FuFangXiang;
  181.                                                 }
  182.                                                 else if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1]>y_point)
  183.                                                 {
  184.                                                         LuJingQiWangFangXiang[0]=Y_ZhengFangXiang;
  185.                                                 }
  186.                                 }
  187.                                 else if(y_point==LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1])
  188.                                 {
  189.                                                 if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0]<x_point)
  190.                                                 {
  191.                                                         LuJingQiWangFangXiang[0]=X_FuFangXiang;
  192.                                                 }
  193.                                                 else if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0]>x_point)
  194.                                                 {
  195.                                                         LuJingQiWangFangXiang[0]=X_ZhengFangXiang;
  196.                                                 }
  197.                                 }
  198.                                 else
  199.                                 {
  200.                                         Off_Motor(3);
  201.                                         LCD_ShowString(0,0,"cuo wu");
  202.                                        
  203.                                         sprintf(msg,"x_zb=%1d",LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0]);
  204.                                         LCD_ShowString(0,96,msg);
  205.                                         sprintf(msg,"y_zb=%1d",LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1]);
  206.                                         LCD_ShowString(0,128,msg);
  207.                                         while(1);
  208.                                 }
  209.                                 GenJuLuJingQiWangFangXiangJiSuanQianJinFangXiang();
  210.                 }
  211.                 else if(you<0x200)//bu shi fen zhi dian
  212.                 {
  213.                         YouZhuanChuLi();
  214.                 }
  215.                 else if(zuo<0x200)//bu shi fen zhi dian
  216.                 {
  217.                         ZuoZhuanChuLi();
  218.                 }
  219.                 else//shi si hu tong
  220.                 {
  221.                         HouZhuanChuLi();
  222.                 }
  223.         }
  224.         else//qian wu qiang bi
  225.         {
  226.                 if(hecheng_juli==0)//zheng ge pan duan
  227.                 {
  228.                         if((qian<0x80)&&((zuo<0x200)||(you<0x200)))
  229.                         {
  230.                                         if(x_point==LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0])
  231.                                         {
  232.                                                         if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1]<y_point)
  233.                                                         {
  234.                                                                 LuJingQiWangFangXiang[0]=Y_FuFangXiang;
  235.                                                         }
  236.                                                         else if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1]>y_point)
  237.                                                         {
  238.                                                                 LuJingQiWangFangXiang[0]=Y_ZhengFangXiang;
  239.                                                         }
  240.                                         }
  241.                                         else if(y_point==LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1])
  242.                                         {
  243.                                                         if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0]<x_point)
  244.                                                         {
  245.                                                                 LuJingQiWangFangXiang[0]=X_FuFangXiang;
  246.                                                         }
  247.                                                         else if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0]>x_point)
  248.                                                         {
  249.                                                                 LuJingQiWangFangXiang[0]=X_ZhengFangXiang;
  250.                                                         }
  251.                                         }
  252.                                         else
  253.                                         {
  254.                                                 Off_Motor(3);
  255.                                                 LCD_ShowString(0,0,"cuo wu");
  256.                                                 
  257.                                                 sprintf(msg,"x_zb=%1d",LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0]);
  258.                                                 LCD_ShowString(0,96,msg);
  259.                                                 sprintf(msg,"y_zb=%1d",LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1]);
  260.                                                 LCD_ShowString(0,128,msg);
  261.                                                 while(1);
  262.                                         }
  263.                                         GenJuLuJingQiWangFangXiangJiSuanQianJinFangXiang();
  264.                         }
  265.                         else
  266.                         {                        
  267.                                 GenQiangZiChengXu();
  268.                         }
  269.                 }
  270.                 else
  271.                 {
  272.                         GenQiangZiChengXu();
  273.                 }
  274.         }
  275. }
  276. /**********************前向判断***********************/
  277. void QianXiangPanDuan(void)
  278. {
  279.         if(qian>0x500)//qian zhuang qiang
  280.         {               
  281.                 if((you<0x200)&&(zuo<0x200))
  282.                 {
  283.                                 JiLuFenZhiDianJiXuanZeFangXiang();
  284.                                 GenJuQiWangFangXiangJiSuanQianJinFangXiang();
  285.                 }
  286.                 else if(you<0x200)//bu shi fen zhi dian
  287.                 {
  288.                         YouZhuanChuLi();
  289.                 }
  290.                 else if(zuo<0x200)//bu shi fen zhi dian
  291.                 {
  292.                         ZuoZhuanChuLi();
  293.                 }
  294.                 else//shi si hu tong
  295.                 {
  296.                         HouZhuanChuLi();
  297.                 }
  298.         }
  299.         else//qian wu qiang bi
  300.         {
  301.                 if(hecheng_juli==0)//zheng ge pan duan
  302.                 {
  303.                         if((qian<0x80)&&((zuo<0x200)||(you<0x200)))
  304.                         {
  305.                                         JiLuFenZhiDianJiXuanZeFangXiang();
  306.                                         GenJuQiWangFangXiangJiSuanQianJinFangXiang();
  307.                         }
  308.                         else
  309.                         {                        
  310.                                 GenQiangZiChengXu();
  311.                         }
  312.                 }
  313.                 else
  314.                 {
  315.                         GenQiangZiChengXu();
  316.                 }
  317.         }
  318. }
  319. /**********************跟墙子程序***********************/
  320. void GenQiangZiChengXu(void)
  321. {        
  322. //        float you1,zuo1;
  323.         
  324.         YunXingFlag=ZhiXing;
  325.         
  326.         if(youshang>0x300)
  327.         {
  328.                 zuolunint=MIN_SuDu;
  329.                 youlunint=MAX_SuDu;
  330.         }
  331.         else if(zuoshang>0x300)
  332.         {
  333.                 zuolunint=MAX_SuDu;
  334.                 youlunint=MIN_SuDu;
  335.         }
  336.         else
  337.         {
  338.                         if(you>0x100)
  339.                         {
  340.                                         if((youshang>0x80)&&(youshang<0x300))
  341.                                         {
  342.                                                 if(GenQiangFlag != YouGenQiang)
  343.                                                 {
  344.                                                         YouShangGenQiang_Count++;
  345.                                                         YouXiaGenQiang_Count=0;
  346.                                                         ZuoShangGenQiang_Count=0;
  347.                                                         ZuoXiaGenQiang_Count=0;
  348.                                                         if(YouShangGenQiang_Count>2)
  349.                                                         {
  350.                                                                 YouShangGenQiang_Count=0;
  351.                                                                
  352.                                                                 GenQiangFlag=YouGenQiang;
  353.                                                                 PID_init2();
  354.                                                                 PID_realize(0x180,youshang3,YouGenQiang);//0x180
  355.                                                         }
  356.                                                 }
  357.                                                 else
  358.                                                 {
  359.                                                         PID_realize(0x180,youshang3,YouGenQiang);//0x180
  360.                                                 }                        
  361.                                         }
  362.                                         else if((youxia>0x80)&&(youxia<0x300))
  363.                                         {
  364.                                                 if(GenQiangFlag == YouGenQiang)
  365.                                                 {
  366.                                                         YouShangGenQiang_Count=0;
  367.                                                         YouXiaGenQiang_Count=0;
  368.                                                         ZuoShangGenQiang_Count=0;
  369.                                                         ZuoXiaGenQiang_Count=0;
  370.                                                         
  371.                                                         GenQiangFlag=YouGenQiangXia;
  372.                                                         PID_init2();
  373.                                                         PID_realize2(0x180,youxia3,YouGenQiangXia);//0x180
  374.                                                 }
  375.                                                 else if((GenQiangFlag != YouGenQiangXia)&&(youxia>0x100))
  376.                                                 {
  377.                                                         YouShangGenQiang_Count=0;
  378.                                                         YouXiaGenQiang_Count++;
  379.                                                         ZuoShangGenQiang_Count=0;
  380.                                                         ZuoXiaGenQiang_Count=0;
  381.                                                         if(YouXiaGenQiang_Count>2)
  382.                                                         {
  383.                                                                 YouXiaGenQiang_Count=0;
  384.                                                                
  385.                                                                 GenQiangFlag=YouGenQiangXia;
  386.                                                                 PID_init2();
  387.                                                                 PID_realize2(0x180,youxia3,YouGenQiangXia);//0x180
  388.                                                         }
  389.                                                 }
  390.                                                 else if(GenQiangFlag==YouGenQiangXia)
  391.                                                 {
  392.                                                         PID_realize2(0x180,youxia3,YouGenQiangXia);//0x180
  393.                                                 }                        
  394.                                         }
  395.                         }
  396.                         else if(zuo>0x100)
  397.                         {
  398.                                         if((zuoshang>0x80)&&(zuoshang<0x300))
  399.                                         {
  400.                                                 if(GenQiangFlag != ZuoGenQiang)
  401.                                                 {
  402.                                                         YouShangGenQiang_Count=0;
  403.                                                         YouXiaGenQiang_Count=0;
  404.                                                         ZuoShangGenQiang_Count++;
  405.                                                         ZuoXiaGenQiang_Count=0;
  406.                                                         if(ZuoShangGenQiang_Count>2)
  407.                                                         {
  408.                                                                 ZuoShangGenQiang_Count=0;
  409.                                                                
  410.                                                                 GenQiangFlag=ZuoGenQiang;
  411.                                                                 PID_init3();
  412.                                                                 PID_realize(0x140,zuoshang3,ZuoGenQiang);//0x180
  413.                                                         }
  414.                                                 }
  415.                                                 else
  416.                                                 {
  417.                                                         PID_realize(0x140,zuoshang3,ZuoGenQiang);//0x180
  418.                                                 }        
  419.                                         }
  420.                                         else if((zuoxia>0x80)&&(zuoxia<0x300))
  421.                                         {
  422.                                                 if(GenQiangFlag == ZuoGenQiang)
  423.                                                 {
  424.                                                         YouShangGenQiang_Count=0;
  425.                                                         YouXiaGenQiang_Count=0;
  426.                                                         ZuoShangGenQiang_Count=0;
  427.                                                         ZuoXiaGenQiang_Count=0;
  428.                                                         
  429.                                                         GenQiangFlag=ZuoGenQiangXia;
  430.                                                         PID_init3();
  431.                                                         PID_realize2(0x140,zuoxia3,ZuoGenQiangXia);//0x180
  432.                                                 }
  433.                                                 else if((GenQiangFlag != ZuoGenQiangXia)&&(zuoxia>0x100))
  434.                                                 {
  435.                                                         YouShangGenQiang_Count=0;
  436.                                                         YouXiaGenQiang_Count=0;
  437.                                                         ZuoShangGenQiang_Count=0;
  438.                                                         ZuoXiaGenQiang_Count++;
  439.                                                         if(ZuoXiaGenQiang_Count>2)
  440.                                                         {
  441.                                                                 ZuoXiaGenQiang_Count=0;
  442.                                                                
  443.                                                                 GenQiangFlag=ZuoGenQiangXia;
  444.                                                                 PID_init3();
  445.                                                                 PID_realize2(0x140,zuoxia3,ZuoGenQiangXia);//0x180
  446.                                                         }
  447.                                                 }
  448.                                                 else if(GenQiangFlag==ZuoGenQiangXia)
  449.                                                 {
  450.                                                         PID_realize2(0x140,zuoxia3,ZuoGenQiangXia);//0x180
  451.                                                 }
  452.                                         }
  453.                         }
  454.                         else if((zuo<0x80)&&(you<0x80)&&(hou<0x80))
  455.                         {
  456.                                         GenQiangFlag=NoWall;
  457. //                                        if(qian>0x80)
  458. //                                        {
  459. //                                                PID_init4();
  460. //                                                you1=youshang2;
  461. //                                                zuo1=zuoshang2;
  462. //                                                PID_realize(0,ABS(you1-zuo1),NoWall);
  463. //                                        }
  464. //                                        else
  465. //                                        {
  466.                                                 zuolunint=MAX_SuDu;
  467.                                                 youlunint=MAX_SuDu;
  468. //                                        }
  469.                         }               
  470.         }               
  471.         
  472.         if(zuolunint==0)
  473.         {
  474.                 zuolunint=400;
  475.         }
  476.         if(youlunint==0)
  477.         {
  478.                 youlunint=400;
  479.         }
  480.                         
  481.         Init_Motor(zuolunint,ZhengZhuan,youlunint,ZhengZhuan);//直行
  482. }
  483. /**********************计算坐标***********************/
  484. void JiSuanZuoBiao(void)
  485. {
  486.         u8 i,j;
  487.         char msg[20];

  488.         if(QianJinFangXiang==Y_ZhengFangXiang)
  489.         {
  490.                 y_point += 1;
  491.         }
  492.         else if(QianJinFangXiang==Y_FuFangXiang)
  493.         {
  494.                 y_point -= 1;
  495.         }
  496.         else if(QianJinFangXiang==X_ZhengFangXiang)
  497.         {
  498.                 x_point += 1;
  499.         }
  500.         else if(QianJinFangXiang==X_FuFangXiang)
  501.         {
  502.                 x_point -= 1;
  503.         }
  504.         
  505.         if(y_point<0)
  506.         {
  507.                 y_point=0;
  508.         }
  509.         else if(y_point>ZhongDianZuoBiao)
  510.         {
  511.                 y_point=ZhongDianZuoBiao;
  512.         }
  513.         if(x_point<0)
  514.         {
  515.                 x_point=0;
  516.         }
  517.         else if(x_point>ZhongDianZuoBiao)
  518.         {
  519.                 x_point=ZhongDianZuoBiao;
  520.         }
  521.         
  522. //        sprintf(msg,"FenZhi_ZhiZhen=%1d",FenZhi_ZhiZhen);
  523. //        LCD_ShowString(0,64,msg);
  524. //        sprintf(msg,"FenZhiDuiZhan=%1d",FenZhiDuiZhan);
  525. //        LCD_ShowString(0,96,msg);
  526.         
  527.         sprintf(msg,"x_point=%1d",x_point);
  528.         LCD_ShowString(0,160,msg);
  529.         sprintf(msg,"y_point=%1d",y_point);
  530.         LCD_ShowString(0,192,msg);               
  531.         
  532.         if(XunLuFanHuiChongCiFlag==XunLu)
  533.         {
  534.                         if((LuJingZuoBiao[YiZouGuoGeShu-1][0]==x_point)&&(LuJingZuoBiao[YiZouGuoGeShu-1][1]==y_point))
  535.                         {
  536.                                 return;
  537.                         }
  538.                         for(i=0;i<YiZouGuoGeShu;i++)
  539.                         {
  540.                                         if((LuJingZuoBiao[i][0]==x_point)&&(LuJingZuoBiao[i][1]==y_point))
  541.                                         {
  542.                                                 YiZouGuoGeShu=i;
  543.                                                 for(j=0;j<FenZhiDuiZhan+1;j++)
  544.                                                 {
  545.                                                                 if((FenZhiDianZuoBiao[j][0]==x_point)&&(FenZhiDianZuoBiao[j][1]==y_point))
  546.                                                                 {
  547.                                                                                 FenZhiID[j]++;
  548.                                                                                 FenZhi_ZhiZhen=j;
  549.                                                                                 break;
  550.                                                                 }
  551.                                                 }
  552.                                                 break;
  553.                                         }
  554.                         }
  555.                         
  556.                         LuJingZuoBiao[YiZouGuoGeShu][0]=x_point;
  557.                         LuJingZuoBiao[YiZouGuoGeShu][1]=y_point;

  558.                         YiZouGuoGeShu++;
  559.                         
  560.                         if((x_point==ZhongDianZuoBiao)&&(y_point==ZhongDianZuoBiao))
  561.                         {
  562.                                         Init_Motor(400,ZhengZhuan,400,ZhengZhuan);//直行
  563.                                         delay(15000000);
  564.                                         Off_Motor(3);        
  565.                                         LCD_Clear(0);//清屏显示黑色        
  566.                                         XianLuJing();               
  567.                                         while(XunLuFanHuiChongCiFlag==XunLu);
  568.                         }
  569.         }
  570.         else if(XunLuFanHuiChongCiFlag==ChongCi)
  571.         {
  572.                 ChongCiLuJingXiaBiao++;
  573.                 if((x_point==ZhongDianZuoBiao)&&(y_point==ZhongDianZuoBiao))
  574.                 {
  575.                         Init_Motor(400,ZhengZhuan,400,ZhengZhuan);//直行
  576.                         delay(15000000);
  577.                         Off_Motor(3);
  578.                         LCD_Clear(0);//清屏显示黑色
  579.                         LCD_ShowString(0,0,"success");
  580.                         while(1);
  581.                 }
  582.         }
  583. }
  584. /**********************记录分支点及选择方向***********************/
  585. void JiLuFenZhiDianJiXuanZeFangXiang(void)
  586. {
  587.         u8 i;
  588.         if( (x_point==0) && (y_point==0) )
  589.         {
  590.                 return;
  591.         }
  592.         if( (x_point==FenZhiDianZuoBiao[FenZhiDuiZhan][0]) && (y_point==FenZhiDianZuoBiao[FenZhiDuiZhan][1]) )
  593.         {
  594.                 return;
  595.         }
  596.         for(i=0;i<FenZhiDuiZhan;i++)
  597.         {
  598.                 if( (x_point==FenZhiDianZuoBiao[i][0]) && (y_point==FenZhiDianZuoBiao[i][1]) )
  599.                 {
  600. //                        FenZhiID[i]++;
  601. //                        FenZhi_ZhiZhen=i;
  602.                         return;
  603.                 }
  604.         }
  605.         
  606.         FenZhiDuiZhan++;
  607.         
  608.         FenZhiDianZuoBiao[FenZhiDuiZhan][0]=x_point;
  609.         FenZhiDianZuoBiao[FenZhiDuiZhan][1]=y_point;

  610.         FenZhi_ZhiZhen=FenZhiDuiZhan;        
  611.         
  612.         if((qian<0x80)&&(zuo<0x200)&&(you<0x200))//qian zuo you
  613.         {
  614.                 FenZhiID_MAX=FenZhiID_MAX_3FangXiang;
  615.                 if(QianJinFangXiang==Y_ZhengFangXiang)
  616.                 {
  617.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=Y_ZhengFangXiang;
  618.                         
  619.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=X_ZhengFangXiang;
  620.                         
  621.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=X_FuFangXiang;
  622.                         
  623.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][3]=Y_FuFangXiang;
  624.                 }
  625.                 else if(QianJinFangXiang==Y_FuFangXiang)
  626.                 {
  627.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=X_ZhengFangXiang;
  628.                         
  629.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=Y_FuFangXiang;
  630.                         
  631.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=X_FuFangXiang;
  632.                         
  633.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][3]=Y_ZhengFangXiang;
  634.                 }
  635.                 else if(QianJinFangXiang==X_ZhengFangXiang)
  636.                 {
  637.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=X_ZhengFangXiang;
  638.                         
  639.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=Y_ZhengFangXiang;
  640.                         
  641.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=Y_FuFangXiang;
  642.                         
  643.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][3]=X_FuFangXiang;
  644.                 }
  645.                 else if(QianJinFangXiang==X_FuFangXiang)
  646.                 {
  647.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=Y_ZhengFangXiang;
  648.                         
  649.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=X_FuFangXiang;
  650.                         
  651.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=Y_FuFangXiang;
  652.                         
  653.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][3]=X_ZhengFangXiang;
  654.                 }
  655.         }
  656.         else if((qian<0x80)&&(zuo<0x200))//qian zuo
  657.         {
  658.                 FenZhiID_MAX=FenZhiID_MAX_2FangXiang;
  659.                 if(QianJinFangXiang==Y_ZhengFangXiang)
  660.                 {
  661.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=Y_ZhengFangXiang;
  662.                         
  663.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=X_FuFangXiang;
  664.                         
  665.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=Y_FuFangXiang;
  666.                 }
  667.                 else if(QianJinFangXiang==Y_FuFangXiang)
  668.                 {
  669.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=X_ZhengFangXiang;
  670.                         
  671.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=Y_FuFangXiang;
  672.                         
  673.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=Y_ZhengFangXiang;
  674.                 }
  675.                 else if(QianJinFangXiang==X_ZhengFangXiang)
  676.                 {
  677.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=X_ZhengFangXiang;
  678.                         
  679.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=Y_ZhengFangXiang;
  680.                         
  681.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=X_FuFangXiang;
  682.                 }
  683.                 else if(QianJinFangXiang==X_FuFangXiang)
  684.                 {
  685.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=X_FuFangXiang;
  686.                         
  687.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=Y_FuFangXiang;
  688.                         
  689.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=X_ZhengFangXiang;
  690.                 }
  691.         }
  692.         else if((qian<0x80)&&(you<0x200))//qian you
  693.         {
  694.                 FenZhiID_MAX=FenZhiID_MAX_2FangXiang;
  695.                 if(QianJinFangXiang==Y_ZhengFangXiang)
  696.                 {
  697.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=Y_ZhengFangXiang;
  698.                         
  699.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=X_ZhengFangXiang;
  700.                         
  701.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=Y_FuFangXiang;
  702.                 }
  703.                 else if(QianJinFangXiang==Y_FuFangXiang)
  704.                 {
  705.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=Y_FuFangXiang;
  706.                         
  707.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=X_FuFangXiang;
  708.                         
  709.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=Y_ZhengFangXiang;
  710.                 }
  711.                 else if(QianJinFangXiang==X_ZhengFangXiang)
  712.                 {
  713.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=X_ZhengFangXiang;
  714.                         
  715.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=Y_FuFangXiang;
  716.                         
  717.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=X_FuFangXiang;
  718.                 }
  719.                 else if(QianJinFangXiang==X_FuFangXiang)
  720.                 {
  721.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=Y_ZhengFangXiang;
  722.                         
  723.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=X_FuFangXiang;
  724.                         
  725.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=X_ZhengFangXiang;
  726.                 }
  727.         }
  728.         else if((zuo<0x200) &&(you<0x200))
  729.         {
  730.                 FenZhiID_MAX=FenZhiID_MAX_2FangXiang;
  731.                 if(QianJinFangXiang==Y_ZhengFangXiang)
  732.                 {
  733.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=X_ZhengFangXiang;
  734.                         
  735.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=X_FuFangXiang;
  736.                         
  737.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=Y_FuFangXiang;
  738.                 }
  739.                 else if(QianJinFangXiang==Y_FuFangXiang)
  740.                 {
  741.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=X_ZhengFangXiang;
  742.                         
  743.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=X_FuFangXiang;
  744.                         
  745.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=Y_ZhengFangXiang;
  746.                 }
  747.                 else if(QianJinFangXiang==X_ZhengFangXiang)
  748.                 {
  749.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=Y_ZhengFangXiang;
  750.                         
  751.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=Y_FuFangXiang;
  752.                         
  753.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=X_FuFangXiang;
  754.                 }
  755.                 else if(QianJinFangXiang==X_FuFangXiang)
  756.                 {
  757.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][0]=Y_ZhengFangXiang;
  758.                         
  759.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][1]=Y_FuFangXiang;
  760.                         
  761.                         FenZhiQiWangFangXiang[FenZhiDuiZhan][2]=X_ZhengFangXiang;
  762.                 }
  763.         }
  764. }

  765. /**********************根据期望方向计算前进方向***********************/
  766. void GenJuQiWangFangXiangJiSuanQianJinFangXiang(void)
  767. {
  768.         u8 FangXiangChaZhi;
  769.         
  770.         if(FenZhiQiWangFangXiang[FenZhi_ZhiZhen][FenZhiID[FenZhi_ZhiZhen]]<QianJinFangXiang)
  771.         {
  772.                 FangXiangChaZhi=QianJinFangXiang-FenZhiQiWangFangXiang[FenZhi_ZhiZhen][FenZhiID[FenZhi_ZhiZhen]];
  773.                 if(FangXiangChaZhi==2)
  774.                 {
  775.                         FenZhiID[FenZhi_ZhiZhen]++;
  776.                 }
  777.         }
  778.         else
  779.         {
  780.                 FangXiangChaZhi=FenZhiQiWangFangXiang[FenZhi_ZhiZhen][FenZhiID[FenZhi_ZhiZhen]]-QianJinFangXiang;
  781.                 if(FangXiangChaZhi==2)
  782.                 {
  783.                         FenZhiID[FenZhi_ZhiZhen]++;
  784.                 }
  785.         }
  786.         
  787.         if(FenZhiQiWangFangXiang[FenZhi_ZhiZhen][FenZhiID[FenZhi_ZhiZhen]]<QianJinFangXiang)
  788.         {
  789.                 FangXiangChaZhi=QianJinFangXiang-FenZhiQiWangFangXiang[FenZhi_ZhiZhen][FenZhiID[FenZhi_ZhiZhen]];
  790.                 switch(FangXiangChaZhi)
  791.                 {
  792.                         case 1:YouZhuanChuLi();break;//delay(1000000);
  793. //                        case 2:HouZhuanChuLi();break;
  794.                         case 3:ZuoZhuanChuLi();break;
  795.                         default:break;
  796.                 }
  797.         }
  798.         else
  799.         {
  800.                 FangXiangChaZhi=FenZhiQiWangFangXiang[FenZhi_ZhiZhen][FenZhiID[FenZhi_ZhiZhen]]-QianJinFangXiang;
  801.                 switch(FangXiangChaZhi)
  802.                 {
  803.                         case 0:break;
  804.                         case 1:ZuoZhuanChuLi();break;
  805. //                        case 2:HouZhuanChuLi();break;
  806.                         case 3:YouZhuanChuLi();break;
  807.                         default:break;
  808.                 }
  809.         }
  810. }
  811. /**********************起步初始化***********************/
  812. /**********************起步初始化***********************/
  813. void QiBu_Init2(void)
  814. {
  815.         u8 i;
  816.         
  817.         tim2_count=0;//程序循环周期

  818.         GenQiangFlag=0;//跟墙标志,做跟、右跟、双跟
  819.         YunXingFlag=0;//运行标志,直行、左转、右转、后转
  820.         XunLuFanHuiChongCiFlag=ChongCi;//寻路返回冲刺标志

  821.         FenZhiDuiZhan=0;//分支堆栈
  822. //        FenZhiID=0;//分支ID
  823.         FenZhiID_MAX=0;//分支ID的最大值
  824.         CunChuLuJingShuZuXiaBiao=0;//存储路径数组下标
  825.         ChongCiLuJingXiaBiao=0;//冲刺路径下标
  826.         LianXuZhiXing_Count=0;//判断是否连续直行,连续直行需要改变一格时间

  827.         zuolun=0;
  828.         youlun=0;
  829.         zuolunint=0;
  830.         youlunint=0;

  831.         x_point=0;
  832.         y_point=0;
  833.         zuolun_juli=0;
  834.         youlun_juli=0;
  835.         hecheng_juli=0;//合成距离
  836.         
  837.         QianJinFangXiang=Y_ZhengFangXiang;
  838.         YiZouGuoGeShu=1;
  839.         YiGeTime_PanDuan=YiGeTime1;
  840.         
  841.         for(i=0;i<64;i++)
  842.         {
  843.                 FenZhiDianZuoBiao[i][0]=0;
  844.                 FenZhiDianZuoBiao[i][1]=0;
  845.                 FenZhiID[i]=0;
  846.         }
  847.         for(i=0;i<64;i++)
  848.         {
  849.                 FenZhiQiWangFangXiang[i][0]=0;
  850.                 FenZhiQiWangFangXiang[i][1]=0;
  851.                 FenZhiQiWangFangXiang[i][2]=0;
  852.                 FenZhiQiWangFangXiang[i][3]=0;
  853.         }
  854.         LuJingQiWangFangXiang[0]=0;
  855.         
  856.         YouShangGenQiang_YuZhi=GenQiangYuZhi2;
  857.         YouXiaGenQiang_YuZhi=GenQiangYuZhi2;
  858.         ZuoShangGenQiang_YuZhi=GenQiangYuZhi2;
  859.         ZuoXiaGenQiang_YuZhi=GenQiangYuZhi2;
  860. }
  861. void QiBu_Init(void)
  862. {
  863.         u8 i;
  864.         
  865.         tim2_count=0;//程序循环周期

  866.         GenQiangFlag=0;//跟墙标志,做跟、右跟、双跟
  867.         YunXingFlag=0;//运行标志,直行、左转、右转、后转
  868.         XunLuFanHuiChongCiFlag=XunLu;//寻路返回冲刺标志

  869.         FenZhiDuiZhan=0;//分支堆栈
  870. //        FenZhiID=0;//分支ID
  871.         FenZhiID_MAX=0;//分支ID的最大值
  872.         CunChuLuJingShuZuXiaBiao=0;//存储路径数组下标
  873.         ChongCiLuJingXiaBiao=0;//冲刺路径下标
  874.         LianXuZhiXing_Count=0;//判断是否连续直行,连续直行需要改变一格时间

  875.         zuolun=0;
  876.         youlun=0;
  877.         zuolunint=0;
  878.         youlunint=0;

  879.         x_point=0;
  880.         y_point=0;
  881.         zuolun_juli=0;
  882.         youlun_juli=0;
  883.         hecheng_juli=0;//合成距离
  884.         
  885.         QianJinFangXiang=Y_ZhengFangXiang;
  886.         YiZouGuoGeShu=1;
  887.         YiGeTime_PanDuan=YiGeTime1;
  888.         LuJingZuoBiao[0][0]=0;
  889.         LuJingZuoBiao[0][1]=0;
  890.         
  891.         
  892.         for(i=0;i<128;i++)
  893.         {
  894.                 LuJingZuoBiao[i][0]=0;
  895.                 LuJingZuoBiao[i][1]=0;
  896.         }
  897.         for(i=0;i<64;i++)
  898.         {
  899.                 FenZhiDianZuoBiao[i][0]=0;
  900.                 FenZhiDianZuoBiao[i][1]=0;
  901.                 FenZhiID[i]=0;
  902.         }
  903.         for(i=0;i<64;i++)
  904.         {
  905.                 FenZhiQiWangFangXiang[i][0]=0;
  906.                 FenZhiQiWangFangXiang[i][1]=0;
  907.                 FenZhiQiWangFangXiang[i][2]=0;
  908.                 FenZhiQiWangFangXiang[i][3]=0;
  909.         }
  910.         LuJingQiWangFangXiang[0]=0;
  911.         
  912.         YouShangGenQiang_YuZhi=GenQiangYuZhi2;
  913.         YouXiaGenQiang_YuZhi=GenQiangYuZhi2;
  914.         ZuoShangGenQiang_YuZhi=GenQiangYuZhi2;
  915.         ZuoXiaGenQiang_YuZhi=GenQiangYuZhi2;
  916. }
  917. /**********************按路径返回***********************/
  918. void AnLuJingFanHui(void)
  919. {
  920.         if(CunChuLuJingShuZuXiaBiao!=0)
  921.         {
  922.                 if(LuJingZuoBiao[CunChuLuJingShuZuXiaBiao][0]==LuJingZuoBiao[CunChuLuJingShuZuXiaBiao-1][0])
  923.                 {
  924.                                 if(LuJingZuoBiao[CunChuLuJingShuZuXiaBiao-1][1]<LuJingZuoBiao[CunChuLuJingShuZuXiaBiao][1])
  925.                                 {
  926.                                         LuJingQiWangFangXiang[0]=Y_FuFangXiang;
  927.                                 }
  928.                                 else
  929.                                 {
  930.                                         LuJingQiWangFangXiang[0]=Y_ZhengFangXiang;
  931.                                 }
  932.                 }
  933.                 else
  934.                 {
  935.                                 if(LuJingZuoBiao[CunChuLuJingShuZuXiaBiao-1][0]<LuJingZuoBiao[CunChuLuJingShuZuXiaBiao][0])
  936.                                 {
  937.                                         LuJingQiWangFangXiang[0]=X_FuFangXiang;
  938.                                 }
  939.                                 else
  940.                                 {
  941.                                         LuJingQiWangFangXiang[0]=X_ZhengFangXiang;
  942.                                 }
  943.                 }
  944.         }
  945. }

  946. /**********************按路径冲刺***********************/
  947. void AnLuJingChongCi(void)
  948. {
  949.         if(ChongCiLuJingXiaBiao != CunChuLuJingShuZuXiaBiao)
  950.         {
  951.                 if(LuJingZuoBiao[ChongCiLuJingXiaBiao][0]==LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0])
  952.                 {
  953.                                 if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][1]<LuJingZuoBiao[ChongCiLuJingXiaBiao][1])
  954.                                 {
  955.                                         LuJingQiWangFangXiang[0]=Y_FuFangXiang;
  956.                                 }
  957.                                 else
  958.                                 {
  959.                                         LuJingQiWangFangXiang[0]=Y_ZhengFangXiang;
  960.                                 }
  961.                 }
  962.                 else
  963.                 {
  964.                                 if(LuJingZuoBiao[ChongCiLuJingXiaBiao+1][0]<LuJingZuoBiao[ChongCiLuJingXiaBiao][0])
  965.                                 {
  966.                                         LuJingQiWangFangXiang[0]=X_FuFangXiang;
  967.                                 }
  968.                                 else
  969.                                 {
  970.                                         LuJingQiWangFangXiang[0]=X_ZhengFangXiang;
  971.                                 }
  972.                 }
  973.         }
  974. }

  975. /**********************根据路径期望方向计算前进方向***********************/
  976. /**********************根据路径期望方向计算前进方向***********************/
  977. void GenJuLuJingQiWangFangXiangJiSuanQianJinFangXiang(void)
  978. {
  979. //        LianXuZhiXing_Count=0;
  980. //                        ZhuanWanQianDaoWei();
  981.         
  982.         u8 FangXiangChaZhi;
  983.         if(LuJingQiWangFangXiang[0]<QianJinFangXiang)
  984.         {
  985.                 FangXiangChaZhi=QianJinFangXiang-LuJingQiWangFangXiang[0];
  986.                 switch(FangXiangChaZhi)
  987.                 {
  988.                         case 1:
  989.                         YouZhuanChuLi();break;
  990.                         case 3:
  991.                         ZuoZhuanChuLi();break;
  992.                         default:break;
  993.                 }
  994.         }
  995.         else
  996.         {
  997.                 FangXiangChaZhi=LuJingQiWangFangXiang[0]-QianJinFangXiang;
  998.                 switch(FangXiangChaZhi)
  999.                 {
  1000.                         case 0:break;
  1001.                         case 1:
  1002.                         ZuoZhuanChuLi();break;
  1003.                         case 3:
  1004.                         YouZhuanChuLi();break;
  1005.                         default:break;
  1006.                 }
  1007.         }
  1008. }

  1009. /******************************************************
  1010. *入口参数:无
  1011. *出口参数:无
  1012. *功能:定时器2中断服务函数
  1013. ******************************************************/
  1014. void TIM2_IRQHandler(void)
  1015. {
  1016.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //清除中断标志
  1017.         tim2_count++;
  1018. }

  1019. void YouZhuanChuLi(void)
  1020. {
  1021.         if(hecheng_juli>XiuZhengZhuanWanYiGeTime)
  1022.         {
  1023.                 JiSuanZuoBiao();
  1024.         }
  1025.         hecheng_juli=0;
  1026.         
  1027.         Off_Motor(3);
  1028.         Init_Motor(400,ZhengZhuan,400,FanZhuan);//右转
  1029.         delay(6210000);                                
  1030.         Off_Motor(3);
  1031.         
  1032.         GenQiangFlag=NoWall;

  1033.         YiGeTime_PanDuan=YiGeTime1;//
  1034.         
  1035.         
  1036.         
  1037.         if(QianJinFangXiang==Y_ZhengFangXiang)
  1038.         {
  1039.                 QianJinFangXiang=X_ZhengFangXiang;
  1040.         }
  1041.         else if(QianJinFangXiang==Y_FuFangXiang)
  1042.         {
  1043.                 QianJinFangXiang=X_FuFangXiang;
  1044.         }
  1045.         else if(QianJinFangXiang==X_ZhengFangXiang)
  1046.         {
  1047.                 QianJinFangXiang=Y_FuFangXiang;
  1048.         }
  1049.         else if(QianJinFangXiang==X_FuFangXiang)
  1050.         {
  1051.                 QianJinFangXiang=Y_ZhengFangXiang;
  1052.         }
  1053.         
  1054.         YunXingFlag=ZhiXing;
  1055.         zuolunint=MAX_SuDu;
  1056.         youlunint=MAX_SuDu;
  1057.         Init_Motor(zuolunint,ZhengZhuan,youlunint,ZhengZhuan);//直行
  1058. }

  1059. void ZuoZhuanChuLi(void)
  1060. {
  1061.         if(hecheng_juli>XiuZhengZhuanWanYiGeTime)
  1062.         {
  1063.                 JiSuanZuoBiao();
  1064.         }
  1065.         hecheng_juli=0;
  1066.         
  1067.         Off_Motor(3);
  1068.         Init_Motor(400,FanZhuan,400,ZhengZhuan);//左转
  1069.         delay(6210000);                                
  1070.         Off_Motor(3);
  1071.         
  1072.         GenQiangFlag=NoWall;

  1073.         YiGeTime_PanDuan=YiGeTime1;//
  1074.         
  1075.         
  1076.         
  1077.         if(QianJinFangXiang==Y_ZhengFangXiang)
  1078.         {
  1079.                 QianJinFangXiang=X_FuFangXiang;
  1080.         }
  1081.         else if(QianJinFangXiang==Y_FuFangXiang)
  1082.         {
  1083.                 QianJinFangXiang=X_ZhengFangXiang;
  1084.         }
  1085.         else if(QianJinFangXiang==X_ZhengFangXiang)
  1086.         {
  1087.                 QianJinFangXiang=Y_ZhengFangXiang;
  1088.         }
  1089.         else if(QianJinFangXiang==X_FuFangXiang)
  1090.         {
  1091.                 QianJinFangXiang=Y_FuFangXiang;
  1092.         }
  1093.         
  1094.         YunXingFlag=ZhiXing;
  1095.         zuolunint=MAX_SuDu;
  1096.         youlunint=MAX_SuDu;
  1097.         Init_Motor(zuolunint,ZhengZhuan,youlunint,ZhengZhuan);//直行
  1098. }

  1099. void HouZhuanChuLi(void)
  1100. {
  1101.         if(hecheng_juli>XiuZhengZhuanWanYiGeTime)
  1102.         {        
  1103.                 JiSuanZuoBiao();
  1104.         }        
  1105.         hecheng_juli=0;
  1106.         
  1107.         Off_Motor(3);
  1108.         Init_Motor(400,FanZhuan,400,ZhengZhuan);//后转
  1109.         delay(12410000);
  1110.         Off_Motor(3);
  1111.         
  1112.         GenQiangFlag=NoWall;
  1113.         
  1114.         YiGeTime_PanDuan=YiGeTime1;//
  1115.         
  1116.         
  1117.         
  1118.         if(QianJinFangXiang==Y_ZhengFangXiang)
  1119.         {
  1120.                 QianJinFangXiang=Y_FuFangXiang;
  1121.         }
  1122.         else if(QianJinFangXiang==Y_FuFangXiang)
  1123.         {
  1124.                 QianJinFangXiang=Y_ZhengFangXiang;
  1125.         }
  1126.         else if(QianJinFangXiang==X_ZhengFangXiang)
  1127.         {
  1128.                 QianJinFangXiang=X_FuFangXiang;
  1129.         }
  1130.         else if(QianJinFangXiang==X_FuFangXiang)
  1131.         {
  1132.                 QianJinFangXiang=X_ZhengFangXiang;
  1133.         }
  1134.         
  1135.         YunXingFlag=ZhiXing;
  1136.         zuolunint=MAX_SuDu;
  1137.         youlunint=MAX_SuDu;
  1138.         Init_Motor(zuolunint,ZhengZhuan,youlunint,ZhengZhuan);//直行
  1139. }
  1140. void ZhuanWanQianDaoWei(void)
  1141. {
  1142.         u8 i;
  1143.         if(qian>0x0)
  1144.         {
  1145.                 i=0;
  1146.                 while(qian<0x500)
  1147.                 {
  1148.                         CaiYang();
  1149.                         i++;
  1150.                         if(i>100)
  1151.                         {
  1152.                                 i=0;
  1153.                                 GenQiangZiChengXu();
  1154.                         }
  1155.                         delay(1000);
  1156.                 }        
  1157.         }
  1158. }
  1159. /**********************显示路径***********************/
  1160. void XianLuJing(void)
  1161. {
  1162.         char msg[20];
  1163.         u8 i;
  1164.         
  1165.         for(i=0;i<7;i++)
  1166.         {
  1167.                 sprintf(msg,"%1d",LuJingZuoBiao[0+2*i][0]);//LuJingZuoBiao
  1168.                 LCD_ShowString(0,0+32*i,msg);
  1169.                 sprintf(msg,"%1d",LuJingZuoBiao[0+2*i][1]);
  1170.                 LCD_ShowString(32,0+32*i,msg);
  1171.                
  1172.                 sprintf(msg,"%1d",LuJingZuoBiao[1+2*i][0]);
  1173.                 LCD_ShowString(200,0+32*i,msg);
  1174.                 sprintf(msg,"%1d",LuJingZuoBiao[1+2*i][1]);
  1175.                 LCD_ShowString(232,0+32*i,msg);
  1176.         }
  1177. }
  1178. /**********************显示***********************/
  1179. void XianShiZhi(void)
  1180. {
  1181.         char msg[20];
  1182.         
  1183.         sprintf(msg,"1=%3X",shuju1[0]);
  1184.         LCD_ShowString(100,0,msg);
  1185.         
  1186.         sprintf(msg,"2=%3X",shuju[0]);
  1187.         LCD_ShowString(0,32,msg);
  1188.         sprintf(msg,"3=%3X",shuju1[1]);
  1189.         LCD_ShowString(0,64,msg);
  1190.         sprintf(msg,"4=%3X",shuju[1]);
  1191.         LCD_ShowString(0,96,msg);
  1192.         
  1193.         sprintf(msg,"5=%3X",shuju1[2]);
  1194.         LCD_ShowString(100,128,msg);
  1195.         
  1196.         sprintf(msg,"6=%3X",shuju[2]);
  1197.         LCD_ShowString(200,96,msg);
  1198.         sprintf(msg,"7=%3X",shuju1[3]);
  1199.         LCD_ShowString(200,64,msg);
  1200.         sprintf(msg,"8=%3X",shuju[3]);
  1201.         LCD_ShowString(200,32,msg);
  1202. }
  1203. /**********************采样***********************/
  1204. void CaiYang(void)
  1205. {
  1206.         u8 i,j;
  1207.         u16 shuju_zc[4];
  1208.         u16 shuju1_zc[4];
  1209.         
  1210.         GPIO_SetBits(GPIOA, GPIO_Pin_7);//打开AD_Ctrl1,开始转换//2/4/6/8        
  1211.         delay(10);//延时               
  1212.         ADC_Configuration((u32)shuju,1);//转换第一组
  1213.         GPIO_ResetBits(GPIOA, GPIO_Pin_7);//关闭AD_Ctrl1
  1214.         delay(10);//延时
  1215.         GPIO_SetBits(GPIOA, GPIO_Pin_6);//打开AD_Ctrl0,开始转换//1/3/5/7
  1216.         delay(10);//延时                        
  1217.         ADC_Configuration((u32)shuju1,2);        //转换第二组        
  1218.         GPIO_ResetBits(GPIOA, GPIO_Pin_6);//关闭AD_Ctrl0
  1219.         
  1220.         for(i=0;i<4;i++)
  1221.         {
  1222.                 shuju_zc[i] = 0;
  1223.                 shuju1_zc[i] = 0;
  1224.         }
  1225.         
  1226.         for(i=0;i<3;i++)
  1227.         {
  1228.                 GPIO_SetBits(GPIOA, GPIO_Pin_7);//打开AD_Ctrl1,开始转换//2/4/6/8        
  1229.                 delay(10);//延时               
  1230.                 ADC_Configuration((u32)shuju,1);//转换第一组
  1231.                 GPIO_ResetBits(GPIOA, GPIO_Pin_7);//关闭AD_Ctrl1
  1232.                 delay(10);//延时
  1233.                 GPIO_SetBits(GPIOA, GPIO_Pin_6);//打开AD_Ctrl0,开始转换//1/3/5/7
  1234.                 delay(10);//延时                        
  1235.                 ADC_Configuration((u32)shuju1,2);        //转换第二组        
  1236.                 GPIO_ResetBits(GPIOA, GPIO_Pin_6);//关闭AD_Ctrl0
  1237.                
  1238.                 for(j=0;j<4;j++)
  1239.                 {
  1240.                         shuju_zc[j] += shuju[j];
  1241.                         shuju1_zc[j] += shuju1[j];
  1242.                 }
  1243.         }
  1244.         for(i=0;i<4;i++)
  1245.         {
  1246.                 shuju[i] = shuju_zc[i]/3;
  1247.                 shuju1[i] = shuju1_zc[i]/3;
  1248.         }
  1249.         qian=shuju1[0];
  1250.         zuo=shuju1[1];
  1251.         hou=shuju1[2];
  1252.         you=shuju1[3];
  1253.         zuoshang=shuju[0];
  1254.         zuoxia=shuju[1];
  1255.         youxia=shuju[2];
  1256.         youshang=shuju[3];
  1257.         
  1258.         zuoshang2=shuju[0]&0xf00;
  1259.         zuoxia2=shuju[1]&0xf00;
  1260.         youxia2=shuju[2]&0xf00;
  1261.         youshang2=shuju[3]&0xf00;
  1262.         
  1263.         zuoshang3=shuju[0]&0xfc0;
  1264.         zuoxia3=shuju[1]&0xfc0;
  1265.         youxia3=shuju[2]&0xf80;
  1266.         youshang3=shuju[3]&0xf80;
  1267. }
  1268. /******************************************************
  1269. *入口参数:无
  1270. *出口参数:无
  1271. *功能:PA9外部中断服务函数,实现LED灯循环点亮间隔的改变
  1272. ******************************************************/
  1273. void EXTI9_5_IRQHandler(void)
  1274. {        
  1275.         EXTI_ClearITPendingBit(EXTI_Line9);//清除PA9挂起位
  1276.         if((GPIO_ReadInputData(GPIOA)&0x0200) == 0)
  1277.         {
  1278.                 delay(500000);//延时去抖动
  1279.                 if((GPIO_ReadInputData(GPIOA)&0x0200) == 0)
  1280.                 {
  1281.                         QiBu_Init2();
  1282.                         CaiYang();
  1283.                         while(qian>0x200)
  1284.                         {
  1285.                                 CaiYang();
  1286.                                 delay(10000);
  1287.                         }
  1288.                         Init_Motor(400,ZhengZhuan,400,ZhengZhuan);//直行
  1289.                         delay(15000000);
  1290.                 }
  1291.         }
  1292. }
  1293. const u16 juli[201]={
  1294. 2500,2487,2475,2463,2450,2439,2427,2415,
  1295. 2403,2392,2380,2369,2358,2347,2336,2325,
  1296. 2314,2304,2293,2283,2272,2262,2252,2242,
  1297. 2232,2222,2212,2202,2192,2183,2173,2164,
  1298. 2155,2145,2136,2127,2118,2109,2100,2092,
  1299. 2083,2074,2066,2057,2049,2040,2032,2024,
  1300. 2016,2008,2000,1992,1984,1976,1968,1960,
  1301. 1953,1945,1937,1930,1923,1915,1908,1901,
  1302. 1893,1886,1879,1872,1865,1858,1851,1845,
  1303. 1838,1831,1824,1818,1811,1805,1798,1792,
  1304. 1785,1779,1773,1766,1760,1754,1748,1742,
  1305. 1736,1730,1724,1718,1712,1706,1700,1694,
  1306. 1689,1683,1677,1672,1666,1661,1655,1650,
  1307. 1644,1639,1633,1628,1623,1618,1612,1607,
  1308. 1602,1597,1592,1587,1582,1577,1572,1567,
  1309. 1562,1557,1552,1547,1543,1538,1533,1529,
  1310. 1524,1519,1515,1510,1506,1501,1497,1492,
  1311. 1488,1483,1479,1474,1470,1466,1461,1457,
  1312. 1453,1449,1445,1440,1436,1432,1428,1424,
  1313. 1420,1416,1412,1408,1404,1400,1396,1392,
  1314. 1388,1385,1381,1377,1373,1369,1366,1362,
  1315. 1358,1355,1351,1347,1344,1340,1336,1333,
  1316. 1329,1326,1322,1319,1315,1312,1308,1305,
  1317. 1302,1298,1295,1291,1288,1285,1282,1278,
  1318. 1275,1272,1269,1265,1262,1259,1256,1253,
  1319. 1250
  1320. };

复制代码

bisai.7z

202.49 KB, 下载次数: 22, 下载积分: 黑币 -5

迷宫机器人

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-12-18 02:02 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:448250 发表于 2018-12-18 14:09 | 只看该作者
admin 发表于 2018-12-18 02:02
补全原理图或者详细说明一下电路连接即可获得100+黑币

可以。。aaaa
回复

使用道具 举报

地板
ID:448250 发表于 2018-12-18 14:14 | 只看该作者
这个是原理图,大家可以参考一下

STM32F103ZET6原理图.zip

83.8 KB, 下载次数: 16, 下载积分: 黑币 -5

原理图,大家可以看一下

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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