⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 navigation.lst

📁 此程序是GPS定位导航程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   NAVIGATION                                                            05/25/2008 15:06:03 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE NAVIGATION
OBJECT MODULE PLACED IN Navigation.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Navigation.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*****************************************************************/
   2          /*函数名称: GPS_Navigation.c                                    */
   3          /*函数功能: 小车导航,实现最短路径                              */      
   4          /*有无返回: 无                                                  */
   5          /*修改记录: 无修改记录                                          */
   6          /*编写作者: t483-4-19chenyong                                   */
   7          /*编写日期: 2008-3-12                                           */
   8          /*****************************************************************/
   9          
  10          
  11          #include "common.h"                    
*** WARNING C318 IN LINE 15 OF common.h: can't open file 'conio.h'
  12          #include "TS12864A.h"
  13          #include "navigation.h "
  14          #include "delay.h" 
  15          #include "map.h"  
  16          #include "key.h"
  17          #include "astar.h"
  18          #include "window.h"
  19          
  20          /*****************************************************************/
  21          /*
  22                                             /----------GPS导航电子地图(测试版本)
  23                                            /
  24                                           /-------------------------------------------
  25                          |       S,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,         |
  26                                          |           *,*,*,*,*,B,*,*,*,*,*,*,*,*,*,*,     | 
  27                          |       *,*,*,*,*,*,*,*,*,*,*,*,*,*,E,*,         | 
  28                                          |           *,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,     | 
  29                                          |           *,*,*,A,*,*,*,*,*,*,*,*,*,*,*,*,     |
  30                                          |           *,*,*,*,*,*,*,*,*,*,C,*,*,*,*,*,     | 
  31                                          |           *,*,*,*,*,*,F,*,*,*,*,*,*,*,*,*,     | 
  32                                          |           *,*,*,*,*,*,*,*,*,*,*,*,*,*,D,*,     |
  33                                           -------------------------------------------
  34          说明: A,B,C,D,E,F为用户要到达的终点,S为起点。通过按键盘上的按键
  35                 实现小车的最短路径搜索,并通过液晶显示行驶的步数。
  36          
  37          */
  38          
  39          
  40          struct  MapData 
  41                        {
  42                                          unsigned char Gps_Map_Length[Map_Length];
  43                                  unsigned char Gps_Map_Width[Map_Width];                           
  44                                    };
  45          
  46          xdata   struct  MapData;
  47          extern unsigned char key;
  48          extern unsigned int  Position;
  49          
  50          byte_t    maze[MAZE_HEIGHT][MAZE_WIDTH] = {
  51                          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  52                          1,0,1,0,1,1,1,0,1,1,1,0,0,1,0,1,
  53                          0,0,1,0,1,0,0,1,1,0,1,1,0,1,1,1,
  54                          1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
C51 COMPILER V8.02   NAVIGATION                                                            05/25/2008 15:06:03 PAGE 2   

  55                          1,1,1,1,0,1,1,0,1,0,1,0,1,1,1,1,
  56                          1,1,0,1,1,1,1,1,1,0,1,0,1,1,0,0,
  57                          0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  58                          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  59          };
  60          byte_t    maze0[MAZE_HEIGHT][MAZE_WIDTH] = {
  61                          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  62                          1,0,1,0,1,1,1,0,1,1,1,0,0,1,0,1,
  63                          0,0,1,0,1,0,0,1,1,0,1,1,0,1,1,1,
  64                          1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
  65                          1,1,1,1,0,1,1,0,1,0,1,0,1,1,1,1,
  66                          1,1,0,1,1,1,1,1,1,0,1,0,1,1,0,0,
  67                          0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  68                          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  69          };
  70          
  71          /*
  72              方向信号量查询表
  73              0x01(0000 0001) : 上
  74              0x02(0000 0010) : 下
  75              0x04(0000 0100) : 左
  76              0x08(0000 1000) : 右
  77          */
  78          
  79          byte_t d_signal[4]  = {0x01, 0x02, 0x04, 0x08};
  80          
  81          /*
  82              方向信号量使用表
  83              如果指定方向已经走过,那么使用“与”运算去处该方向
  84              0x0E(0000 1110) : 上
  85              0x0D(0000 1101) : 下
  86              0x0B(0000 1011) : 左
  87              0x07(0000 0111) : 右
  88          */
  89          
  90          byte_t d_spend[4]   = {0x0E, 0x0D, 0x0B, 0x07};
  91          
  92          /* 指定方向移动偏量 */
  93          int      move[4][2]   = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };
  94          
  95          /* 打印迷宫用的符号 */
  96          byte_t symbol[3]   = {0,1,2};
  97          
  98          /* 求两点间的距离 */
  99          
 100          uint_t distance( uint_t pos1X, uint_t pos1Y, uint_t pos2X, uint_t pos2Y ) {
 101   1      
 102   1          uint_t    ret = 0;
 103   1      
 104   1          /* 距离公式 */
 105   1          ret = (uint_t)sqrt((pow((double)((int)pos1X - (int)pos2X),2) + pow((double)((int)pos1Y - (int)pos2Y),2
             -)));
 106   1      
 107   1          return ret;
 108   1      
 109   1      }
 110          
 111          /* 压缩坐标 */
 112          uint_t create_pos( uint_t pX, uint_t pY ) {
 113   1          uint_t ret = 0;
 114   1          /* 将pX赋给ret,这样pX坐标在ret的低八位 */
 115   1          ret = pX;
C51 COMPILER V8.02   NAVIGATION                                                            05/25/2008 15:06:03 PAGE 3   

 116   1      
 117   1          /* 将pX坐标移到高八位去,这样低位就能存放pY */
 118   1          ret <<= 8;
 119   1          /* 将pY存放放到ret的低八位,并保持高八位的数据不变 */
 120   1          ret  |= pY;
 121   1      
 122   1          return ret;
 123   1      }
 124          
 125          /*
 126          == 估计函数 ===========================================
 127          -p            : 当前移动到的节点指针
 128          -quit_x
 129          -quit_y        : quit_x 和 quit_y表示迷宫出口坐标
 130          -maze       : 迷宫矩阵
 131          =======================================================
 132          */
 133          path_t * evaluate( path_t *p, uint_t quit_x, uint_t quit_y, byte_t maze[MAZE_HEIGHT][MAZE_WIDTH] ) {
 134   1          uint_t pX, pY;
 135   1      
 136   1          /* 用于接收四个方向离开出口的距离,以便选择最近的方向移动 */
 137   1          int    dis[4];
 138   1          int minDis = 32767;
 139   1          int minId  = -1;
 140   1      
 141   1          path_t *pnode = (path_t *)0;
 142   1      
 143   1          register int i;
 144   1      
 145   1          /* 计算当前节点的坐标 */
 146   1          pX = p->pos >> 8;
 147   1          pY = p->pos & 0x00FF;
 148   1      
 149   1          memset(dis, (int)-1, sizeof(int)*4);
 150   1      
 151   1          /* 计算每个方向离开出口的距离,一次存放到dis数组,若没有i方向,则dis[i]任保留-1 */
 152   1          for( i = 0; i < 4; ++i ) {
 153   2              if( (p->direct & d_signal[i]) >> i == 0x01 )
 154   2                  dis[i] =(int)distance(pX + move[i][0], pY + move[i][1], quit_x, quit_y);
 155   2          }
 156   1      
 157   1          /* 获得最短距离的方向 */
 158   1          for(i = 0; i < 4; ++i) {
 159   2              if(dis[i] != -1 && dis[i] < minDis) {
 160   3                  minId = i;
 161   3                  minDis = dis[i];
 162   3              }
 163   2          }
 164   1      
 165   1          /* 若没有可用的方向,则通知寻径函数折回 */
 166   1          if(minId == -1)
 167   1              return (path_t *)0;
 168   1      
 169   1          /* 用去最近距离方向的信号量 */
 170   1          p->direct &= d_spend[minId];
 171   1          /* 在移动到新位置之前,在旧位置处留下足迹 */
 172   1          maze[pY][pX] = (byte_t)PATH_FOOTPRINT;
 173   1      
 174   1          /* 构建新的路径节点 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -