当前位置:首页 >> 机械/仪表 >>

电脑鼠实验报告


《视觉机器人》 实验报告

学 姓

院: 名:



业:

二零一六年一月

目录
第1章 背景和意义 ................................................. 3 第 2 章 系统方案设计......

........................................... 4 第 3 章硬件设计...................................................... 5 3.1 电脑鼠基本硬件组成 ............................................ 5 3.2 电脑鼠基本动作 ................................................ 9 第 4 章 软件设计..................................................... 9 4.1 电脑鼠软件设计概要说明 ........................................ 9 4.2 等高图制作模块 ............................................. 11 4.3 冲刺模块 ................................................... 12 4.4 转弯模块 ................................................... 12 4.5 搜索模块 ................................................... 13 4.6 迷宫地图相对方向与绝对方向的建立 ........................... 13 4.7 墙壁资料存储 ............................................... 15 4.8 电脑鼠搜索策略 ............................................. 16 参考文献........................................................... 17 附件: ........................................................... 17

第1章

背景和意义

电脑鼠可看作是一种具有人工智能的小型机器人,依照比赛规则,当电脑鼠 放入“迷宫”起点,按下启动键之后,它就必须自行决定搜寻法则并且在迷中前 进、转弯、记忆迷宫墙壁资料、计算最短路径、搜寻终点等功能。电脑鼠结合了 机械、电机、电子、控制、光学、程序设计和人工智能等多方面的科技识。国际 电工和电子工程学会(IEEE)每年都要举办一次国际性的电脑鼠走迷宫竞赛。 首场电脑鼠迷宫竞赛 1979 年于纽约举行, 1991 年以来, 每年都有世界级的比赛。 2007 年,国内开始举行 IEEE 标准电脑鼠走迷宫邀请赛,自举办以来高校参赛踊 跃,许多大学还开设了“电脑鼠原理和制作”选修课程。电脑鼠走迷宫竞赛具有 一定难度, 是一项富有挑战性和趣味性的比赛。电脑鼠可看作一个集多项工程学 科知识于一体的小型系统, 成功的设计者通常都是合作团体。 他们必须考虑电子、 电气、机械以及计算机各方面的问题,重量、速度、功耗、传感技术重心以及程 序各方面都是设计中需要决定和综合考虑的因素。电脑鼠结合了多学科知识,对 于提升我们的动手能力、 团队协作能力和创新能力,促进课堂知识的消化和扩展 自身的知识面都非常有帮助;另外成立小组合作参赛,不仅使我们学到了知识, 而且加强了同学之间的交流, 交际能力语言表达能力等也得到了锻炼和提升;最 后电脑鼠走迷宫竞赛极具趣味性,容易得到学生的认同及参与,并能很好的激发 和引导学生这方面的兴趣和爱好,为继续参加比赛和深入学习提供了良好的条 件。

第 2 章 系统方案设计
硬件部分设计概要:

软件部分结构设计:

第 3 章硬件设计
3.1 电脑鼠基本硬件组成
电脑鼠的硬件大致分为以下几部分:传感器、执行部件、微处理器、机械结 构,如图 3-1 所示

电脑鼠

传感器

执行部件

微处理器

机械结构

红 外 传 感 器

步 进 电 机

车 身 设 计

图 3-1 电脑鼠硬件结构图

LM3S615

1.传感器 它是电脑鼠感知外界环境的窗口,是电脑鼠的双眼。好的传感器是电脑鼠准 确获取外部环境信息以做出正确判断的依据,是电脑鼠灵敏快捷的保证。红外测 距方式在电脑鼠上应用最广。常见的红外如图 3-2 所示 本次电脑鼠使用 6 组红外传感器, 每组红外传感器由红外发线射器和红外线 接收器组成用于检测迷宫墙壁信息,分别用于检测左、左前、前、前、右前和右 六个方向的墙壁信息。我们用 U1-U5 表示红外线接收头传感器,RF1-RF5 为发送 红外线装置,使用 6 组可调电阻 W1-W5 控制红外信号发射强度,调整可见距离。 信号采用载波调制,增强抗干扰性。 传感器由高功率 880nm 红外发射管和高灵敏度红外接收管组成,传感器返 回数据为模拟量,通过 ADC 读取,通过数值,可估算障碍物的距离。

图 3-2 红外传感器

2.执行部件 电机是电脑鼠的动力源, 是电脑鼠的四肢。只有具备健壮且灵活的四肢的电 脑鼠才有可能在比赛中高效的解开迷宫。 电机不但要能输出足够的马力还要便于 控制, 在此基础上再配以合适的控制算法就能使电脑鼠快速而精确的行走。电脑 鼠中常用的是步进电机和直流电机,步进电机控制容易,但直流电机使电脑鼠控 制更加灵敏。 本次电脑鼠上有两个两相四线制的步进电机, 左电机和右电机用来控制电脑 鼠前进, 左转和右转, 停止。 步进电机是一种将电脉冲转化为角位移的执行机构。 当步进驱动器接收到一个脉冲信号, 它就驱动步进电机按设定的方向转动一个固 定的角度(称为“步距角”), 它的旋转是以固定的角度一步一步运行的。可以通 过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制 脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。四相步进电机 如图 3-3 所示,电机驱动采用 ROHM 公司 MOS 全桥芯片驱动,压降低,给电机 提供较大的输入电压。 电机控制简单, 每个电机采用三个控制信号: 两个 I/O 控 制电机的正反转、刹车,一个 PWM 控制电机调速,PWM 范围 20KHz~100KHz。

图 3-3 四相步进电机

3.微处理器 微处理器是电脑鼠的核心部分,是电脑鼠的大脑。几乎所有的信息,包括墙 壁信息, 位置信息, 角度信息和电机状态信息等都需要经过微处理器处理并做出 相应的判断。 所有的数据分析, 算法实现和执行指令的发出等都需要由微处理器 来完成。主控芯片 STM32F103RET6 具有 72MHz 的主频,512K Flash,64K RAM, 加个外部 Flash,足够比较使用。

4.机械结构 电脑鼠要能够在迷宫里面灵活穿梭,必须有一副好身板,有适合在迷宫中快 速运行的身体结构。 首先他必须结实,拥有两只东倒西歪的轮子的电脑鼠是很难 不在迷宫中碰壁的, 其次身材娇小的电脑鼠在迷宫里是会更灵活的,它有更大的 空间用于完成转弯, 有更大的空间用于纠正姿,最后体重太大和没有平衡感的老 鼠也是不适宜迷宫竞赛的。 基于如此多的考虑,一只学富五车而又娇小玲珑的电 脑鼠要求我们从机械上面有更多创新。电脑鼠的机械结构如图 3-4 所示。

图 3-4 电脑鼠的机械结构

3.2 电脑鼠基本动作
电脑鼠基本动作包括路口检测,行走控制和转弯。 路口检测:由安装在前、右、左的三个红外线发射对管和接收部件实现,利 用时钟中断来控制,实现远红外测距功能,探测前、右、左有无障碍。 行走控制:由左、右 45?角的两个红外线发射对管和接收部件实现,利用 时钟中断来控制, 实现近红外测距功能, 保持电脑鼠在中轴线上行走, 避免撞墙。 转弯:由于电机采用的是步进电机,只要对一个电机的步数进行设定,电机 采用 PWM 进行驱动, 另外一个电机停止或者反转同样的步数,当然这个步数要自 己实际测量。

第 4 章 软件设计
4.1 电脑鼠软件设计概要说明
电脑鼠的软件主要可以分为等高图制作模块、冲刺模块、转弯模块、搜索模 块、 相对方向与绝对方向转变模块、墙壁资料存储模块和电脑鼠搜索策略模块这 七个模块。如图 3-5 所示。
电脑鼠软件主要模块

等 高 图 制 作 模 块

冲 刺 模 块

转 弯 模 块

搜 索 模 块

相 对 方 向 与 绝 对 方 向 转 变 模 块

墙 壁 资 料 存 储 模 块

电 脑 鼠 搜 索 策 略 模 块

图 4-1 软件主要模块图

下面介绍一下电脑鼠运行中必须要知道的一些参数, 及其在程序运行过程中 的用途。电脑鼠在运行中可以划分为四个状态:等待,启动,搜索迷宫和冲刺状 态。 1.等待状态 在该状态中,电脑鼠静止在起点,等待开始命令。同时实时显示传感器检测 结果和电池电压,这样方便调试传感器的灵敏度和更换电池。 当控制启动的按键按下后,电脑鼠进入启动状态。 2.启动状态 在该状态中,电脑鼠根据第一次转弯的方向判断起点是在坐标的(0,0)点 还是在(15,0)点。其程序流程图见图 3-6 所示:

图 4-2 判断起点坐标程序流程图

3. 搜索迷宫状态 在该状态中,电脑鼠的任务就是搜索并记忆迷宫地图,以采用右手搜索法则 为例搜索全迷宫,其流程图如图 3-7 所示。

图 4-3 迷宫搜索流程图

4.冲刺状态 迷宫搜索完毕后, 根据算法找出一条最优路径冲刺到终点,冲刺结束后返回 到起点。

4.2 等高图制作模块
等高图就是等高线地图的简称,有如一般地图可以标出同一高度的地区范 围,或有如气象报告时的等气压的范围和大小。那么等高图运用在迷宫地图上,

可以标出每个迷宫格到起点相等步数的关系, 许多封闭路径的逃脱与冲刺的关卡 都可以在制作出等高图后迎刃而解,使电脑鼠更容易逃脱,少走一些弯路。 首先开辟一块 16 16 的二维数组空间(MapStep[16][16]),其中每一个元素 代表迷宫的一个方格, 用以计算后储存各方格至起点的最短路径步数(所谓步数 即为路径中经过的方格数)。当起点坐标处标识为 1 时,可以直接达到的相邻方 格均为 2,再远的方格的等高值依次递增,这样距离越远的地方等高值越大。

4.3 冲刺模块
冲刺函数的实现是建立在等高图已经建立好的基础上的。 当电脑鼠要进行冲 刺的时候,调用冲刺函数时,首先会调用等高图制作函数将等高图制作好。然后 该函数通过等高图和墙壁信息来进行电脑鼠的行进控制。当然,我们认为电脑鼠 在走直道的时候应该会比走弯道的时候,来的更快一点,所以我们没有进行特殊 的加权,直接是走直道的。 电脑鼠从起点开始,一直利用等高图信息和墙壁信息进行一格一格的对比, 只有当这一格在电脑鼠绝对方向上时,这一格才算记录到进行直道冲刺,同时直 道格数加一。当遇到电脑鼠要转弯的时候,已经将要走的步数记录下来了,接下 来直接调用行进函数, 控制电脑鼠走完记录好的步数后,即走到电脑鼠要转弯的 地方后,再进行转弯,然后接着继续进行上一步的动作。

4.4 转弯模块
转弯也是电脑鼠运行时必不可少一部分, 同时转弯也分为静止转弯和行进中 转弯。静止转弯要求电脑鼠首先要停止,主要用在电脑鼠进行搜索中,这时要求 电脑鼠要绝对的稳定, 所以采用静止转弯比较好。行进中转弯的特点是消除了静 止转弯的要求电脑鼠停止的弊端,可以节省一些时间,主要用在电脑鼠进行冲刺 时, 这时要求电脑鼠要以竟可能短的时间从起点到达终点,所以行进中转弯可以 节省不少的时间。 静止转弯时,对两个电机设置走相同的步数,如当要转左转 90?时,设置 左电机向后走 40 步,右电机向前走 40 步。通过两个电机走的方位不同,来实现

静止转弯,但静止转弯的缺点就是,在转弯前首先要让电机停止,然后再对电机 的要走的步数进行赋值,这样会浪费一点时间。 行进中转弯时,让一个轮子停止,一个轮子进行运转来实现。如当要左转 90?时,设置左电机停止转动,右电机转动 80 步。与静止转弯区别开来的是, 电机的步数在其他的函数中赋值好了, 在转弯函数中只要一开始将一个电机停止 转动就可以了, 而不用一开始就将两个电机都停止, 然后对电机的步数进行赋值, 这样的话,就可以节省一些不必要的时间。

4.5 搜索模块
电脑鼠一开始进行迷宫搜索时必须要用到这个模块。 通过这个模块电脑鼠进 行迷宫的墙壁信息的采集,电脑鼠所走过的每个坐标都会有一个相应的墙壁信 息,这些墙壁信息是电脑鼠后来进行等高图制作和冲刺的基础。 在进行搜索时,电脑鼠的红外是在时钟中断下,不停地被驱动的,这一连串 的动作有发射短波红外,发射长波红外,和接受红外。处理器通过读取红外接收 器对应引脚的信息来判断四周的情况, 同时将迷宫的信息进行编码后存储在对应 坐标的一个迷宫情况数组中。 当遇到岔路时,程序跳出搜索函数,回到主函数中将岔路坐标进行处理,将 这个坐标进行入栈, 再回到搜索函数中, 根据所选用的搜索法则选择好一条路后, 继续搜索,并这样一直下去直到电脑鼠运行到终点。

4.6 迷宫地图相对方向与绝对方向的建立
迷宫是用 18cm?18cm 大小的方格组成的,其行列各有 16 个方格。为了让 电脑鼠记住所走过的各个迷宫格的信息, 我们就坐标的方法来对 256 个迷宫格进 行编号。 根据坐标的的定义和比赛规则,也为了把上下左右这四个方向参数转换 为微控制器能够识别的符号,在本文中,将向上的方向定义为 0、向右为 1、向 下为 2、向左为 3,如图 3-8 所示。

0

3

MOUSE

1

2
图 4-4 迷宫方向值定 义

只要有了迷宫的坐标和方向后, 电脑鼠在迷宫行走就可以随时知道自己所处 的位置和方位了。然而,对于电脑鼠而言,红外线传感器的位置和方向是固定不 变的, 但是对于迷宫,红外线传感器的位置和方向是随着老鼠前进方向的变化而 一起变化的。 这是由于选择参照物的不同而引起的, 由此引出了两个方向的问题: 相对方向和绝对方向。 相对方向:以电脑鼠当前行走方向为参照的方向。 绝对方向:以迷宫绝对坐标平面为参照的方向。 那么传感器所检测到的信息如何才能更便于处理呢?周立功提到了如果以 相对方向存储的资料将是混乱的,不仅要存储麻烦,而且要记录起检测时电脑鼠 所处的方向,存储量比较大,处理起来也非常麻烦。而以绝对方向存储就不需要 考虑当前电脑鼠的方向。 这样就会经常遇到相对方向和绝对方向的互换。在本文中采取了以变量 Dir 记录电脑鼠前进方向上的绝对方向值,即前方的绝对方向值始终为 Dir。这样电 脑鼠的相对方向转换成绝对方向如表 3-1 所示。

表 3-1 相对方向转换成绝对方向 相对方向 电脑鼠前方 电脑鼠右方 电脑鼠后方 电脑鼠左方 绝对方向 Dir+1 (Dir+1)%4 (Dir+2)%4 (Dir+3)%4

有时候系统还需要根据绝对方向(Dir_dst)和当前的绝对方向(Dir)求出 方向偏差值(△Dir),如式 3-1 所示。 △Dir = Dir_dst – Dir 式 3-1

为了使△Dir 的值落在 0~3 的范围内,计算式进行式 3-2 的转换如下: △Dir =(Dir_dst + 4 – Dir)%4 式 3-2

这时就可以根据方向偏差值求出电脑鼠的相对方向,如表 3.2 所示。
表 3-2 绝对方向转换成相对方向 绝对方向差值(△Dir) 0 1 2 3 相对方向 电脑鼠前方 电脑鼠右方 电脑鼠后方 电脑鼠左方

假设电脑鼠已知当前位置坐标(X,Y),那么就可以求出在其某绝对方向 上的相邻坐标值,如表 3.3 所示。该表是可逆的,即可以根据坐标值的变化求出 绝对方向。
表 3-3 坐标转换 绝对方向 当前位置 上方(0) 右方(1) 下方(2) 左方(3) 坐标 (X,Y) (X,Y+1) (X+1,Y) (X,Y-1) (X-1,y)

当电脑鼠达到一方格坐标时,应根据传感器检测结果记录下当前方格的墙壁 资料, 为了方便管理和节省存储空间,每一个字节变量的低四位分别用来存储一 个方格四周的墙壁资料,如表 3.4 所示。因为迷宫共有 8?8 个方格,所以可以 定义一个 16?16 的二维数组变量来保存整个迷宫墙壁资料。
表 3-4 墙壁资料存储方式 变量位 bit0 bit1 bit2 bit3 bit7~bit4 代表的绝对方向 上方(0) 右方(1) 下方(2) 左方(3) 备注 1:有路,0:有墙壁 1:有路,0:有墙壁 1:有路,0:有墙壁 1:有路,0:有墙壁 保留位

迷宫墙壁资料全部初始化为 0,表示走过迷宫格至少有一方没墙壁,即墙壁 资料不为 0。这样就可以通过单元格存储的墙壁资料是否为 0 来确定该单元格是 否曾搜索过。

4.7 墙壁资料存储
为了记忆迷宫的详细信息, 需要对迷宫单元的位置进行线路标记。全迷宫共

有 16?16 个单元组成, 可采用二维坐标方式标记, 即用每个单元的 XY 坐标表示, 如起点可标记为(0,0),终点为(7,7)。此外,还需要对迷宫单元的可行进 方向进行标记,可采用绝对方位或相对方位二种方式。 绝对方位: 这是一种与电脑鼠行进方向无关的标记方式,以一个四位的二进 制数,分别表示“东”﹑“西”﹑“南”和“北”四个方向。以 1 表示允许行进 (无墙壁),0 表示不允许行进(有墙壁)。 相对方位: 这是一种与电脑鼠行进方向有关的标记方式,以一个三位的二进 制数即可实现标记,分别表示“前”“左”“右”, 以 1 表示允许(无墙壁), 0 表示不允许(有墙壁)。

4.8 电脑鼠搜索策略
电脑鼠走迷宫可以采用全迷宫探索策略,即将迷宫的所有单元均搜索一次, 从中找出最佳的行走路径。这种策略需要有足够的时间或探测次数,但在 IEEE 竞赛规则中每场竞赛只有 15 分钟的时间,因此是不可能的。另一种方法是部分 迷宫探索策略,即在有限的时间或探测次数下,只探测迷宫的一部分,从中找出 次最佳的路径,显然只能采用这种策略。 电脑鼠在一巷道内行走,如果最后无路可走,则该巷为死巷。电脑鼠在任一 单元内,可能的行走方向最多只有三个(前、左、右),如果有二个或二个以上的 可能行走方向,称为交叉,遇有交叉时,由于有多个可以行走的方向,在行走方 向的选择上,可有下面的几种选择法则: (1)右手法则:遇有交叉时,以右边为优先的前进方向,然后是直线方向、 左边方向。 (2)左手法则:遇有交叉时,以左边为优先的前进方向,然后是直线方向、 右边方向。 (3)中左法则:遇有交叉时,以直线为优先的前进方向,然后是左边方向、 右边方向。与此类似的还有中右法则。 (4)乱数法则:遇有交叉时,取随机值作为前进方向。 (5)向心法则:由于终点在迷宫的中心,遇有交叉时,以向迷宫中心的方向 为优先的前进方向。

参考文献
[1] 金东勇. ZigBee 技术在智能家居控制系统中的应用研究[D]. 太原理 工大学工学硕士学位论文. 2008:13-16 [2] 郭天祥 新概念 51 单片机 C 语言教程:入门、提高、开发、拓展全 攻略(附 DVD 光盘 1 张) 2009-01-01 [3] 胡汉才 单片机原理及其接口技术(第 3 版)(附 CD-ROM 光盘 1 张)2010-05-01 [4] 程国钢 51 单片机应用开发案例手册 2011-11-01

附件:
电脑鼠原理图:

电脑鼠单片机控制程序: --------------File Info--------------------------------------------------------------------------------File Name: maze.c Last modified Date: 2015/10/15 Last Version: V1.0 Description: ???????? ?? ????? ?? ????? ??? ? ? ? ???? ???????? ?¨? ????? ??????? ??? ??? ? ? ? ?? ?? ? ?? ??? ?? ???? ???????? -------------------------------------------------------------------------------------------------------Created By: Liao Maogang Created date: 2007/09/08 Version: V1.0 Descriptions: -------------------------------------------------------------------------------------------------------Modified by: Who Moved My Cheese Modified date: Version: Description: ?ó?? ? ?? ??? #include "Maze.h" #include "stm32f10x.h" #include "BitBand.h" #include "Mouse_Drive.h" ?? ???? ???¨?? static uint8 GucXStart = 0; / ?? ?? ?? ?? ?ê / static uint8 GucYStart = 0; / ?? ?? ? ??? ?ê / static uint8 GucXGoal0 = XDST0; / ???? X?? ?ê? ? ?????? ?? / static uint8 GucXGoal1 = XDST1; static uint8 GucYGoal0 = YDST0; / ???? Y?? ?ê? ? ?????? ?? / static uint8 GucYGoal1 = YDST1; static uint8 GucMouseTask = WAIT; / ??? ? ? ò? ? ?? ????? ? ? ?? ??? / static uint8 GucMapStep[MAZETYPE][MAZETYPE] = {0xff}; / ? ? ?????? ?ê? ?? ??? ?? / static MAZECOOR GmcStack[MAZETYPE MAZETYPE] = {0}; / ??mapStepEdit()???????? ???? / static MAZECOOR GmcCrossway[MAZETYPE MAZETYPE] = {0}; / Main()??????? ??? ?? ?§???? ?ê / //extern uint8 GucGoHead;

Function name: Descriptions: input parameters: output parameters: Returned value: void delay (uint32 uiD) { for (; uiD; uiD--); } /

Delay ???????? uiD :?????? ?? ? ? ?? ????? ? ???????? ? ? ? ?

mapStepEdit ?? ???????ê?? ? ??? ?? ??? ??? ? ? uiX: ??? ?? ????? ?ê uiY: ??? ?? ????? ?ê output parameters: GucMapStep[][]: ???? ?ê?? ? ?? ??? ?? Returned value: ? ? void mapStepEdit (int8 cX, int8 cY) { uint8 n = 0; GmcStack[]? ??ê / uint8 ucStep = 1; ? ?? / uint8 ucStat = 0; ????? ? ???? ??? / uint8 i,j; GmcStack[n].cX = cX; ?? ?? X?? ?? ?? / GmcStack[n].cY = cY; ?? ?? Y?? ?? ?? / n++; / ?? ??? ????? ?ê???? ?? / for (i = 0; i < MAZETYPE; i++) { for (j = 0; j < MAZETYPE; j++) { GucMapStep[i][j] = 0xff; } } / ?? ?????? ? ?? ? ???????? ???????? ???? ?í? ê?? / while (n) {

Function name: Descriptions: input parameters:

/ / / ? ?? ? ??? ?

/ /

GucMapStep[cX][cY] = ucStep++; ? ? ?? ???? ?? / / ???????? ?ê?? ?? ?????? ? ???? ?? ???

/

/ ucStat = 0; if ((GucMapBlock[cX][cY] & 0x01) && / ??? ? ???? / (GucMapStep[cX][cY + 1] > (ucStep))) { / ?????? ?? ????????? ????¨?? / ucStat++; / ? ????? ??? ??? ??1 / } if ((GucMapBlock[cX][cY] & 0x02) && / ???? ???? / (GucMapStep[cX + 1][cY] > (ucStep))) { / ????? ? ?? ????????? ????¨?? / ucStat++; / ? ????? ??? ??? ??1 / } if ((GucMapBlock[cX][cY] & 0x04) && (GucMapStep[cX][cY - 1] > (ucStep))) { ucStat++; / ? ????? ??? ??? ??1 / } if ((GucMapBlock[cX][cY] & 0x08) && (GucMapStep[cX - 1][cY] > (ucStep))) { ucStat++; / ? ????? ??? ??? ??1 / } / ?? ???????? ? ???? ?? ? ??? ? ?????? ?ó?? ???????§?? ?? ???? ???? ?????? ??? ????? / if (ucStat == 0) { n--; cX = GmcStack[n].cX; cY = GmcStack[n].cY; ucStep = GucMapStep[cX][cY]; } else { if (ucStat > 1) { / ?????? ? ????? ??? ?? ? ?? ???? ?ê /

GmcStack[n].cX = cX; ?êX???? ?? / GmcStack[n].cY = cY; ?? ?êY???? ?? / n++; } / ?? ?? ???? ?? ? ? ?????? ? ???? ????? / if ((GucMapBlock[cX][cY] & 0x01) && ???? / (GucMapStep[cX][cY + 1] > (ucStep))) { ? ????????? ????¨?? / cY++; ???? ?ê / continue; } if ((GucMapBlock[cX][cY] & 0x02) && ???? / (GucMapStep[cX + 1][cY] > (ucStep))) { ?? ????????? ????¨?? / cX++; ???? ?ê / continue; } if ((GucMapBlock[cX][cY] & 0x04) && ???? / (GucMapStep[cX][cY - 1] > (ucStep))) { ? ????????? ????¨?? / cY--; ??? ?ê / continue; } if ((GucMapBlock[cX][cY] & 0x08) && ???? / (GucMapStep[cX - 1][cY] > (ucStep))) { ?? ????????? ????¨?? / cX--; ??? ?ê / continue; } } } }

/ /

???? ??

/ /

?? ?? ?? ??? ?? / ??

/ /

???? ????? ? / ??

/ /

? ???

? ???? ?? / ?? ?

/ /

??? ?

????? ? / ?? ?

void mouseSpurt (void)//?? ?? ?????? { uint8 ucTemp = 0xff; int8 cXdst = 0,cYdst = 0; / ?????? ? ????? ?? ?ê???? ?? ??? ??? ? ? ???? ?? ?? ?? ?ó? ??? ?? ?? ??? ????ê?? / if (GucMapBlock[GucXGoal0][GucYGoal0] & 0x0c) { ????? ?? ?ê???? ???? ?? / mapStepEdit(GucXGoal0,GucYGoal0); ?????? ? ? / if (ucTemp > GucMapStep[GucXStart][GucYStart]) { ??? ?? ?? ?? ?ó? ??? ?ê / cXdst = GucXGoal0; cYdst = GucYGoal0; ucTemp = GucMapStep[GucXStart][GucYStart]; } } if (GucMapBlock[GucXGoal0][GucYGoal1] & 0x09) { ????? ?? ?ê???? ???? ?? / mapStepEdit(GucXGoal0,GucYGoal1); ?????? ? ? / if (ucTemp > GucMapStep[GucXStart][GucYStart]) { ??? ?? ?? ?? ?ó? ??? ?ê / cXdst = GucXGoal0; cYdst = GucYGoal1; ucTemp = GucMapStep[GucXStart][GucYStart]; } } if (GucMapBlock[GucXGoal1][GucYGoal0] & 0x06) { ????? ?? ?ê???? ???? ?? / mapStepEdit(GucXGoal1,GucYGoal0); ?????? ? ? / if (ucTemp > GucMapStep[GucXStart][GucYStart]) { ??? ?? ?? ?? ?ó? ??? ?ê / cXdst = GucXGoal1; cYdst = GucYGoal0; ucTemp = GucMapStep[GucXStart][GucYStart]; } } if (GucMapBlock[GucXGoal1][GucYGoal1] & 0x03) { ????? ?? ?ê???? ???? ?? /

/ / /

???? ? ??

?? ?

/ / /

???? ? ??

?? ?

/ / /

???? ? ??

?? ?

/

???? ?

mapStepEdit(GucXGoal1,GucYGoal1); ?????? ? ? / if (ucTemp > GucMapStep[GucXStart][GucYStart]) { ??? ?? ?? ?? ?ó? ??? ?ê / cXdst = GucXGoal1; cYdst = GucYGoal1; ucTemp = GucMapStep[GucXStart][GucYStart]; } } objectGoTo_L(cXdst,cYdst); ?????????¨???ê?? } void objectGoTo (int8 cXdst, int8 cYdst) { uint8 ucStep = 1; int8 cNBlock = 0, cDirTemp; int8 cX,cY; cX = GmcMouse.cX; cY = GmcMouse.cY; mapStepEdit(cXdst,cYdst); ?? ??? ? ? / / ????? ??? ??? ????ê?? ????? ? ??? ??? ??????? ? / while ((cX != cXdst) || (cY != cYdst)) { ucStep = GucMapStep[cX][cY]; / ?? ???? ?? ???? ???????????í???? ????? ???? ????? / if ((GucMapBlock[cX][cY] & 0x01) && ???? / (GucMapStep[cX][cY + 1] < ucStep)) { ?? ???? ?? / cDirTemp = UP; ???? ? / if (cDirTemp == GucMouseDir) { ??? ?? ??????? ? ? ???? ? / cNBlock++; ?? ?? ?? ???? / cY++;

/ /

??

?? ?

/ /

/

?? ?

/ /

?? ?? ?? ??? ? / ??? ??? ?? / ??

/

continue; ???? ??? ? } } if ((GucMapBlock[cX][cY] & 0x02) && ???? / (GucMapStep[cX + 1][cY] < ucStep)) { ?? ???? ?? / cDirTemp = RIGHT; ???? ? / if (cDirTemp == GucMouseDir) { ??? ?? ??????? ? ? ???? ? / cNBlock++; ?? ?? ?? ???? / cX++; continue; ???? ??? ? / } } if ((GucMapBlock[cX][cY] & 0x04) && ???? / (GucMapStep[cX][cY - 1] < ucStep)) { ?? ???? ?? / cDirTemp = DOWN; ?????? ? / if (cDirTemp == GucMouseDir) { ??? ?? ??????? ? ? ???? ? / cNBlock++; ?? ?? ?? ???? / cY--; continue; ???? ??? ? / } } if ((GucMapBlock[cX][cY] & 0x08) && ???? / (GucMapStep[cX - 1][cY] < ucStep)) { ?? ???? ?? / cDirTemp = LEFT; ???? ? / if (cDirTemp == GucMouseDir) { ??? ?? ??????? ? ? ???? ? / cNBlock++; ?? ?? ?? ???? / /

/

? ? ??

/ /

???? ??? ?? ? / ??? ??? ?? / ??

/

/

? ? ??

/ /

? ??? ? ???? ? / ?

/ /

??? ?? ??

/

? ? ??

/ /

??? ? ????? ? / ??? ??? ?? / ??

/

cX--; continue; ???? ??? ? } } cDirTemp = (cDirTemp + 4 - GucMouseDir)%4; ??? ??? ??? ???? / GucDirTemp = cDirTemp; if (cNBlock) { mouseGoahead(cNBlock); ? cNBlock?? / } cNBlock = 0; ?? ? ? ?? ?? / ?????? ??????? ? / switch (cDirTemp) { case 1: mouseTurnright(); break; case 2: mouseTurnback(); break; case 3: mouseTurnleft(); Break; default: break; } GmcMouse.cX=cX; GmcMouse.cY=cY; } / ???? ?? ? ? ???? ? ê??? ? ?? ???? ?? ???? / if (cNBlock) { mouseGoahead(cNBlock); GmcMouse.cX=cX; GmcMouse.cY=cY; } } / /

/

? ? ??

?

/

???

/

void objectGoTo_L (int8 cXdst, int8 cYdst) { uint8 ucStep = 1; int8 cNBlock = 0, cDirTemp; int8 cX,cY; cX = GmcMouse.cX; cY = GmcMouse.cY; mapStepEdit(cXdst,cYdst); ?? ??? ? ? / / ????? ??? ??? ????ê?? ????? ? ??? ??? ??????? ? / while ((cX != cXdst) || (cY != cYdst)) { ucStep = GucMapStep[cX][cY]; / ?? ???? ?? ???? ???????????í???? ????? ???? ????? / if ((GucMapBlock[cX][cY] & 0x01) && ???? / (GucMapStep[cX][cY + 1] < ucStep)) { ?? ???? ?? / cDirTemp = UP; ???? ? / if (cDirTemp == GucMouseDir) { ??? ?? ??????? ? ? ???? ? / cNBlock++; ?? ?? ?? ???? / cY++; continue; ???? ??? ? / } } if ((GucMapBlock[cX][cY] & 0x02) && ???? / (GucMapStep[cX + 1][cY] < ucStep)) { ?? ???? ?? / cDirTemp = RIGHT; ???? ? / if (cDirTemp == GucMouseDir) { ??? ?? ??????? ? ? ???? ? / cNBlock++; ?? ?? ?? ???? /

/

?? ?

/ /

?? ?? ?? ??? ? / ??? ??? ?? / ??

/

/

? ? ??

/ /

???? ??? ?? ? / ??? ??? ?? / ??

/

cX++; continue; ???? ??? ? } } if ((GucMapBlock[cX][cY] & 0x04) && ???? / (GucMapStep[cX][cY - 1] < ucStep)) { ?? ???? ?? / cDirTemp = DOWN; ?????? ? / if (cDirTemp == GucMouseDir) { ??? ?? ??????? ? ? ???? ? / cNBlock++; ?? ?? ?? ???? / cY--; continue; ???? ??? ? / } } if ((GucMapBlock[cX][cY] & 0x08) && ???? / (GucMapStep[cX - 1][cY] < ucStep)) { ?? ???? ?? / cDirTemp = LEFT; ???? ? / if (cDirTemp == GucMouseDir) { ??? ?? ??????? ? ? ???? ? / cNBlock++; ?? ?? ?? ???? / cX--; continue; ???? ??? ? / } } cDirTemp = (cDirTemp + 4 - GucMouseDir)%4; ??? ??? ??? ???? / GucDirTemp = cDirTemp; if (cNBlock) { mouseGoahead(cNBlock); ? cNBlock?? / } cNBlock = 0; ?? ? ? ?? ?? / /

/

? ? ??

/ /

? ??? ? ???? ? / ?

/ /

??? ?? ??

/

? ? ??

/ /

??? ? ????? ? / ??? ??? ?? / ??

/

/

? ? ??

/

?

/

???

/

?????? ??????? ? / switch (cDirTemp) { case 1: mouseTurnright(); break; case 2: mouseTurnback(); break; case 3: mouseTurnleft(); break; default: break; } GmcMouse.cX=cX; GmcMouse.cY=cY; } / ???? ?? ? ? ???? ? ê??? ? ?? ???? ?? ???? / if (cNBlock) { mouseGoahead(cNBlock); GmcMouse.cX=cX; GmcMouse.cY=cY; } } Function name: Descriptions: input parameters: output parameters: Returned value: mazeBlockDataGet ?????? ????? ?? ???? ?? ?? ? ???? ??? ?? ??? ???? ?? ? ????????? ucDir: ?? ????? ?? ?????? ? ? ? GucMapBlock[cX][cY] : ????????

/ uint8 mazeBlockDataGet (uint8 ucDirTemp) { int8 cX = 0,cY = 0; ???? ????? ?? ?????? ???? ? ? ??? ????? ? /

switch (ucDirTemp) { case MOUSEFRONT: ucDirTemp = GucMouseDir; break; case MOUSELEFT: ucDirTemp = (GucMouseDir + 3) % 4; break; case MOUSERIGHT: ucDirTemp = (GucMouseDir + 1) % 4; break; default: break; } / ?????? ????? ????? ????? ??? ? ????? ? ??? ?ê / switch (ucDirTemp) { case 0: cX = GmcMouse.cX; cY = GmcMouse.cY + 1; break; case 1: cX = GmcMouse.cX + 1; cY = GmcMouse.cY; break; case 2: cX = GmcMouse.cX; cY = GmcMouse.cY - 1; break; case 3: cX = GmcMouse.cX - 1; cY = GmcMouse.cY; break; default:

break; } return(GucMapBlock0[cX][cY]); ??? ????? ?? ?? ??????

/ } /

/

Function name: Descriptions: input parameters: output parameters: Returned value:

rightMethod ?????¨??? ? ??? ?? ??????? ? ? ? ? ? ?

/ void rightMethod (void) { if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) && ?? ????? ????? ???? / (mazeBlockDataGet(MOUSERIGHT) == 0x00)) { ?? ????? ????? ?? ???? ?? / mouseTurnright(); ?? ???????? / return; } if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) && ?? ????? ????????? / (mazeBlockDataGet(MOUSEFRONT) == 0x00)) { ?? ????? ??????? ???? ?? / return; ?? ?????? ????? ? / } if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) && ?? ????? ????? ???? / (mazeBlockDataGet(MOUSELEFT ) == 0x00)) { ?? ????? ????? ?? ???? ?? / mouseTurnleft(); ?? ???????? / return; } } Function name: leftMethod Descriptions: ?????¨??? ? ??? ?? ??????? input parameters: ? ? output parameters: ? ?

/ / /

/ / /

/ / /

Returned value: ? ? void leftMethod (void) { if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) && ?? ????? ????? ???? / (mazeBlockDataGet(MOUSELEFT ) == 0x00)) { ?? ????? ????? ?? ???? ?? / mouseTurnleft(); ?? ???????? / return; } if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) && ?? ????? ????????? / (mazeBlockDataGet(MOUSEFRONT) == 0x00)) { ?? ????? ??????? ???? ?? / return; ?? ?????? ????? ? / } if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) && ?? ????? ????? ???? / (mazeBlockDataGet(MOUSERIGHT) == 0x00)) { ?? ????? ????? ?? ???? ?? / mouseTurnright(); ?? ???????? / return; } } / Function name: frontRightMethod Descriptions: ?????¨??? ? ??? ?? ???????? ? ?? ?? ? ??? input parameters: ? ? output parameters: ? ? Returned value: ? ? / void frontRightMethod (void) { if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) && ?? ????? ????????? / (mazeBlockDataGet(MOUSEFRONT) == 0x00)) { ?? ????? ??????? ???? ?? / return; ?? ?????? ????? ?

/ / /

/ / /

/ / /

/ /

/ /

} if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) && ?? ????? ????? ???? / (mazeBlockDataGet(MOUSERIGHT) == 0x00)) { ?? ????? ????? ?? ???? ?? / mouseTurnright(); ?? ???????? / return; } if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) && ?? ????? ????? ???? / (mazeBlockDataGet(MOUSELEFT ) == 0x00)) { ?? ????? ????? ?? ???? ?? / mouseTurnleft(); ?? ???????? / return; } } / Function name: frontLeftMethod Descriptions: ?????¨??? ? ??? ?? ???????? ? ?? ?? ? ??? input parameters: ? ? output parameters: ? ? Returned value: ? ? / void frontLeftMethod (void) { if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_F) && ?? ????? ????????? / (mazeBlockDataGet(MOUSEFRONT) == 0x00)) { ?? ????? ??????? ???? ?? / return; ?? ?????? ????? ? / } if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_L) && ?? ????? ????? ???? / (mazeBlockDataGet(MOUSELEFT ) == 0x00)) { ?? ????? ????? ?? ???? ?? / mouseTurnleft(); ?? ???????? / return; }

/ / /

/ / /

/ / /

/ / /

if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEWAY_R) && ?? ????? ????? ???? / (mazeBlockDataGet(MOUSERIGHT) == 0x00)) { ?? ????? ????? ?? ???? ?? / mouseTurnright(); ?? ???????? / return; } } /

/ / /

Function name: centralMethod Descriptions: ????? ¨??? ? ?????? ?????????????? ?????? ??? ? ???? ?¨ ?????? ???????¨?? input parameters: ? ? output parameters: ? ? Returned value: ? ? / void centralMethod (void) { if (GmcMouse.cX & 0x08) { if (GmcMouse.cY & 0x08) { / ????? ? ?????????? ? ????? ?? / switch (GucMouseDir) { case UP: ???? ????? ??? leftMethod(); ???¨?? break; case RIGHT: ???? ????? ??? rightMethod(); ?????¨?? break; case DOWN: ????? ????? ?? ? / / / / ?? ??

/ / / /

??

/ /

?

frontRightMethod(); ?????¨?? break; case LEFT: ???? ????? ??? / frontLeftMethod(); ??¨?? / break; default: break; } } else { / ????? ? ?????????? ? ???? ??? / switch (GucMouseDir) { case UP: ???? ????? ??? / frontLeftMethod(); ??¨?? / break; case RIGHT: ???? ????? ??? leftMethod(); ???¨?? break; case DOWN: ????? ????? ?? ? rightMethod(); ?????¨?? break; /

/

/ /

?? ???

/ /

?? ???

/ / / /

?? ??

/ / / /

?

case LEFT: ???? ????? ??? / frontRightMethod(); ?????¨?? / break;

/ /

??

default: break; } } } else { if (GmcMouse.cY & 0x08) { / ????? ? ?????????? ? ????? ?? / switch (GucMouseDir) { case UP: ???? ????? ??? / rightMethod(); ?????¨?? break; / / / ??

case RIGHT: ???? ????? ??? / frontRightMethod(); ?????¨?? / break; case DOWN: ????? ????? ?? ? / frontLeftMethod(); ??¨?? / break; case LEFT: ???? ????? ??? leftMethod(); ???¨?? break; default: break; } } else { / ????? ? ?????????? ? ???? ??? /

/ /

??

/ /

?

???

/ / / /

?? ??

switch (GucMouseDir) { case UP: ???? ????? ??? / frontRightMethod(); ?????¨?? / break; case RIGHT: ???? ????? ??? / frontLeftMethod(); ??¨?? / break; case DOWN: ????? ????? ?? ? leftMethod(); ???¨?? break; case LEFT: ???? ????? ??? rightMethod(); ?????¨?? break; default: break; } } } } / Function name: Descriptions: input parameters: output parameters: Returned value: crosswayCheck ? ??????? ?ê????? ?? ??? ?? ? ??§???? ucX? ? ?????ì?? ?? ? ????? ?ê ucY? ? ?????ì?? ?? ?????? ?ê ? ? ucCt? ? ? ??? ?? ? ??§???? / / ??

/ /

?? ???

/ / / /

? ??

/ / / /

??

/ uint8 crosswayCheck (int8 cX, int8 cY) { uint8 ucCt = 0;

if ((GucMapBlock[cX][cY] & 0x01) && ???? ?? ? ???? ?? ?????? / (GucMapBlock0[cX][cY + 1]) == 0x00) { ???? ?? ? ???? ?? ??? ??? ?? / ucCt++; ????? ??? ??? ??1 / } if ((GucMapBlock[cX][cY] & 0x02) && ???? ?? ? ???? ???????? / (GucMapBlock0[cX + 1][cY]) == 0x00) { ???? ?? ? ???? ?????? ???? ?? / ucCt++; ????? ??? ??? ??1 / } if ((GucMapBlock[cX][cY] & 0x04) && ???? ?? ? ???? ? ??????? / (GucMapBlock0[cX][cY - 1]) == 0x00) { ???? ?? ? ???? ? ???? ??? ?? / ucCt++; ????? ??? ??? ??1 / } if ((GucMapBlock[cX][cY] & 0x08) && ???? ?? ? ???? ???????? / (GucMapBlock0[cX - 1][cY]) == 0x00) { ???? ?? ? ???? ????? ??? ?? / ucCt++; ????? ??? ??? ??1 / } return ucCt; } / Function name: crosswayChoice Descriptions: ???? ?? ? ? ?§????? ????? ??? ? input parameters: ? ? output parameters: ? ? Returned value: ? ? / void crosswayChoice (void) { switch (SEARCHMETHOD) { case RIGHTMETHOD: rightMethod();

/ / /

?? ? ?? ? ?

/ / /

?? ? ?? ? ?

/ / /

?? ? ?? ? ?

/ / /

?? ? ?? ? ?

break; case LEFTMETHOD: leftMethod(); break; case CENTRALMETHOD: centralMethod(); break; case FRONTRIGHTMETHOD: frontRightMethod(); break; case FRONTLEFTMETHOD: frontLeftMethod(); break;

default: break; } } void RCC_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |RCC_APB2Periph_AFIO, ENABLE); } int main (void) { uint8 n = 0; GmcCrossway[]? ??ê / uint8 ucRoadStat = 0; ?? ?? ?ê?????? ???§???? / uint8 ucTemp = 0; ????START??? ? ???? ?ê??? ? / RCC_Init(); SystemInit(); MouseInit(); USART1_Config();

/ / / ? ?????

PIDInit(); delay(100000); while (1) { switch (GucMouseTask) { ? ? ? ò?? ?í / case WAIT: delay(10000000); BLUE_LED_OFF; //PA0 ???? LED?? RED_LED_ON; //PC3 ?ì?? ?? BUZZ_ON(); //?? ??? ?? ì delay(10000000); BUZZ_OFF(); BLUE_LED_ON; //PA0 ???? LED?? RED_LED_OFF; //PC3 ?ì?? ?? delay(1000); GucMouseTask = START; break; case START: ???? ?? ?????? ?? ?????? ?ê mazeSearch(); ????

/

??

/ / / ? ???

/ if (GucMapBlock[GmcMouse.cX][GmcMouse.cY] & 0x08) { / ??? ? ?? ?? ?????? ???? ?????? ?? / if (MAZETYPE == 16) { / ?? ?????????? ???? ? ???? ? ?? ?ê / GucXGoal0 = 8; GucXGoal1 = 7; } GucXStart = MAZETYPE - 1; / ?? ???? ?????? ?? ? ????? ?ê / GmcMouse.cX = MAZETYPE - 1; / ?? ???? ????????? ? ???????? ?ê / / ?????? ?? ? ??? ?? ? ?(0,0)? ? ? ???????????????? ?????? ??? ??? ? ?? ?? / ucTemp = GmcMouse.cY; do { GucMapBlock[MAZETYPE - 1][ucTemp] = GucMapBlock[0][ucTemp];

GucMapBlock[0 ][ucTemp] = 0; }while (ucTemp--); / ??OFFSHOOT[0]???? ???? ?? ?? ?ê / GmcCrossway[n].cX = MAZETYPE - 1; GmcCrossway[n].cY = 0; n++; GucMouseTask = MAZESEARCH; ??? ? ??? ? ? ???????? ? / } if (GucMapBlock[GmcMouse.cX][GmcMouse.cY] & 0x02) { ? ?? ?? ?????? ???? ?????? ?? / / ??OFFSHOOT[0]???? ???? ?? ?? ?ê / GmcCrossway[n].cX = 0; GmcCrossway[n].cY = 0; n++; GucMouseTask = MAZESEARCH; ??? ? ??? ? ? ???????? ? / } break;

/

/

???

/

case MAZESEARCH: if (((GmcMouse.cX==GucXGoal0)&&(GmcMouse.cY==GucYGoal0))||((GmcMouse.cX==GucXG oal0)&&(GmcMouse.cY==GucYGoal1)) ||((GmcMouse.cX==GucXGoal1)&&(GmcMouse.cY==GucYGoal0))||((GmcMouse.cX==GucXG oal1)&&(GmcMouse.cY==GucYGoal1))) / ???? ???? ???? ???? / { //mouseStop(); //while(1); onestep(); mouseTurnback(); objectGoTo(GucXStart,GucYStart); onestep(); mouseTurnback(); GucMouseTask = SPURT; break; } else{

ucRoadStat = crosswayCheck(GmcMouse.cX,GmcMouse.cY); / ? ??? ?????? ? ??§???? / if (ucRoadStat) { / ?? ?????? ??? ? / if (ucRoadStat > 1) { / ????? ? ?????? ??? ?? ? ? ? ???? ?ê / GmcCrossway[n].cX = GmcMouse.cX; GmcCrossway[n].cY = GmcMouse.cY; n++; } crosswayChoice(); / ???????¨?????????? ???? ??? ? / mazeSearch(); / ??? ? ?? ?? / } else if(ucRoadStat==1) { crosswayChoice(); / ???????¨?????????? ???? ??? ? / mazeSearch(); } else { / ?? ??? ????? ??? ?? ? ? ????? ?ó?§?? / mouseTurnback(); n=n-1; objectGoTo(GmcCrossway[n].cX,GmcCrossway[n].cY); ucRoadStat = crosswayCheck(GmcMouse.cX,GmcMouse.cY); if (ucRoadStat > 1) { GmcCrossway[n].cX = GmcMouse.cX; GmcCrossway[n].cY = GmcMouse.cY; n++; } crosswayChoice(); mazeSearch(); } } break; case SPURT:

mouseSpurt(); ? ???????? ? ????? / onestep(); mouseTurnback(); objectGoTo(GucXStart,GucYStart); / onestep(); mouseTurnback(); break; default: break; } } } / END FILE /

/

???

/

? ??? ??


相关文章:
电脑鼠实验报告
电脑鼠实验报告_机械/仪表_工程科技_专业资料。《视觉机器人》 实验报告 学姓 院: 名: 专 业: 二零一六年一月 目录第1章 背景和意义 ...《视觉机器人》 ...
电脑鼠报告
20 第1章 背景和意义 电脑鼠可看作是一种具有人工智能的小型机器人,依照比赛...小车自动走迷宫实验报告 17页 免费 电脑鼠走迷宫竞赛电脑鼠... 47页 免费 走...
电脑鼠报告
电脑鼠报告_计算机软件及应用_IT/计算机_专业资料。裕兴杯电脑鼠竞赛第一名报告 ...5 3 硬件系统分析 3.1 实验平台与设计工具本次毕业设计以“ IEEE 标准电脑鼠...
电脑鼠走迷宫实验报告附程序
参赛软件研发过程在 void main() 函数中,采用压栈的方式进行电脑鼠搜索,数组 uint8 GmcCrossway[MAZETYPE*MAZETYPE]用于暂存未走过支路坐标。 数组 uint8 GucMap...
电脑鼠走迷宫技术报告
电脑鼠走迷宫技术报告_信息与通信_工程科技_专业资料。电脑鼠走迷宫 项目编号:31...试验表明, 如果脉冲信号变化太快,步进电机由于惯性跟不上电信号的变化 就会产生...
电脑鼠走迷宫技术报告
电脑鼠走迷宫技术报告_信息与通信_工程科技_专业资料。有关介绍电脑鼠走迷宫的一...速度最快的电脑鼠是由来自位于华盛顿的 BattelLe Northwest 实验室的 Art Boland...
西南交大电脑鼠课程设计报告
(cmd==DISABLE) CR=0; } 至此,完成寻线型电脑鼠软件部分的设计 第 16 页 西南交通大学本科课程设计(论文) 第 5 章 结论与心得体会本次对寻线型电脑鼠的...
迷宫电脑鼠的设计报告
28 I 重庆理工大学综合课程设计报告 摘 要 “电脑鼠”是使用单片机微控制器,...电脑鼠走迷宫技术报告 37页 5下载券 电脑鼠走迷宫实验报告附... 9页 3下载...
计算机硬件实验报告
计算机硬件实验报告_理学_高等教育_教育专区。计算机硬件技术 实验报告第四次和第五次实验 姓名:李新基 实验班号:23 学号:2012010630 机器号:39 目录实验四. 中断...
小学科学实验报告单
小学科学实验报告单班级 时间 实验类型 分组 :( 演示 :(∨∨)) 实验名称 选择最合适的工具 实验器材: 钉有三颗图钉、两颗铁钉、和两颗木螺丝钉的木板一块,...
更多相关标签:
小鼠走迷宫实验报告 | 小鼠缺氧实验报告讨论 | 小鼠缺氧实验报告 | 豚鼠高钾血症实验报告 | 小白鼠缺氧实验报告 | 鼠妇实验报告 | 小鼠血脑屏障实验报告 | 小鼠缺氧实验报告结论 |