电脑鼠参考程序

合集下载

电脑鼠的原理分析及算法研究

电脑鼠的原理分析及算法研究

电脑鼠的原理分析及算法研究摘要:本文阐述了电脑鼠的定义和意义,并对电脑鼠的工作原理及硬件、软件设备进行一定的分析,研究了一些传统和经典的算法。

关键词:电脑鼠,模块,算法,蚂蚁算法Analysis of the Principle and Study of Algorithm ofMicroMouseWang Huinan 04010515(Southeast University, Nanjing, 211189)Abstract:This paper describes the definition and significance of MicroMouse. And analyzing the work principle of MicroMouse’s hardware and software equipment. Studying a number of traditional and classical algorithms.Key words: MicroMouse; Module; Algorithms; Ant algorithm本学期,我选修了机电一体化——电脑鼠。

通过学习和查找资料,我对电脑鼠的运行原理有了一定的了解,并产生了一些新的想法。

1电脑鼠的基本知识1.1电脑鼠的定义所谓“电脑鼠”,英文名叫做MicroMouse,是使用嵌入式微控制器、传感器和机电运动部件构成的一种智能行走装置的俗称,它可以在“迷宫”中自动记忆和选择路径,寻找出口,最终达到所设定的目的地。

实际上电脑鼠就是一个电力驱动小车,而这个电动小车是由一个或多个为控制器来控制,通过传感器和其他各功能器件的配合,具备一定的智能。

同时,电脑鼠拥有探测障碍物、行走、转弯、加减速好制动等基本功能。

1.2电脑鼠的意义电脑鼠可谓是一种具有人工智能的小型机器人,结合了机械、电机、电子、控制、光学、程序设计和人工智能等多方面的科技知识。

电脑鼠程序代码

电脑鼠程序代码

/****************************************Copyright(c)****************************************************** Guangzhou ZHIYUAN electronics Co.,LTD.**** Info--------------------------------------------------------------------------------- ** File Name:** Last modified Date: 2008/02/14** Last Version:** Description: MicroMouse615 上的无记忆功能的走迷宫实验****--------------------------------------------------------------------------------------------------------** Created By: 廖茂刚** Created date:** Version:** Descriptions:****--------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** Version:** Description:********************************************************************************************** *************//******************************************************************************************* **************包含头文件******************************************************************************************** *************/#include ""#include ""#include ""#include ""#include ""#include ""#include ""#include ""#include ""#include ""#include ""/******************************************************************************************* **************PB 端口定义红外线传感器******************************************************************************************** *************/#define IRSEND_BEVEL GPIO_PIN_0 /* 驱动斜角红外的调制信号*/#define LEFTSIDE GPIO_PIN_1 /* 左方传感器输出的信号*/#define FRONTSIDE_L GPIO_PIN_2 /* 左前方传感器输出的信号*/#define FRONTSIDE GPIO_PIN_3 /* 前方传感器输出的信号*/#define FRONTSIDE_R GPIO_PIN_4 /* 右前方传感器输出的信号*/#define RIGHTSIDE GPIO_PIN_5 /* 右方传感器输出的信号*//******************************************************************************************* **************PC 端口定义KEY 键******************************************************************************************** *************/#define KEY GPIO_PIN_4 /* 按键连接的端口*//******************************************************************************************* **************PD 端口定义步进电机******************************************************************************************** *************/#define PHRA1 GPIO_PIN_0 /* 右侧步进电机的A1 相*/#define PHRA2 GPIO_PIN_1 /* 右侧步进电机的A2 相*/#define PHRB1 GPIO_PIN_2 /* 右侧步进电机的B1 相*/#define PHRB2 GPIO_PIN_3 /* 右侧步进电机的B2 相*/#define PHLA1 GPIO_PIN_4 /* 左侧步进电机的A1 相*/#define PHLA2 GPIO_PIN_5 /* 左侧步进电机的A2 相*/#define PHLB1 GPIO_PIN_6 /* 左侧步进电机的B1 相*/#define PHLB2 GPIO_PIN_7 /* 左侧步进电机的B2 相*//******************************************************************************************* **************PE 端口定义传感器红外发射驱动左前右正向******************************************************************************************** *************/#define IRSEND_SIDE GPIO_PIN_0 /* 驱动左前右正向红外发射*//******************************************************************************************* **************常量宏定义-- 迷宫类型******************************************************************************************** *************/#define MAZETYPE 8 /* 8: 四分之一迷宫;16: 全迷宫*//******************************************************************************************* **************常量宏定义--前进一个迷宫格步进电机需要走的步数******************************************************************************************** *************/#define ONEBLOCK 125/******************************************************************************************* **************常量宏定义--电脑鼠状态******************************************************************************************** *************/#define STOP 0 /* 电脑鼠停止*/#define GOAHEAD 1 /* 电脑鼠前进*/#define TURNLEFT 3 /* 电脑鼠向左转*/#define TURNRIGHT 4 /* 电脑鼠向右转*/#define TURNBACK 5 /* 电脑鼠向后转*//******************************************************************************************* **************常量宏定义--传感器******************************************************************************************** *************/#define LEFT 0 /* 左方传感器*/#define FRONTL 1 /* 左前方传感器*/#define FRONT 2 /* 前方传感器*/#define FRONTR 3 /* 右前方传感器*/#define RIGHT 4 /* 右方传感器*//******************************************************************************************* **************常量宏定义--电机状态******************************************************************************************** *************/#define MOTORSTOP 0 /* 电机停止*/#define WAITONESTEP 1 /* 电机暂停一步*/#define MOTORRUN 2 /* 电机运行*//******************************************************************************************* **************常量宏定义--电机运行方向******************************************************************************************** *************/#define MOTORGOAHEAD 0 /* 电机前进*/#define MOTORGOBACK 1 /* 电机后退*//******************************************************************************************* **************结构体定义******************************************************************************************** *************/struct motor {int8 cState; /* 电机运行状态*/int8 cDir; /* 电机运行方向*/uint32 uiPulse; /* 电机需要转动的步数*/uint32 uiPulseCtr; /* 电机已转动的步数*/int32 iSpeed; /* 电机转动速度*/};typedef struct motor MOTOR;/******************************************************************************************* **************定义全局变量******************************************************************************************** *************/static MOTOR GmRight = {MOTORSTOP, MOTORGOAHEAD, 0, 0, 0}; /* 定义并初始化右电机状态*/static MOTOR GmLeft = {MOTORSTOP, MOTORGOAHEAD, 0, 0, 0}; /* 定义并初始化左电机状态*/static uint8 GucMouseState = STOP; /* 保存电脑鼠当前运行状态*/static uint32 GuiAccelTable[300] = {0}; /* 电机加减速各阶段定时器值*/static int32 GiMaxSpeed = 70; /* 保存允许运行的最大速度*/static uint8 GucDistance[5] = {0}; /* 记录传感器状态*//******************************************************************************************* **************** Function name: delay** Descriptions: 延时函数** input parameters: uiD :延时参数,值越大,延时越久** output parameters: 无** Returned value: 无******************************************************************************************** *************/void delay (uint32 uiD){for (; uiD; uiD--);}/******************************************************************************************* **************** Function name: rightMotorContr** Descriptions: 右步进电机驱动时序** input parameters: 无** output parameters: 无** Returned value: 无******************************************************************************************** *************/void rightMotorContr (void){static int8 cStep = 0; /* 保存电机当前位置*/switch {case MOTORGOAHEAD: /* 向前步进*/cStep = (cStep + 1) % 8;break;case MOTORGOBACK: /* 向后步进*/cStep = (cStep + 7) % 8;break;default:break;}switch (cStep) {case 0: /* A2B2*/GPIOPinWrite(GPIO_PORTD_BASE,PHRA1 | PHRA2 | PHRB1 | PHRB2,PHRA1 | PHRA2 | PHRB1 | PHRB2);case 1: /* A2*/GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA1 | PHRA2);break;case 2: /* A2B1*/GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA1 | PHRA2 | PHRB2); break;case 3: /* B1*/GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRB2);break;case 4: /* A1B1*/GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA2 | PHRB2);break;case 5: /* A1*/GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA2);break;case 6: /* A1B2*/GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRA2 | PHRB1 | PHRB2); break;case 7: /* B2*/GPIOPinWrite(GPIO_PORTD_BASE, PHRA1 | PHRA2 | PHRB1 | PHRB2, PHRB1 | PHRB2);break;default:}}/******************************************************************************************* **************** Function name: leftMotorContr** Descriptions: 左步进电机驱动时序** input parameters: :电机运行方向** output parameters: 无** Returned value: 无******************************************************************************************** *************/void leftMotorContr (void){static int8 cStep = 0; /* 保存电机当前位置*/switch {case MOTORGOAHEAD: /* 向前步进*/cStep = (cStep + 1) % 8;break;case MOTORGOBACK: /* 向后步进*/cStep = (cStep + 7) % 8;break;default:break;}switch (cStep) {case 0: /* A2B2*/GPIOPinWrite(GPIO_PORTD_BASE,PHLA1 | PHLA2 | PHLB1 | PHLB2,PHLA1 | PHLA2 | PHLB1 | PHLB2);break;case 1: /* B2*/GPIOPinWrite(GPIO_PORTD_BASE,PHLA1 | PHLA2 | PHLB1 | PHLB2,PHLB1 | PHLB2);break;case 2: /* A1B2*/GPIOPinWrite(GPIO_PORTD_BASE,PHLA1 | PHLA2 | PHLB1 | PHLB2,PHLA2 | PHLB1 | PHLB2);break;case 3: /* A1*/GPIOPinWrite(GPIO_PORTD_BASE,PHLA1 | PHLA2 | PHLB1 | PHLB2,PHLA2);break;case 4: /* A1B1*/GPIOPinWrite(GPIO_PORTD_BASE,PHLA1 | PHLA2 | PHLB1 | PHLB2,PHLA2 | PHLB2);break;case 5: /* B1*/GPIOPinWrite(GPIO_PORTD_BASE,PHLA1 | PHLA2 | PHLB1 | PHLB2,PHLB2);break;case 6: /* A2B1*/GPIOPinWrite(GPIO_PORTD_BASE,PHLA1 | PHLA2 | PHLB1 | PHLB2,PHLA1 | PHLA2 | PHLB2);break;case 7: /* A2*/GPIOPinWrite(GPIO_PORTD_BASE,PHLA1 | PHLA2 | PHLB1 | PHLB2,PHLA1 | PHLA2);break;default:break;}}/******************************************************************************************* **************** Function name: speedContrR** Descriptions: 右电机速度调节** input parameters: 无** output parameters: 无** Returned value: 无******************************************************************************************** *************/void speedContrR (void){int32 iDPusle;iDPusle = - ; /* 统计电机还剩余的步数*/if (iDPusle <= {;} else { /* 非减速区间,则加速到最大值*/if < GiMaxSpeed) {++;} else {;}}if < 0) { /* 设置速度下限*/= 0;}TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[]); /* 设置定时时间*/}/******************************************************************************************* **************** Function name: speedContrL** Descriptions: 左电机速度调节** input parameters: 无** output parameters: 无** Returned value: 无******************************************************************************************** *************/void speedContrL (void){int32 iDPusle;iDPusle = - ; /* 统计电机还剩余的步数*/if (iDPusle <= {;} else { /* 非减速区间,则加速到最大值*/if < GiMaxSpeed) {++;}}if < 0) { /* 设置速度下限*/= 0;}TimerLoadSet(TIMER1_BASE,TIMER_A,GuiAccelTable[]); /* 设置定时时间*/}/******************************************************************************************* **************** Function name: Timer0A_ISR** Descriptions: Timer0 中断服务函数** input parameters: 无** output parameters: 无** Returned value: 无******************************************************************************************** *************/void Timer0A_ISR(void){static int8 n = 0,m = 0;TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /* 清除定时器0 中断。

电脑鼠算法

电脑鼠算法
电脑老鼠走迷宫竞赛
算法简介
08计算机(1)班 龚若皓
软件算法所需要实现的功能
最基本的功能: 最基本的功能: 1.正确记录迷宫的信息 1.正确记录迷宫的信息 2.正录小车的状态(当前的方向,四周的挡板情况等) 正确记录小车的状态 3.确保小车的移动, 3.确保小车的移动,停止和转弯的可控性 确保小车的移动
需要实现的核心功能 1.实现基本的从起点到终点的寻路过程。 1.实现基本的从起点到终点的寻路过程。 实现基本的从起点到终点的寻路过程 2.实现等高表的生成算法。 2.实现等高表的生成算法。 实现等高表的生成算法 3.实现从当前的位置通过最有效的路径移动到指定的任意位置。 3.实现从当前的位置通过最有效的路径移动到指定的任意位置。 实现从当前的位置通过最有效的路径移动到指定的任意位置 (通过建立等高表来实现) 通过建立等高表来实现) 4.根据已经得到的迷宫地图信息实现起点到终点的最短路径分析。 4.根据已经得到的迷宫地图信息实现起点到终点的最短路径分析。 根据已经得到的迷宫地图信息实现起点到终点的最短路径分析 (通过建立等高表来实现) 通过建立等高表来实现)
寻路算法简介
正确使用堆栈, 2. 正确使用堆栈,整个选路算法的运行过程中会大量地使用堆栈 的入栈和出栈操作,如果对入栈和出栈的条件判断不正确, 的入栈和出栈操作,如果对入栈和出栈的条件判断不正确,有 可能造成数据紊乱,整个算法就崩溃了, 可能造成数据紊乱,整个算法就崩溃了,最好使用调试版上的 数码管实时显示堆栈栈顶的数据,发现有错误就在程序中寻找 数码管实时显示堆栈栈顶的数据, 错误,直到整个寻路算法稳定为止。 错误,直到整个寻路算法稳定为止。
数据的存储方式
绝对方向和相对方向的变换: 绝对方向和相对方向的变换: 假设数值0 假设数值0,1,2,3分别表示绝对方向的上,右,下,左,那 分别表示绝对方向的上, 么就用0 么就用0,1,2,3中的其中一个数值来表示当前小车车头朝向的方 向,当然这个数值是动态变化的,每转弯一次该数值应当变化一 当然这个数值是动态变化的, 次,例如当前方向的数值为3(左方),那么经过一次右转操作后 例如当前方向的数值为3 左方),那么经过一次右转操作后 ), 该数值就应该变化为0 该数值就应该变化为0了(上方)。其实转化的规则相当简单,只 上方)。其实转化的规则相当简单, )。其实转化的规则相当简单 要右转方向数值就加1 只要左转方向数值就加3 要右转方向数值就加1,只要左转方向数值就加3,只要后转方向数 值就加2 当然可能有越界的情况, 值就加2,当然可能有越界的情况,所以得出的方向数值再进行模 运算对4 运算对4取余数得出的结果就是转弯后小车的车头所面向的方向的 数值了。 数值了。

电老鼠竞赛

电老鼠竞赛

电老鼠竞赛的定义(2009-10-26 22:20:12)分类:创新教育思想与实践标签:迷宫学科知识最短路径微处理器自动控制教育编者按:2009 IEEE国家标准全国电老鼠邀请赛即将于11月7-8日在北京航空航天大学拉开序幕,各地的选拔赛也在紧密锣鼓地进行,目前陕西赛区、山西赛区、北京赛区和湖北赛区已经结束,经过几个月精心准备很多学生都取得了很好的成绩,我想大家通过湖北赛区华中科技大学的新闻报道可以将会有更多的了解(/Html/2009-10-27/66565.shtml)。

电脑鼠走迷宫竞赛具有一定难度,是一项富有挑战性和趣味性的比赛。

此外,它还是一个很好的教学工具。

电脑鼠可看作是一个集多项工程学科知识于一体的小型系统。

成功的设计者通常都是合作团体,他们必须考虑电子、电气、机械以及计算机各方面的问题。

重量、速度、功耗、传感技术、重心以及程序各方面都是设计中需要决定和综合考虑的因素。

电脑鼠是一个多学科的综合体,与多各学科关系精密:(1)机械工程:首先电脑鼠必须是个实实在在的机器人,而对于在迷宫中高速穿梭的电脑鼠,“身材”的好坏极其重要。

大多数使用步进电机的电脑鼠可以直接将车轮安装在电机轴上,而使用直流电机驱动的电脑鼠往往许多添加减速和传动装置,如何既使轮子安装稳定不颤动,保证高传动效率,又使车体轻巧美观是机械设计时需要解决的问题。

(2)电子工程:电脑鼠是一个嵌入式系统,需要广泛的涉及信号处理、通信、微处理器应用和电机控制等。

(3)自动控制:控制电脑鼠在迷宫中快速而准确的行走属于自动控制技术范畴。

测距传感器获取距离信息并将其反馈给微处理器,微处理器对距离值分析处理获得墙壁信息并根据墙壁信息控制电机动作以带动轮子产生相应的动作,这整个构成一个大自动控制系统。

而在这个大系统内还可以包含其他的自动控制系统。

(4)人工智能:电脑鼠走迷宫竞赛的整个过程可大体分为两个部分:一、搜索迷宫,从起点出发,找到终点并找出一条最短路径;二、冲刺,从起点开始,在最短时间内到达终点。

迷宫机器人简介

迷宫机器人简介

三、迷宫机器人场地简介
场地整体由木板组装面成,可以通过更改部分隔墙位置来实现场地变更 底板尺寸为1.5*1.5米,由不同长度的隔墙板与底板共同组合而成,每个通 道为168mm,隔墙高50mm,宽12mm 底板为黑色防滑表面,隔墙表面贴白色防火板,顶上贴红色边条
168mm
四、迷宫机器人规则简介
比赛时机器人可以将场地的任一个角作为起点,终点设置在场地正中。 比赛时选手通过程序控制机器人从起点出现,按顺序将场地上的所有通道 全部跑完再回到起点位置,并自动分析刚才所走路线中到达终点的最短路 线,然后沿着最短路线前进到达终区并再次返回起点,以到达目的地所用 的时间最少者为胜
五、迷宫机器人程序说明
◆模块化流程图式编程软件,直观明了 ◆支持流程图或C语言编程,可以直接将流程图转化为C语言 ◆编程模块可自由按横向或纵向对齐,简单方便 ◆模块间的连接线可以自行更改连接,便于不同阶段的用户使用 ◆支持自定义函数的导入
五、迷宫机器人程序说明
功能:初始化电脑鼠硬件,以及清零电脑鼠的记忆内存。 参数:双击设置四个参数,分别为初始X坐标、初始Y坐标、初始方 向、迷宫大小。相应地一般设置为0、0、MazeUP、8。
姿势修正的临界条件数据记录表
传感器 一侧墙壁(靠右) 左 左前 X12 X21 X41 X52 X22 X42 一侧墙壁(靠左) 两侧墙壁(靠右) 两侧墙壁(靠左)

右前 右
六、迷宫机器人使用说明
1)两侧都有墙壁时的姿态纠正策略 当两侧都有挡板时,且当电脑鼠处在如图6-1、图6-2所示位置时需要对电脑鼠 姿态进行纠正。其中,图6-1(a)和图6-2(a)分别表示电脑鼠的位置偏离了迷宫 中心(向左)和其姿态偏离了平行于墙壁的方向(向左),可以发现,这时左边 传感器信号强,右边的弱。电脑鼠应当向右转以回到理想的方位和姿态。同样, 图6-1(b)和图6-2(b)分别表示电脑鼠的位置偏离了迷宫中心(向右)和其姿态 偏离了平行于墙壁的方向(向右),这时右边传感器信号强,左边的弱。电脑鼠 应当向左转以回到理想的方位和姿态

走迷宫电脑鼠的算法分析与研究

走迷宫电脑鼠的算法分析与研究

走迷宫电脑鼠的算法分析与研究收稿日期:2010-03-30;修订日期:2010-11-08作者简介:夏炎(1984-),男,南京人,硕士研究生,研究方向:基于ARM 的嵌入式系统的设计与开发。

夏炎(南京工业大学电子与信息工程学院,南京210013)摘要:电脑鼠的灵活性和智能程度不但取决于硬件的结构和性能,还取决于软件设计的好坏,越是智能的电脑鼠,其软件设计就越不简单。

对走迷宫电脑鼠的算法做了总结和比较,并对各算法的优缺点进行了阐述。

关键词:电脑鼠;迷宫;算法中图分类号:TP18文献标识码:A 文章编号:1008-8725(2011)01-0194-03Analyzing and Researching on Maze-runningMicromouse AlgorithmXIA Yan(School of Electronics and Information Engineering,Nanjing University of Technology,Nanjing 210013,China )Abstract:The flexibility and intelligence degree of Micromouse depended on not only structure and properties of hardware,but also whether software design was good or bad.The more intelligent the Micromouse was,the more difficult software design was.This paper concluded and compared the algorithms of maze -running micromouse,and discribed advantages and disadvantages of different algorithms.Key words:Micromouse;maze;algorithm0引言人类在科技的发展史上,一直在尝试着想要创造出一个具有肢体、感官、脑力等综合一体的智能机器人,而电脑鼠就是一个能够用来诠释肢体、感官及脑力综合工作的基本实例,这也是当初电脑鼠被发明的理由,希望能够借助电脑鼠的创作来进而研究与发明更加复杂的机械。

走迷宫,你能快过迷宫鼠吗?

走迷宫,你能快过迷宫鼠吗?

走迷宫,你能快过迷宫鼠吗?作者:华杉来源:《百科新说》2020年第03期原来,这种机械老鼠名叫“电脑鼠”,是一种智能行走装置。

电脑鼠走迷宫比赛始于20世纪70年代末,在世界各地都会举行,但最有名的当属全日本电脑鼠公开赛。

这些灵活的“老鼠”是完全自主行动的机器人,设计者不能使用遥控设备控制它们,电脑鼠必须在没有外界帮助的情况下,从预定的起始位置出发,通过不断尝试,找到通往迷宫终点的路线,到达终点用时最短的电脑鼠获胜。

电脑鼠由参赛者设计,但在正式比赛之前,迷宫的内部构造处于保密状态,参赛者无法提前帮助电脑鼠模拟走迷宫的正确路线;而电脑鼠不像赛场观众那样可以看到迷宫全局,因此,它们在走迷宫之前,完全不知道迷宫的布局,就像我们在现实中走大型迷宫一样。

如果它们在前进时碰壁了,就需要记录下该点的位置信息,然后调整到另一个方向,继续前进,同时绘制迷宫路线图。

电脑鼠就这样在多次试错后,找到从起点到终点的最佳路线。

有了路线,电脑鼠就能直达迷宫终点。

电脑鼠其实就是一种智能机器人,它们能参加比赛,必须具备三个部分:第一是驱动电机,它能提供稳定而快速的行走能力,不然电脑鼠在遇到转角时,会因为转弯角度过大或太小而拖延行走时间;第二是传感器,它就像人的眼睛,能让电脑鼠感知墙壁和路线的具体方位;第三是最重要的记忆和分析系统,像大脑一样,这个系统必须将所有走过的路一一记下,并整理出一条最佳路线,以避开不必要的路段。

电脑鼠大赛比拼的不仅是动力装置的灵活性,更是程序的优劣,考验设计者能否写出使电脑鼠达到最优计算能力的程序。

每年的全日本电脑鼠公开赛上都有上百支来自世界各国的队伍前来参赛。

参赛者主要是中学生、大学生和职业选手,其中职业选手的实力最强。

目前该比赛的世界纪录保持者是新加坡的大学老师黄明吉,他设计的电脑鼠以3.921秒的成绩夺得2011年全日本电脑鼠公开赛的冠军,至今无人能敌。

3.921秒有多快?你还没看清楚怎么回事,它就“唰”地一下到达终点了。

天津渤海职业技术学院2016高职高专电脑鼠走迷宫竞赛赛项规程1204

天津渤海职业技术学院2016高职高专电脑鼠走迷宫竞赛赛项规程1204

2016年度天津市高职高专院校学生技能大赛“电脑鼠走迷宫”赛项规程天津渤海职业技术学院2016年10月2016年天津市职业院校技能大赛赛项规程一、赛项名称赛项编号:赛项名称:“启诚杯”电脑鼠走迷宫竞赛英语翻译:“QiCheng Cup”Micromouse Contest赛项组别:高职学生组赛项归属产业:电子信息产业二、竞赛目的“启诚杯”电脑鼠走迷宫竞赛项目,从技术上涵盖了物联网应用技术、电子信息工程技术、嵌入式技术、通信技术、软件技术、计算机网络技术、信息安全技术、移动通信技术、计算机应用技术、应用电子技术、计算机控制技术、机电一体技术、自动化技术等多个专业技术,涉及:传感器检测、人工智能、自动控制和机电运动部件应用等技能和综合职业素养。

全面展现高职教育的发展水平,提高电子信息类高素质、高技能应用型人才的培养质量。

通过竞赛,推动电子信息行业企业人才能力需求,顺应科技发展将嵌入式技术开发,智能算法优化等前端先进技术融入竞赛内容中,进一步深化校企合作,引导高职电子信息类专业开展单片机应用、嵌入技术应用、物联网技术应用等,课程建设和教学改革,促进创新型人才培养模式的改革与发展,增强高职电子类专业学生就业竞争力,推进创新创业教育,强化创业指导和服务,提高就业水平。

三、竞赛内容比赛分理论考试和实际操作两大环节,其中理论考试占总成绩的20%,实际操作考核占80%,实际操作分“迷宫赛部分”占总成绩的50%,“创新赛部分”占总成绩的30%。

1、理论考试部分:主要考核高职各专业课程中所涉及的电子技术、单片机技术、嵌入式技术及程序设计基础知识,与工程实践创新类-电脑鼠竞赛相关的基本知识及基本能力。

以理论知识笔答方式进行,考试题型由主观题与客观题组成。

考核知识点如下:1)比赛通过理论考试和走迷宫竞赛,综合考查学生对嵌入式系统、软件编程、传感器理论、程序算法等掌握情况,主要技能点与知识点如下:2)嵌入式硬件知识:电脑鼠通过ARM处理器的软硬结合编程调试,要求学生掌握IAR编程环境的配置与使用、ARM处理器工作方式与程序编写及下载运行的操作流程、嵌入式技术的相关理论。

电脑鼠

电脑鼠

电脑鼠百科名片本词条主要介绍电脑鼠所谓“电脑鼠”,英文名叫做MicroMouse,是使用嵌入式微控制器、传感器和机电运动部件构成的一种智能行走装置的俗称,它可以在“迷宫”中自动记忆和选择路径,寻找出口,最终达到所设定的目的地。

国际电工和电子工程学会(IEEE)每年都要举办一次国际性的电脑鼠走迷宫竞赛,自举办以来参加国踊跃,为此许多大学还开设了“电脑鼠原理和制作”选修课程。

电脑鼠可谓是一种具有人工智能的小型机器人,依照新制的比赛规则,当电脑鼠放入起点,按下启动键之后,它就必须自行决定搜寻法则并且在迷宫中前进、转弯、记忆迷宫墙壁资料、计算最短路径、搜寻终点等功能。

电脑鼠更结合了机械、电机、电子、控制、光学、程序设计和人工智能等多方面的科技知识。

人类在科技的发展史上,一直在尝试着想要创造出一个具有肢体、感官、脑力等综合一体的智能机器人,而电脑鼠就是一个很能够用来诠释肢体、感官及脑力综合工作的基本实例,这也是当初电脑鼠被发明的理由,希望能够借助电脑鼠的创作来进而研究与发明更加复杂的机械。

电脑鼠走迷宫一只电脑鼠是具有机电知识整合的基本架构,本身就像是一个智能的机器人。

要在指定的迷宫中比赛,就像是一个人置身于竞赛中,必须要靠本身的判断力、敏捷动作及正确探查周边环境,来赢得胜利。

一般来说,一只电脑鼠需具备有下列三件基本能力:(1) 拥有稳定且快速的行走能力;(2) 能正确判断能力;(3) 记忆路径的能力。

行走能力指的就是电机,当电机收到讯号时,系统必须判断是否能同步行走,遇到转角时,转弯的角度是否得当,一个好的电机驱动程序,可以减少行走时所需要做的校正时间。

判断能力的关键就在于传感器,它的地位如同人类的双眼,一个好的传感器驱动程序,可避免一些不必要的错误动作,如撞壁、行走路线的偏移等等。

而记忆能力就像是大脑,它的功能并没有因为看不见而遭到忽视,相反地,它的地位在整场比赛中是最重要的,他必须把所走过的路都能一一记下来,并将其资料送给系统,让系统整理出最佳路径以避开不必要的路段。

电脑鼠

电脑鼠

一、应用相关环境下完整源代码二、软件程序流程图三、基于周立功源代码创新点1、搜索时算法进行了优化,提高迷宫搜索效率;2、搜索时速度加快并且实现了连续转弯;3、搜索到终点后返回起点时进行搜索,进一步填充迷宫信息;4、冲刺时速度加快并实现连续转弯,可以快速冲到终点。

四、底层驱动创新点底层驱动的创新点主要分为两个部分,一部分是针对搜索阶段的,另一部分针对冲刺阶段。

搜索阶段:电脑鼠搜索驱动的部分采用了分时分段分弯的三段即时驱动实现,由于随电脑鼠购买时附赠的标准程序(以下简称标准程序)的搜索驱动在直线上是以73的最大加速实现,而在入弯和出弯时都会进入每一格的中心以便实现转弯的准确,这样就导致搜索的整体速度无法提高,且对一些比较复杂的弯道无法准确通过。

本程序在对标准程序作了较大的改动后很好的解决了上述问题,且在整体搜索的速度、准确度和可靠度上有了很大的提高。

以下是对一些改动和创新的的分析:一、搜索驱动方法上的改进和创新。

1、搜索驱动更有针对性。

标准程序的搜索只有一套驱动mazeserch,由于本电脑鼠算法的改进创新,标准程序中的一套搜索驱动已经不能完成当前的搜索任务。

本驱动部分给出了两种搜索方式,第一种用于冲刺前的第一次搜索,采用最大速度为90的快速搜索,由于速度的提升,以及配合算法的调用,搜索驱动是重新编写的三段即时驱动,即在较快速度下直线、单弯、连弯连贯即时完成的较为节省时间的一种驱动方式。

而在第一次冲刺完成后搜索算法有所变化要搜索全迷宫,所以第二次搜索利用的是在标准程序中搜索驱动基础上改进的常速快速转弯的搜索驱动,通过对弯道、后转的改进能更好的完成最后的搜索。

两种算法更好的针对电脑鼠算法的变化,在性能上得到了很大的提升。

2、整体搜索更快、更准。

标准程序中的程序整体搜索速度最大是73,比较慢。

本驱动最大搜索速度能达到90,在保证搜索准确可靠的前提下,速度得到了很大的提升。

此外,由于在直线、弯道、后转处的改进使得整体驱动对坐标以及车身位置的检测调整,更可靠更稳定。

电脑鼠走迷宫实验报告附程序

电脑鼠走迷宫实验报告附程序

东南大学第二届IEEE标准电脑鼠走迷宫竞赛电脑鼠原理及其应用机电动力试验平台第二届IEEE标准电脑鼠走迷宫竞赛论文东南大学第二届IEEE标准电脑鼠走迷宫竞赛电脑鼠原理及其应用机电动力试验平台目录一.软件程序框图 (3)二.参赛软件研发过程 (4)三.软硬件调试过程 (4)四.各组员分工 (4)五.体会心得 (5)附录 (6)参考书目 (9)软件程序框图东南大学第二届IEEE标准电脑鼠走迷宫竞赛电脑鼠原理及其应用机电动力试验平台参赛软件研发过程在void main()函数中,采用压栈的方式进行电脑鼠搜索,数组uint8 GmcCrossway[MAZETYPE*MAZETYPE]用于暂存未走过支路坐标。

数组uint8 GucMapBlock[MAZETYPE][MAZETYPE]记录每个点的地图信息,初始化为0x00。

函数void mouseGoahead(int8 cNBlock)、void mazeSearch(void)、void mouseTurnleft(void)、东南大学第二届IEEE标准电脑鼠走迷宫竞赛电脑鼠原理及其应用机电动力试验平台void mouseTurnright(void)、void mouseTurnback(void)和void objectGoTo(int8 cXdst, int8 cYdst)控制电脑鼠的运动状态。

void mapStepEdit(int8 cX, int8 cY)为制作等高图函数,它把记录等高值的数组uint8 GucMapStep[MAZETYPE][MAZETYPE](初始化为0xff)赋值。

当电脑鼠搜索时无方向可走时就按照这个等高图的信息退回上个点,冲刺时也是一样的道理。

另外,为了缩短转弯时间,并且保证电脑鼠的稳定性,采取转弯时整步,直走时半步。

我们在Mouse_Drive.c文件中,加入全局变量int8 maincheck,初始化为0(其中0为不转弯,1为转弯)。

Maze_Robot教程

Maze_Robot教程

主编:胡文杰、王元伟指导老师:黄贤英、杨宏雨重庆理工大学嵌入式实验室2014 年 5 月目录OUTLINE (2)一、电脑鼠案例整体架构 (3)1.1 硬件部分结构图 (3)1.2 硬件部分电路图 (4)二、硬件模型的搭建 (4)2.1 准备工作 (4)2.2 焊接元器件 (6)2.3 电机的制作 (8)2.4 电机的固定及轮子的制作 (10)2.5 模型的完成 (11)三、电机的驱动原理及控制应用 (12)3.1 电机的驱动原理 (12)3.1.1 驱动电路芯片L9110 (12)3.2 电机的控制及应用 (13)四、传感器的原理及应用 (13)4.1 74HC138译码器 (14)4.1.1 译码器的工作原理 (14)4.1.2 译码器在传感器电路中的应用 (15)4.2 载波发生器 (16)4.4 传感器组 (16)4.4.1 传感器组的原理及应用 (16)4.4.2 传感器组的硬件调试说明 (17)五、编译环境及下载工具的安装及使用 (18)5.1编译软件的安装及使用 (18)5.1.1 编译软件的安装 (18)5.1.2 编译软件的使用 (18)5.2 下载软件的使用 (18)六、上位机算法设计 (19)6.1 迷宫形状的设计 (19)6.2 算法流程 (20)6.2.1 主程序流程图 (20)6.2.2 达到终点子程序流程图 (21)6.2.3 返回起点子程序流程图 (22)6.2.4 冲刺子程序流程图 (23)OUTLINEThis tutorial on the principles of IEEE Computer Mouse Maze exploration and production based on 51 single-chip design, infrared sensors, servo motors Maze robot (maze computer mouse). Were analyzed for the 8×8 maze, maze computer mouse on the entire process from hardware design and program design principles are briefly described. Maze robot combines intelligent computers, electronics, machinery, and other multi-disciplinary technical walking robots. The overall structure of the robot maze usually include embedded microcontrollers, sensors, electromechanical moving parts, its function is in a random layout of the maze maze from the starting point to search and find the best path to a path to end. In order to allow the maze to find the best path to the end of the robot in the maze, the robot must have a random walk through the maze, memory maze, maze searching, routing capabilities, the whole robot by mechanical parts, hardware circuit, part of the program algorithm components. Do the maze robot has three main steps: application of structures, sensors and electromechanical hardware model debugging, development and downloading tools.概述本教程就IEEE走迷宫电脑鼠原理进行探索,并设计制作基于51单片机、红外传感器、伺服电机的Maze robot(迷宫电脑鼠)。

电脑鼠机器人迷宫竞赛规则

电脑鼠机器人迷宫竞赛规则

第四届青少年机器人活动暨亚洲机器人锦标赛中国区选拔赛电脑鼠机器人迷宫竞赛规则竞赛要求使用东莞市博思电子数码科技有限公司的电脑鼠机器人器材。

如下图所示:(一)场地尺寸及环境要求1.迷宫场地由8×8个边长为180.00×180.00mm 的正方形单元组成(见图1)。

电脑鼠机器人迷宫竞赛是一种利用嵌入式微控制器、传感器和机电运动部件构成的一种智能的小型机器人比赛,它要求机器人在指定的迷宫中自动探索并找出通往终点的路径,赛中机器人需随时掌握自身的位置信息,准确获取墙壁信息并做记录,最终依靠记忆找出最佳路径并以最短的时间走出迷宫,赢得比赛。

一、简述二、规则2.图2示例场地图3.四周的隔墙将整个迷宫封闭,迷宫隔墙的侧面为白色,顶部为红色。

迷宫的地面为木质,用于隔开每个单元格的围板称为墙壁,迷宫场地的墙壁高50.00mm,厚12.00mm,因此两堵隔墙所构成的通道其实际宽度为168.00mm(示例场地图见图2)使用油漆漆成黑色。

迷宫地面上印有墙壁的定位线,作组装场地时定位墙壁的标记,隔墙侧面和顶部的涂料需能反射红外线,地板的涂料需能吸收红外线。

4.迷宫的起始单元必须有三面隔墙,余下一个出口。

例如,若没有隔墙的出口端为“北”向时,那么迷宫的外墙就构成“东”、“南”、“西”方位的隔墙。

5.6.迷宫场地中,将每个正方形单元的四角每两边相交的位置的点我们定义为“格点”。

除了停泊区域中心的格点外,其余每个格点至少要延伸出一面隔墙或与一面隔墙相接触。

由格点延伸出去的墙壁的组合方式多种多样,以迷宫左下角的一个格点为例,如下图中黑色部分为格点,示例场地图见图2A、从格点处延伸出一块墙壁后,与该节点有关的墙壁的几种布置位置如下:B、从格点处延伸出两块墙壁后,与该节点有关的墙壁的几种布置位置如下:符合本规则的迷宫场地设计方案数量众多,但迷宫的格数始终是8×8格,四边的围墙不变,变化的是围墙内部的各个墙壁,比赛时具体使用场地,由比赛现场公布。

电脑鼠 程序修改说明

电脑鼠  程序修改说明

Mouse_Config.h●速度的修改程序:/***************************************************************************************************常量宏定义--电机运行速度***************************************************************************************************/#define MAXSPEED 250 //【此处修改】/* 电机加速运行时的最大速度*/#define SEARCHSPEED 90 //【此处修改】/* 电机搜索迷宫时的最大速度*/说明:这里是确定电机搜索和冲刺的速度。

maze.c●搜索法则的修改程序:/********************************************************************************************************* ** unction name: crosswayChoice // 【此处修改】** Descriptions: 选择一条支路作为前进方向// 【此处修改】** input parameters: 无// 【此处修改】** output parameters: 无// 【此处修改】** Returned value: 无// 【此处修改】*********************************************************************************************************/ void crosswayChoice (void) // 【此处修改】{ int wang=0; // 【此处修改】if(GucXStart==0){ // 【此处修改】if(GmcMouse.cX<=7){ // 【此处修改】if(GucMouseDir==UP) wang=3; // 【此处修改】if(GucMouseDir==DOWN) wa ng=1; // 【此处修改】if(GucMouseDir==RIGHT) wang=4; // 【此处修改】if(GucMouseDir==LE T) wang=0; // 【此处修改】}else{ // 【此处修改】if(GucMouseDir==UP) wang=4; // 【此处修改】if(GucMouseDir==DOWN) wa ng=0; // 【此处修改】if(GucMouseDir==RIGHT) wang=1; // 【此处修改】if(GucMouseDir==LE T) wang=3; // 【此处修改】} // 【此处修改】} // 【此处修改】if(GucXStart==15){ // 【此处修改】if(GmcMouse.cX<=7){ // 【此处修改】if(GucMouseDir==UP) wang=3; // 【此处修改】if(GucMouseDir==DOWN) wa ng=1; // 【此处修改】if(GucMouseDir==RIGHT) wang=4; // 【此处修改】if(GucMouseDir==LE T) wang=0; // 【此处修改】}else{ // 【此处修改】if(GucMouseDir==UP) wang=4; // 【此处修改】if(GucMouseDir==DOWN) wa ng=0; // 【此处修改】if(GucMouseDir==RIGHT) wang=1; // 【此处修改】if(GucMouseDir==LE T) wang=3; // 【此处修改】} // 【此处修改】} // 【此处修改】switch (wang) { // 【此处修改】case 0: // 【此处修改】rightMethod(); // 【此处修改】break; // 【此处修改】case 1: // 【此处修改】leftMethod(); // 【此处修改】break; // 【此处修改】case 2: // 【此处修改】centralMethod(); // 【此处修改】break; // 【此处修改】case 3: // 【此处修改】frontRightMethod(); // 【此处修改】break; // 【此处修改】case 4: // 【此处修改】frontLeftMethod(); // 【此处修改】break; // 【此处修改】default: // 【此处修改】 break; // 【此处修改】 } // 【此处修改】 } // 【此处修改】说明:我们这里的法则其实是把整个迷宫分为了A 、B 两个区域进行的。

电脑鼠使用说明

电脑鼠使用说明

电脑鼠使用说明1界面简介:2传感和运动控制模块说明:功能:初始化电脑鼠硬件,以及清零电脑鼠的记忆内存。

参数:双击设置四个参数,分别为初始X坐标、初始Y坐标、初始方向、迷宫大小。

相应地一般设置为0、0、MazeUP、8。

功能:电脑鼠待机,静止不动。

参数:时间(毫秒),默认值是100。

功能:电脑鼠搜索前进、不断检测周围迷宫信息。

参数:前进格数、速度、显示数据、遇到岔路是否停止,前进格数一般设置为迷宫边长的一半、速度值一般设置为100步/秒、显示数据就是现实墙壁的信息、一般情况下设置遇到岔路停止。

功能:电脑鼠转弯。

参数:转向、速度,转向分为四个方向,也可以设置为变量,速度一般设置为50。

功能:获取电脑鼠当下在迷宫中的位置信息及运行方向。

参数:自动获取功能:获取单元地图的墙壁信息。

选择地图获取方式:单元地图的存储值,单元的某一方向是否存在墙壁,单元是否已被搜索过。

需要输入的量为单元X和Y坐标,墙壁方向。

参数:X、Y坐标、墙壁方向值,X、Y坐标都是根据相应的函数GetMouseCoorX()和GetMouseCoorY()自动获取的,墙壁方向值就是想要获取的墙壁方向。

功能:获取输入的按键ID。

参数:按键从1到4。

功能:提供三种数据显示方式:显示电脑鼠和迷宫的信息(坐标,方向,单元地图);显示红外传感器和电压数据(调试用);在1~4位上显示自定义的信息(十六进制00~FF)。

参数:基本上是测试、调试、研究、创新的时候才用。

功能:选择相对方向和绝对方向之间的转换方式,需要输入要转换的方向和电脑鼠当前的运动方向。

参数:输入要转换的方向,可以选择变量,然后通过函数GetMouseDir()自动获取当前运行方向,最后赋值到相应的变量里面。

功能:通过对传感器数据进行标定来调整电脑鼠在迷宫中的运动控制。

每一个标定组所对应的参数调整请参照说明书的详细介绍参数:四个选项对应相应的标定项目。

3迷宫简介:迷宫是由18cm×18cm的方格组成,其行列各有8个方格。

电脑鼠规则

电脑鼠规则

电脑鼠规则全文共四篇示例,供读者参考第一篇示例:电脑鼠是一种方便的输入设备,用于控制计算机的操作。

它通常被称为鼠标,是一种通过移动手指或手掌来控制计算机屏幕上的光标位置和选项。

在现代计算机中,鼠标是不可或缺的工具,它使得用户可以更加方便地进行各种操作,如点选、拖动、双击和右击等。

虽然鼠标看起来简单易用,但在使用过程中也有一些规则需要遵守,以确保其能够正常工作并提高使用效率。

要注意鼠标的清洁。

鼠标通常会被灰尘、食物渣滓等杂物所污染,这会导致光标移动不畅或无法准确地跟随操作。

定期清洁鼠标表面以及底部的光学传感器是非常重要的。

可以使用一些清洁液和软布来进行清洁,但要避免使用含有酒精的清洁剂,以免损坏鼠标表面。

要注意鼠标的使用姿势。

正确的鼠标使用姿势可以减少手腕疼痛和其他手部问题的发生。

通常情况下,应该将鼠标放在离键盘不远的位置,手腕应该处于自然的平直状态,而非扭曲或过度伸展。

使用鼠标时要尽量减少手腕的移动,而是通过手臂和肩膀的动作来控制光标的移动。

这样不仅可以减少手腕的负担,还可以提高操作的精准度。

要注意鼠标的点击操作。

鼠标的左键和右键通常分别代表不同的功能,而双击和右击则有着不同的操作方式。

在使用时,要确保轻轻按下鼠标按键,而不是过度用力,以免造成手部不适。

双击和右击的速度也需要适当掌握,过快或过慢都可能导致误操作或无法正常执行命令。

要根据需要调整鼠标的设置。

在计算机设置中,通常可以调整鼠标的速度、灵敏度、滚轮滚动方向等参数,以适应个人的习惯和需求。

一般来说,鼠标速度设置得太快会导致光标难以控制,而速度设置得太慢则会降低使用效率。

建议根据个人习惯和习惯偏好进行调整,以获得最佳的使用体验。

虽然电脑鼠看似简单易用,但在日常使用中也有一些规则需要遵守,以确保其正常工作并提高使用效率。

通过了解并遵守这些规则,可以更好地利用电脑鼠,提高工作效率,减少不必要的疲劳和不适。

希望以上内容对您有所帮助,祝您在使用电脑鼠时能够事半功倍,轻松愉快!第二篇示例:电脑鼠是指连接在计算机上用来操控光标移动的设备,也就是我们常说的鼠标。

电脑鼠 迷宫 仿真程序 mouse

电脑鼠 迷宫 仿真程序 mouse

原链接:/view/9a7c8f010*******be1e9b5a.html侵权请说明即删!/****************************************************************************** *** 程序名称: 电脑鼠模拟环境V5.0** 功能描述: 电脑鼠走迷宫的模拟软件,探索迷宫速度超快,迅速找到终点;注意:迷宫中心是终点。

本程序使用Win-TC编译,图形界面。

下载本程序后将后缀名改为.c,即可在Win-TC下编译。

** 程序作者: 宋元瑞** 修改日期: 2010年10月1日******************************************************************************* /#include <graphics.h>#include <stdlib.h>#include <dos.h>#include <conio.h>typedef unsigned long int uint32;#define closegr closegraph#define ESC 0x011b#define BLANK 14624#define UP 0x01 /*上有墙*/#define DOWN 0x02#define LEFT 0x04#define RIGHT 0x08#define X 25 /* 迷宫单位规格,实物18 *//*#define W 20 迷宫宽度WIDE,实物16.8 *//*#define L 25 迷宫长度LENGTH,实物18 */#define N 16 /* 迷宫规格16×16,实物同*/#define Xfore 120 /* 迷宫x离屏幕边缘的距离*/#define Yfore 40 /* 迷宫y离屏幕边缘的距离*/#define menuWidth 120 /*菜单的宽度*/#define menuHight 25 /*菜单的高度*//*#define Z 1.5 屏幕放大1.5倍*/int first=1;int mousex,mousey; /*鼠标的坐标*/volatile int xnow=15,ynow=0; /*电脑鼠的当前x,y坐标*/int stepnum=0;int start=0;int temptime=0;uint32 gezi[16][16];/*每个格子的信息存储器,16个x16个y,用一个32位二进制数的后四位表示墙壁信息(只用这4位)*//* 0001=UP0010=DOWN0100=LEFT1000=RIGHT将这些数字与gezi[][]的值进行&运算,即可获得墙壁信息0001=UP____| |0100=LEFT| ↓|1000=RIGHT|____|0010=DOWN*/uint32 mouse[16][16]; /*用于电老鼠在循迹时接收gezi传过来的墙壁信息,并保存。

电脑鼠驱动程序

电脑鼠驱动程序

电脑鼠驱动程序#include "stc12c5620ad.h"#include "Init.h"#include"intrins.h"#define UINT8 unsigned char#define INT8 signed char#define UINT16 unsigned int#define INT16 signed int#define UINT32 unsigned long#define INT32 signed long//===================================== ===========================void Uart_SendByte(char dat);void UART_Send_Enter(void);void UART_Send_Str(UINT8 *s);void u32tostr(UINT32 dat,INT8 *str);UINT32 strtou32(UINT8 *str);void HextoStr(UINT8 dat,INT8 *str);//===================================== ==========================void Delay_Ms(UINT16 t);void Turn_Left(void);void Turn_Right(void);void Turn_Up(void);void Turn_Back(void);void Turn_Turned(void);//===================================== ==========================UINT8 data SysTime=0;UINT8 ReDat;bit Count=0;bit Senser1;bit Senser2;bit Senser3;bit Senser4;bit Senser5;UINT8 Sensers=0;//===================================== ===========================/********红外发射**************************************************/sbit DS1=P1^7;sbit DS2=P1^7;sbit DS3=P1^5;sbit DS4=P1^4;sbit DS5=P1^6;/********红外接收**************************************************/sbit RE1=P2^2;sbit RE2=P2^6;sbit RE3=P2^3;sbit RE4=P2^1;sbit RE5=P2^7;/********按键**************************************************/sbit KEY1=P3^4;sbit KEY2=P2^5;//===================================== ========================void main(void){UINT8 t;PWM_Init();Init_Timer0();initUart();PORT_Init();//------------------------------------------------------------------DS1=1;DS2=1;DS3=1;DS4=1;DS5=1;EA=1;UART_Send_Str("Hellow Word\n");// while(KEY1);/**/while(1){// Sensers = 0;// Sensers = (Senser2|Senser5|Senser4|Senser3|Senser1); // KEY1=1;// EA=0;if((!Senser1)){Turn_Right();Uart_SendByte('R');}else if((!Senser2 || !Senser5)){Turn_Left();Uart_SendByte('L');}else if(!Senser5 && !Senser4){Turn_Turned();Uart_SendByte('T');}else if(!Senser1 && !Senser2) {Turn_Up();Uart_SendByte('U');}else{Turn_Up();Uart_SendByte('U');}/* else{CCAP0L=CCAP0H=0xff; CCAP2L=CCAP2H=0xff; CCAP1L=CCAP1H=0xff; CCAP3L=CCAP3H=0xff; Uart_SendByte('S');}*/// EA=1;// if(ReDat){ReDat=0;}// Turn_Left();Delay_Ms(100);// Turn_Right();// Delay_Ms(3000);// Turn_Up();// Delay_Ms(3000);// Turn_Back();// Delay_Ms(3000);// Turn_Turned();// if(KEY1==0)goto Loop;////Uart_SendByte(Sensers);/* if(!Senser1)Uart_SendByte('1');if(!Senser2)Uart_SendByte('2');if(!Senser3)Uart_SendByte('3');if(!Senser4)Uart_SendByte('4');if(!Senser5)Uart_SendByte('5');*/}}void Delay_Ms(UINT16 t){UINT16 i;for(t;t>0;t--)for(i=320;i>0;i--);}/********左拐*****************************************/ void Turn_Up(void)CCAP0L=CCAP0H=15;CCAP2L=CCAP2H=255;CCAP1L=CCAP1H=30;CCAP3L=CCAP3H=255;Delay_Ms(400);CCAP0L=CCAP0H=0xff;CCAP2L=CCAP2H=0xff;CCAP1L=CCAP1H=0xff;CCAP3L=CCAP3H=0xff;}/********后退*****************************************/ void Turn_Back(void){CCAP0L=CCAP0H=255;CCAP2L=CCAP2H=50;CCAP1L=CCAP1H=255;CCAP3L=CCAP3H=50;Delay_Ms(400);CCAP0L=CCAP0H=0xff;CCAP2L=CCAP2H=0xff;CCAP1L=CCAP1H=0xff;CCAP3L=CCAP3H=0xff;/********右拐*****************************************/ void Turn_Left(void){CCAP0L=CCAP0H=255;CCAP2L=CCAP2H=50;CCAP1L=CCAP1H=50;CCAP3L=CCAP3H=255;Delay_Ms(400);CCAP0L=CCAP0H=0xff;CCAP2L=CCAP2H=0xff;CCAP1L=CCAP1H=0xff;CCAP3L=CCAP3H=0xff;}/********前进*****************************************/ void Turn_Right(void){CCAP0L=CCAP0H=50;CCAP2L=CCAP2H=255;CCAP1L=CCAP1H=255;CCAP3L=CCAP3H=50;Delay_Ms(400);CCAP0L=CCAP0H=0xff;CCAP2L=CCAP2H=0xff;CCAP1L=CCAP1H=0xff;CCAP3L=CCAP3H=0xff;}/********原地转身*****************************************/ void Turn_Turned(void){CCAP0L=CCAP0H=255;CCAP2L=CCAP2H=50;CCAP1L=CCAP1H=50;CCAP3L=CCAP3H=255;Delay_Ms(700);CCAP0L=CCAP0H=0xff;CCAP2L=CCAP2H=0xff;CCAP1L=CCAP1H=0xff;CCAP3L=CCAP3H=0xff;}void Uart_SendByte(char dat){ES=0;TI=0;SBUF = dat;while(!TI);TI=0;ES=1;}/************************************************************** ************- 功能描述:串口发送0d 0a ,即回车换行- 函数属性:外部,使用户使用- 参数说明:无- 返回说明:无- 注:此函数就是发送0d 0a这两个字节,在“超级终端”上会有回车换行的效果*************************************************************** ***********/void UART_Send_Enter(void){Uart_SendByte(0x0d);Uart_SendByte(0x0a);}/************************************************************** ************- 功能描述:串口发送字符串- 函数属性:外部,使用户使用- 参数说明:s:指向字符串的指针- 返回说明:无- 注:如果在字符串中有'\n',则会发送一个回车换行*************************************************************** ***********/void UART_Send_Str(UINT8 *s){UINT16 i=0;while(s[i]){if(s[i]=='\n') UART_Send_Enter();else Uart_SendByte(s[i]);i++;}}/************************************************************** ****- 功能描述:将一个32位的变量dat转为字符串,比如把1234转为"1234"- 函数属性:外部,用户可调用- 参数说明:dat:带转的long型的变量str:指向字符数组的指针,转换后的字节串放在其中- 返回说明:无*************************************************************** ***/void u32tostr(UINT32 dat,INT8 *str){UINT8 temp[11];UINT8 i=0,j=0;i=0;while(dat){temp[i]=dat%10+0x30;i++;dat/=10;}j=i;for(i=0;i<j;i++){str[i]=temp[j-i-1];}if(!i) {str[i++]='0';}str[i]=0;}/************************************************************** ****- 功能描述:将一个字符串转为32位的变量,比如"1234"转为1234- 函数属性:外部,用户可调用- 参数说明:str:指向待转换的字符串- 返回说明:转换后的数值*************************************************************** ***/UINT32 strtou32(UINT8 *str){UINT32 temp=0;UINT32 fact=1;UINT8 i=0;while(str[i]){if(str[i]>='9' || str[i]<='0'){temp=0;return temp;}else{temp += ((str[i]-0x30)*fact);fact*=10;i++;}}return temp;}/************************************************************** ****- 功能描述:将一个16进制的数转为字符串,比如把0xaa转为"0xaa"- 函数属性:外部,用户可调用- 参数说明:dat:带转的一个字节str:指向字符数组的指针,转换后的字节串放在其中- 返回说明:无*************************************************************** ***/void HextoStr(UINT8 dat,INT8 *str){UINT8 temp;temp = dat&0x0f;if(temp>9)temp += 0x57; else temp += 0x30;str[1] = temp;temp = (dat>>8) & 0x0f;if(temp>9)temp += 0x57; else temp += 0x30;str[0] = temp;}void uart(void) interrupt 4 {if(RI){RI=0;ReDat=SBUF;}else TI=0;}void timer0(void) interrupt 1 {EA=0;SysTime++;if(DS1==1 && SysTime==46) {DS1=0;DS3=0;DS4=0;DS5=0;SysTime=0;}if(SysTime<46 && DS1==1) {Senser1 = RE1;Senser2 = RE2;Senser3 = RE3;Senser4 = RE4;Senser5 = RE5;}if(DS1==0 && SysTime==80) {DS1=1;DS3=1;DS4=1;DS5=1;SysTime=0;}EA=1;}</j;i++)。

电脑鼠规则

电脑鼠规则

电脑鼠规则全文共四篇示例,供读者参考第一篇示例:电脑鼠是电脑的一种输入设备,也称为鼠标。

它是一种通过手感移动来控制光标位置的工具。

在如今的信息时代,电脑鼠已经成为人们工作和生活中必不可少的一部分。

虽然电脑鼠看似简单易用,但也有一些使用规则需要遵守,以确保它的正常运行和使用效果。

保持干燥清洁。

电脑鼠一般是由塑料或金属等材料制成,长时间使用会导致灰尘、油污等堆积在鼠标表面和传感器处,影响其灵敏度和精准度。

定期清理电脑鼠是十分必要的。

可以使用软布或棉签蘸湿消毒酒精或清洁液轻轻擦拭表面,注意不要让水或清洁液渗入鼠标内部。

正确使用。

在使用电脑鼠时,应该将手掌平放在电脑鼠上,而不是将手指插入鼠标孔中。

手指插入鼠标孔中会影响鼠标的传感器运作,导致光标跳动或失灵。

在使用电脑鼠时,要保持手掌和手腕与桌面平行,避免在使用过程中产生过大的拉力,这样既可以保护电脑鼠,也可以减少手腕疲劳。

适当调节灵敏度。

不同人对电脑鼠的灵敏度要求有所不同,可以根据个人的使用习惯和手感来调节电脑鼠的灵敏度。

一般来说,可以在电脑系统设置中找到鼠标属性选项,调节鼠标速度和加速度。

一般来说,桌面操作时,鼠标速度设置的稍快点比较方便,游戏或绘图时,鼠标速度设置的稍慢点比较舒适。

注意保存和携带。

在不使用电脑鼠的时候,应该将其放在干燥通风的地方,避免长时间暴晒或受潮。

在携带电脑鼠的时候,应该将鼠标线缠绕整齐,以防止线缆交织或打结,不要用力拉扯鼠标线,以免损坏连接器或线材。

如果需要携带电脑鼠出差或旅行,可以准备一个专用的鼠标包或鼠标套,避免鼠标受到挤压或碰撞。

电脑鼠虽然看似简单,但也有一些使用和保养规则需要遵守,只有合理正确地使用和保养,才能更好地发挥电脑鼠的功能,为我们的生活和工作带来更大的便利。

希望大家能够认真遵守这些规则,让电脑鼠在我们的生活中,发挥更大的作用。

第二篇示例:电脑鼠规则是指在使用电脑时,鼠标的使用规范和操作技巧。

鼠标是电脑的重要输入设备之一,它可以帮助用户在屏幕上进行各种操作,如点击、拖拽、滚动等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Micromouse.h●搜索法则宏定义●绝对方向宏定义●老鼠相对方向宏定义●相对绝对方向转换表●点格坐标结构体Mouse_config.h●迷宫尺寸●迷宫终点宏定义●探索法则——调试预留●速度设定●ONEBLOCK尺寸Wireless.h 参见(Maze出厂)zlg7289.h zlg7289.c●SPI读●SPI写●……Type.h●自定义数据类型Mouse_Drive.h包含头文件:Micromouse.h Mouse_config.h Type.h Wireless.h/****************************************Copyright(c)****************************************************** Guangzhou ZHIYUAN electronics Co.,LTD. **** ****--------------FileInfo---------------------------------------------------------------------------------** File Name: maze.c** Last modified Date: 2007/09/24** Last V ersion: V1.0** Description: 根据底层程序取得的迷宫信息,经过该智能算法控制电脑鼠的下一状态,并送往底层驱动程** 序执行。

****--------------------------------------------------------------------------------------------------------** Created By: Liao Maogang** Created date: 2007/09/08** V ersion: V1.0** Descriptions:****--------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** V ersion:** Description:*********************************************************************** ************************************//******************************************************************** *************************************包含头文件********************************************************************* ************************************/#include "Maze.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 = W AIT; /* 状态机,初始状态为等待*/static uint8 GucMapStep[MAZETYPE][MAZETYPE] = {0xff}; /* 保存各坐标的等高值*/static MAZECOOR GmcStack[MAZETYPE * MAZETYPE] = {0}; /* 在mapStepEdit()中作堆栈使用*/static MAZECOOR GmcCrossway[MAZETYPE * MAZETYPE] = {0}; /* Main()中暂存未走过支路坐标*//******************************************************************** *************************************** Function name: Delay** Descriptions: 延时函数** input parameters: uiD :延时参数,值越大,延时越久** output parameters: 无** Returned value: 无********************************************************************* ************************************/void delay (uint32 uiD){for (; uiD; uiD--);}/******************************************************************** *************************************** Function name: mapStepEdit** Descriptions: 制作以目标点为起点的等高图** input parameters: 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) {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;}}}}/******************************************************************** *************************************** Function name: mouseSpurt** Descriptions: 电脑鼠从起点以最短路径跑向终点** input parameters: 无** output parameters: 无** Returned value: 无********************************************************************* ************************************/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(cXdst,cYdst);/* 运行到指定目标点*/}/******************************************************************** *************************************** Function name: objectGoTo** Descriptions: 使电脑鼠运动到指定坐标** input parameters: cXdst: 目的地的横坐标** cYdst: 目的地的纵坐标** output parameters: 无** Returned value: 无********************************************************************* ************************************/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; /* 计算方向偏移量*/if (cNBlock) {mouseGoahead(cNBlock);/* 前进cNBlock步*/}cNBlock = 0; /* 任务清零*//** 控制电脑鼠转弯*/switch (cDirTemp) {case 1:mouseTurnright();break;case 2:mouseTurnback();break;case 3:mouseTurnleft();break;default:break;}}/** 判断任务是否完成,否则继续前进*/if (cNBlock) {mouseGoahead(cNBlock);}}/******************************************************************** *************************************** Function name: mazeBlockDataGet** Descriptions: 根据电脑鼠的相对方向,取出该方向上迷宫格的墙壁资料** input parameters: ucDir: 电脑鼠的相对方向** output parameters: 无** Returned value: 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(GucMapBlock[cX][cY]);/* 返回迷宫格上的资料*/}/******************************************************************** *************************************** Function name: rightMethod** Descriptions: 右手法则,优先向右前进** input parameters: 无** output parameters: 无** Returned value: 无********************************************************************* ************************************/void rightMethod (void){if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_R) && /* 电脑鼠的右边有路*/(mazeBlockDataGet(MOUSERIGHT) == 0x00)) { /* 电脑鼠的右边没有走过*/mouseTurnright();/* 电脑鼠右转*/return;}if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_F) && /* 电脑鼠的前方有路*/(mazeBlockDataGet(MOUSEFRONT) == 0x00)) { /* 电脑鼠的前方没有走过*/return;/* 电脑鼠不用转弯*/}if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_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] & MOUSEW AY_L) && /* 电脑鼠的左边有路*/(mazeBlockDataGet(MOUSELEFT ) == 0x00)) { /* 电脑鼠的左边没有走过*/mouseTurnleft();/* 电脑鼠左转*/return;}if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_F) && /* 电脑鼠的前方有路*/(mazeBlockDataGet(MOUSEFRONT) == 0x00)) { /* 电脑鼠的前方没有走过*/return;/* 电脑鼠不用转弯*/}if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_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] & MOUSEW AY_F) && /* 电脑鼠的前方有路*/(mazeBlockDataGet(MOUSEFRONT) == 0x00)) { /* 电脑鼠的前方没有走过*/return;/* 电脑鼠不用转弯*/}if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_R) && /* 电脑鼠的右边有路*/(mazeBlockDataGet(MOUSERIGHT) == 0x00)) { /* 电脑鼠的右边没有走过*/mouseTurnright();/* 电脑鼠右转*/return;}if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_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] & MOUSEW AY_F) && /* 电脑鼠的前方有路*/(mazeBlockDataGet(MOUSEFRONT) == 0x00)) { /* 电脑鼠的前方没有走过*/return;/* 电脑鼠不用转弯*/}if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_L) && /* 电脑鼠的左边有路*/(mazeBlockDataGet(MOUSELEFT ) == 0x00)) { /* 电脑鼠的左边没有走过*/mouseTurnleft();/* 电脑鼠左转*/return;}if ((GucMapBlock[GmcMouse.cX][GmcMouse.cY] & MOUSEW AY_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: crosswayCheck** Descriptions: 统计某坐标存在还未走过的支路数** input parameters: ucX,需要检测点的横坐标** ucY,需要检测点的纵坐标** output parameters: 无** Returned value: ucCt,未走过的支路数********************************************************************* ************************************/uint8 crosswayCheck (int8 cX, int8 cY){uint8 ucCt = 0;if ((GucMapBlock[cX][cY] & 0x01) &&/* 绝对方向,迷宫上方有路*/(GucMapBlock[cX][cY + 1]) == 0x00) { /* 绝对方向,迷宫上方未走过*/ ucCt++;/* 可前进方向数加1 */}if ((GucMapBlock[cX][cY] & 0x02) && /* 绝对方向,迷宫右方有路*/(GucMapBlock[cX + 1][cY]) == 0x00) { /* 绝对方向,迷宫右方没有走过*/ ucCt++;/* 可前进方向数加1 */}if ((GucMapBlock[cX][cY] & 0x04) && /* 绝对方向,迷宫下方有路*/(GucMapBlock[cX][cY - 1]) == 0x00) { /* 绝对方向,迷宫下方未走过*/ ucCt++;/* 可前进方向数加1 */}if ((GucMapBlock[cX][cY] & 0x08) && /* 绝对方向,迷宫左方有路*/(GucMapBlock[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;}}/******************************************************************** *************************************** Function name: main** Descriptions: 主函数** input parameters: 无** output parameters: 无** Returned value: 无********************************************************************* ************************************/main (void){uint8 n = 0; /* GmcCrossway[]下标*/uint8 ucRoadStat = 0; /* 统计某一坐标可前进的支路数*/uint8 ucTemp = 0; /* 用于START状态中坐标转换*/mouseInit();/* 底层驱动的初始化*/zlg7289Init();/* 显示模块初始化*/while (1) {switch (GucMouseTask) { /* 状态机处理*/case W AIT:sensorDebug();voltageDetect();delay(100000);if (keyCheck() == true) { /* 检测按键等待启动*/zlg7289Reset();/* 复位ZLG7289 */GucMouseTask = START;}break;case START: /* 判断电脑鼠起点的横坐标*/mazeSearch();/* 向前搜索*/if (GucMapBlock[GmcMouse.cX][GmcMouse.cY] & 0x08) { /* 判断电老鼠左边是否存在出口*/if (MAZETYPE == 8) { /* 修改四分之一迷宫的终点坐标*/GucXGoal0 = 1;GucXGoal1 = 0;}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: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 { /* 没有可前进方向,回到最近支路*/while (--n) {ucRoadStat = crosswayCheck(GmcCrossway[n].cX,GmcCrossway[n].cY);/* 统计最近支点未走过的方向数*//** 若存在未走过的路,则前往该支点,并跳出循环* 否则继续查找还有未走过的支路。

相关文档
最新文档