版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/<***************************************Copyright
(c)****************************************************
**GuangzhouZHIYUANelectronicsCo.,LTD.
**
Info------------------------------------------------------------------------------------------
**FiIeName:main.c
**LastmodifiedDate:2008/02/14
**LostVeraion:V1.00
*♦Description:MicroMouse615上的无记忆功能的走迷宫实验
**
**----------------------------------------------------------------------------------------------
**CreatedBy:廖茂刚
**Createddate:
**Version:
**Descriptions:
♦4
*4----------------------------------------
**Modifiedby:
**Modifieddate:
**Version:
**Description:
**
**************************************************************"*************************************
****/
/*************************************************************朴*************************************
*****
包含头文件
**************************************************************科*************************************
****/
#include"hw_memmap.h"
#include"hwints.h"
#include"hw_types.h"
#include"interrupt,h"
#include"gpio.h"
#include"sysetI.h"
#incIude"Systick.h"
#include"Timer,h"
#include"Pwm.h"
#include"Type.h"
#include"Zlg7289.h"
/************************/**************************************************************************
*****
PB端口定义打外线传感器
**************************************************************杆*************************************
*林*/
#defineIRSEND_BEVELGPIO_PIN_O/*驱动斜角红外的调制信号
*/
defineLEFTSIDEGPI0_PIN_1/*左方传感器输出的信号
*/
#defineFRONTSIDE_LGPIO_PIN_2/*左前方传感器输出的信号
*/
#dcfincFRONTSIDEGPI0_PIN_3/*前方传感器输出的信号
*/
枇efineFRONTSIDE_RGPI0_PIN_4/*右前方传感器输出的信号
*/1
#defineRIGHTSIDEGPI0_PIN_5/*右方传感器输出的信号
*/
/林***********************************************************梆*************************************
*****
PC端口定义KEY键
木4木木木木木木木木木小木木木木木木木木木木小木木木小木木木木木4木木木木木木木木木木小木木小木木小木木小木♦木木。木木木小木小木木木小木木小木♦木木。木木。木木木小木4小木木木木木木木4木木木小木♦木
****/
#defineKEYGPI0_PIN_4/*按键连接的端口
/*************************************************************科*************************************
*****
PD端口定义步进电机
****/
#definePHRA1GPIOPIN0/*右侧步进电机的A1相
#definePHRA2GPIO_PIN_1/*右侧步进电机的A2相
#definePHRB1GPIO_PIN_2/*右侧步进电机的B1相
*/
#definePHRB2GPIO_PIN_3/*右侧步进电机的B2相
*/1
^definePHLA1GPI0_PIN_4/*左侧步进电机的A1相
#definePHLA2GPI0_PIN_5/*左侧步进电机的A2相
*/
#definePHLB1GPI0_PIN_6/*左侧步进电机的B1相
*/
#definePHLB2GPI0_PIN_7/*左侧步进电机的B2相
/*************************************************************林*************************************
*****
PE端口定义传感器红外发射驱动左前右正向
****/
#defineIRSENDSIDEGPIOPIN0/*驱动左前右正向红外发射
*/
/^******************************^*****************************^*****************************^*******
*****
常量宏定义一迷宫类型
*************************我***********************************杵*************************************
****/
#dcfincMAZETYPE8/*8:四分之一迷宫;16:全迷
宫*/
/****************************************************************************************************
*****
常量宏定义一前进一个迷宫格步进电机需要走的步数
*=»**/
枇efineONEBLOCK125
/****************************************************************************************************
常量宏定义一电脑鼠状态
**************************************************************林*************************************
****/
#defineSTOP0/*电脑鼠停止
*/
#defineGOAHEAD1/*电脑鼠前进
*/1
#defineTURNLEFT3/*电脑鼠向左转
*/
defineTURNRIGHT4/*电脑鼠向右转
*/
#defineTURNBACK5/*电脑鼠向后转
*/
/************************糅**************************************************************************
*****
常量宏定义一传感器
*****************************************************************************************************
****/
#defineLEFT0/*左方传感器
*/
枇efineFRONTL1/*左前方传感器
*/
#defineFRONT2/*前方传感器
*/1
#defineFRONTR3/*右前方传感器
#defineRIGHT4/*右方传感器
*/
/*************************************************************"*************************************
*林**
常量宏定义一电机状态
*****************************************************************************************************
****/
#defineMOTORSTOP0/*电机停止
*/
#defineWAITONESTEP1/*电机暂停一步
#defineMOTORRUN2/*电机运行
*/1
/********************************************************************************************>»*******
*****
常量宏定义一电机运行方向
**************************************************************梆*************************************
****/
#defineMOTORGOAHEAD0/*电机前进
♦/
#defineMOTORGOBACK1/*电机后退
*/
/<***************************************************************************************************
*****
结构体定义
**************************************************************"*************************************
****/
structmotor{
int8cState;/*电机运行状态
*/1
int8eDir;/*电机运行方向
*/
uint32uiPulse;/*电机需要转动的步数
*/1
uint32uiPulseCtr;/*电机已转动的步数
*/
int32iSpeed;/*电机转动速度
*/
};
typedefstructmotorMOTOR;
/************************糅**************************************************************************
*****
定义全局变量
*****************************************************************************************************
****/
staticMOTORGmRight={MOTORSTOP.MOTORGOAHEAD,0,0,0);/*定义并初始化右电机状态
*/1
staticMOTORGmLeft={MOTORSTOP.MOTORGOAHEAD.0.0.0):/*定义并初始化左电机状态
*/
staticuint8GucMouseState=STOP;/*保存电脑鼠当前运行状态
*/
staticuint32GuiAccelTabIe[300]={0};/*电机加减速各阶段定时器值*/
staticint32GiMaxSpeed=70:/*保存允许运行的最大速度
*/
staticuint8GucDistance[5]={0:;/*记录传感器状态*/
/*************************************************************杆*************************************
*****
**Functionname:deIay
**Descriptions:延时函数
**inputparameters:uiD:延时参数,值越大,延时越久
**outputparameters:无
**Returnedvalue:无
*****************************************************************************************************
*>»**/
voiddelay(uint32uiD)
I
for(;uiD;uiD-);
J
/************************它**************************************************************************
*****
**Fundionname:rightMotorContr
**Descriptions:右步进电机驱动时序
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
*****************************************************************************************************
****/
voidrightMotorContr(void)
(
staticint8cStep=0;/*保存电机当前位置*/
switch(GmRight.cDir){
caseMOTORGOAHEAD:/*向前步进
*/1
cStep=(cStep+1)%8:
break;
caseMOTORGOBACK:/*向后步进
*/1
cStep=(cStep+7)%8;
break;
default:
break;
switch(cStep)(
case0:/♦A2B2
*/
GPIOPinWrite(GPIOPORTDBASE.
PHRA1|PHRA2|PHRB1|PHRB2,
PHRA1|PHRA2|PHRB1|PHRB2);
break;
case1:/*A2
*/
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1|PHRA2|PHRB1|PHRB2,
PHRA1|PHRA2);
break;
case2:/♦A2B1
*/
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1|PHRA2|PHRB1|PHRB2.
PHRA1|PHRA2|PHRB2);
break;
case3:/♦Bl
*/1
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1|PHRA2|PHRB1|PHRB2,
PHRB2);
break;
case4:/*A1B1
*/1
GPIOPinWrite(GPIO_PORTD_BASE.
PHRA1|PHRA2|PHRB1|PHRB2.
PHRA2|PHRB2);
break;
case5:/♦A1
*/
GPIOPinWrite(GPIO^PORTD_BASE,
PHRA1|PHRA2|PHRB1|PHRB2,
PHRA2);
break;
case6:/*A1B2
*/
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1|PHRA2|PHRB1|PHRB2,
PHRA2|PHRB1|PHRB2):
break;
case7:/*B2
*/
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1|PHRA2|PHRB1|PHRB2.
PHRB1|PHRB2):
break;
default:
break;
I
)
/*************************************************************杆*************************************
*****
**Functionname:leftMotorContr
**Dcacriptiona:左步进电机驱动时序
**inputparameters:GmLeft.cDir:电机运行方向
**outputparameters:无
**Returnedvalue;无
***************************************************************:**************************************
****/
voidleftMotorContr(void)
(
staticint8cStep=0;/*保存电机当前位置*/
switch(GmLeft.cDir)(
caseMOTORGOAHEAD:/*向前步进
*/
cStep=(cStep+1)%8;
break;
caseMOTORGOBACK:/*向后步进
*/
cStep=(cStep+7)%8;
break;
default:
break;
)
switch(cStep){
case0:/*A2B2
*/1
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1|PHLA2|PHLB1|PHLB2.
PHLA1|PHLA2|PHLB1|PHLB2);
break;
case1:/♦B2
*/
GPIOPinWrite(GPIPORTD„BASE,
PHLA1|PHLA2|PHLB1|PHLB2,
PHLB1|PHLB2);
break;
case2:/*A1B2
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1|PHLA2|PHLB1|PHLB2.
PHLA2|PHLB1|PHLB2);
break;
case3:/*A1
*/
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1|PHLA2|PHLB1|PHLB2.
PHLA2);
break;
cose4:/*A1B1
*/
GPIOPinWrite(GPI0PORTDBASE.
PHLA1|PHLA2|PHLB1|PHLB2,
PHLA2|PHLB2):
break;
case5:/*B1
*/1
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1|PHLA2|PHLB1|PHLB2,
PHLB2);
break;
case6:/♦A2B1
*/
GPIOPinWrite(GPIO_PORTD_BASE,
PHLA1|PHLA2|PHLB1|PHLB2,
PHLA1|PHLA2|PHLB2);
break;
case7:/*A2
*/1
GPIOPinWrite(GPIO_PORTD_BASE.
PHLA1|PHLA2|PHLB1|PHLB2,
PHLA1|PHLA2);
break;
default:
break;
)
I
/<***************************************************************************************************
*****
**Functionname:speedContrR
**Descriptions:右电机速度调节
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
*******************************
*=♦**/
voidspeedContrR(void)
int32iDPusIe;
iDPusle=GmRight.uiPulse-GmRight.uiPulseCtr;/*统计电机还剩余的步数*/
if(iDPusle<=GmRight.iSpeed){
GreRight.iSpeed一:
Ielse{/*非减速区间,那么加速到最大值
*/
if(GmRight.iSpeed<GiMaxSpeed){
GmRight.iSpeed";
}else{
GriRight.iSpeed-;
)
I
if(GmRight.iSpeed<0)(/*设置速度下限*/
GmRight.iSpeed=0:
}
TimerLoadSet(TIMER0_BASE,TIMER_A,GuiAccelTabIe[GmRight.iSpeed]);/*设置定时时间
♦/
)
/*************************************************************林*************************************
*****
**Functionname:speedContrL
**Descriptions:左电机速度调节
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
**************************************************************林*************************************
****/
voidspeedContrL(void)
(
int32iDPusle;
iDPusIe=GmLeft.uiPulse-GmLeft.uiPuIseCtr;/*统计电机还剩余的步数*/
if(iDPusle<=GmLeft.iSpeed){
GmLeft.iSpeed一;
}else{/*非减速区间,那么加速到最大值
*/
if(GmLeft.iSpeed<GiMaxSpeed){
GmLeft.iSpeed++;
}
)
if(GmLeft.iSpeed<0){/*设置速度下限*/
GmLeft.iSpeed=0;
)
TimerLoadSet(TIMER1_BASE,TIMER_A,GuiAcceITabIe[GmLeft.iSpeed]);/*设置定时时间
*/1
}
/*************************************************************"*************************************
*林**
**Functionname:TimerOA_ISR
**Descriptions:TimerO中断效劳函数
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
**************************************************************杆*************************************
****/
voidTimerOA_ISR(void)
(
staticint8n=0,m=0;
TimerlntClear(TIMERO_BASE,TIMER_TIMA_TIMEOUT);/*去除定时器0中断。
*i
switch(GmRight.cState){
caseMOTORSTOP:/*停止,同时清零速度和脉冲
值*/
GriRight.iSpeed=0;
GmRight.uiPulse=0;
GriRight.uiPulseCtr=0;
break;
caseWAITONESTEP:/*暂停一步
*/
GmRight.cState=MOTORRUN;
break;
caseMOTORRUN:/*电机运行
*/
if(GucMouseState==GOAHEAD){/*根据传感器状态微调电机位置
*/
if(GucDistance[FRONTL]&&(GucDistance[FRONTR]==0)){/*左前方有障碍,且前方无挡板*/
if(n==1)(
GriRight.cState=WAITONESTEP:/*下一次电机暂停
*/
)
n++;
n%=2;
}else(
n=0:
}
if((GucDistance[RIGHT]==1)&&(GucDistance[LEFT]=0)){/*离右挡板太远,且左方无挡板*/
if(m=3){
GmRight.cState=WAITONESTEP:/*下一次电机暂停
*/
m++;
m%=6:
}else(
m=0;
)
I
rightMotorContr();/*推动电机转动一步
*/
break;
default:
break;
)
/*
*是否完成任务判断
*/1
if(GmRight.cState!=MOTORSTOP){
GmRight.uiPulseCtr++;/*运行脉冲计数
*/1
speedContrRO:/*速度调节
♦/
if(GmRight.uiPuIseCtr>=GmRight.uiPulse){
GriRight.cState=MOTORSTOP:
GriRight.uiPulseCtr=0;
GmRight.uiPulse=0:
GmRight.iSpeed=0;
)
)
)
/*************************************************************林*************************************
*****
**Functionname:Timer1A_ISR
**Descriptions:Timeri中断效劳函数
**inputparameters:GmLeft.cState:驱动步进电机的时序状态
**GmLeft.cDir:步进电机运动的方句
**outputparameters:无
**Returnedvalue:无
*****************************************************************************************************
*=»**/
voidTimer1A_ISR(void)
(
staticint8n=0,m=0;
TimerlntClear(TIMER1_BASE,TIMER_TIMA_TIMEOUT);/*去除定时器1中断。
*/
switch(GmLeft.cState){
caseMOTORSTOP:/*停止,同时清零速度和脉冲
值*/
GmLeft.iSpeed=0;
GmLeft.uiPuIse=0:
GmLeft.uiPulseCtr=0;
break;
caseWAITONESTEP:/*暂停一步
*/
GmLeft.cState=MOTORRUN;
break;
caseMOTORRUN:/*电机运行
*/
if(GucMouscStatc=GOAHEAD)(/*根据传感器状态微调电机位贵
*/
if(GucDistance[FRONTR]&&(GucDistance[FRONTL]=0)){
if(n==1)(
GmLeft.cState=WAITONESTEP:
I
n++;
n%=2;
}else{
n=0:
1
if((GucDistance[LEFT]==1)&&(GucDistance[RIGHT]—0)){
if(m=3){
GmLeft.cState=WAITONESTEP;
1
m++;
m%=6;
}else(
m=0;
leftMotorContr();/*电机驱动程序
*/
break;
default:
break;
}
/*
*是否完成任务判断
*/
if(GmLeft.cState!=MOTORSTOP){
GmLeft.uiPuIseCtr++:/*运行脉冲计数
*/
speedContrLO:/*速度调节
if(GmLeft.uiPuIseCtr>=GmLeft.uiPulse){
GmLeft.cState=MOTORSTOP:
GmLeft.uiPuIseCtr=0:
GmLeft.uiPulse=0;
GraLeft.iSpeed=0;
I
)
/*************************************************************杆*************************************
*****
**Functionname:irSendFreq
**Dcacriptiona:发送红外线。
**inputparameters:uiFreq:红外线调制频率
**eNumber:选择需要设置的PWM模块
**outputparameters:无
**Returnedvalue:无
*=»**/
voidirSendFreq(uint32uiFreq,int8eNumber)
(
uiFreq=SysCtICIockGet()/uiFreq;
switch(eNumber){
case1:
PlffMGenPeriodSet(PWM_BASE,PWM_GEM_1,uiFreq);/*设置PWM发生器1的周期
*/
PVIMPuIseWidthSet(PWM_BASE,PWM_0UT_2,uiFreq/2):/*设置PWM2输出的脉冲宽度
*/
PVIMGenEnable(PWMBASE,PWMGEN1);/*使能PWM发生器1
*/
break;
case2:
PVTMGenPeriodSet(PWM_BASE,PWM_GEM_2ruiFreq):/*设置PWM发生器2的周期
*/
PVTMPuIseWidthSet(PWM_BASE,PV/M_0UT_4,uiFreq/2):/*设置PWM4输出的脉冲宽度
*/1
PVrMGenEnable(PWM_BASE,PWM_GEN_2j;/*使能PWM发生器2
*/1
break;
default:
break;
)
}
/*************************************************************"*************************************
431c
**Functionname:irCheck
**Descriptions:红外线传感器检测。
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
**************************************************************杆*************************************
*x**/
voidirCheck(void)
(
staticuint8ucState=0;
staticuint8ucIRCheck:
switch(ucState){
case0:
irScndFrcq(32200.2);/*探测左右两侧近距
*/1
irSendFreq(35000,1);/*驱动斜角上的传感器检测
*/1
break;
case1:
uclRCheck=GPIOPinRead(GPIO_PORTB_BASE.0x3e):/*读取传感器状态
*/1
PVrMGenDisable(PWM_BASE,PWM_GEN_2);/*禁止PWM发生器2
♦/
PVrMGenDisable(PWM_BASE,PWM_GEN_1);/*禁止PWM发生器1
*/
if(uclRCheck&RIGHTSIDE)(
GucDistance[RIGHT]&=Oxfd;
}else(
GucDistance[RIGHT]|=0x02;
)
if(uclRCheck&LEFTSIDE){
GucDistance[LEFT]&=Oxfd;
}else(
GucDistance[LEFT]|=0x02;
)
if(uclRCheck&FRONTSIDE_R){
GucDistance[FRONTR]=0x00;
}else{
GucDistance[FRONTR]=0x01;
)
if(uclRCheck&FRONTSIDE_L){
GucDistance[FRONTL]=0x00;
}else(
GucDistance[FRONTL]=0x01;
)
break;
case2:
irSendFreq(36000,2);/*驱动检测左前右三个方向远距
break;
case3:
ucIRCheck=GPIOPinRead(GPIO_PORTB_BASE,0x2a);/*读取传感器状态
*/1
PVrMGenDisable(PWM_BASE,PWM_GEN_2);/*禁止PWM发生器2
*/
break;
case4:
irSendFreq(36000,2);/*重复检测左前右三个方向远距
*/
break;
case5:
ucIRCheck&=GPIOPinRead(GPIOPORTBBASE.0x2a);/*读取传感器状态
*/1
PVrMGenDisable(PWM_BASE.PWM_GEN_2);/*禁止PWM发生器2
*/
if(ucIRCheck&RIGHTSIDE){
GucDistance[RIGHT]&=Oxfe;
}else{
GucDistance[RIGHT]|=0x01;
)
if(ucIRCheck&LEFTSIDE){
GucDistance[LEFT]&=Oxfe;
}else(
GucDistance[LEFT]|=0x01;
)
if(ucIRCheck&FRONTSIDE)(
GucDistance[FRONT]&二Oxfe;
}else(
GucDistance[FRONT]|=0x01;
)
break;
default:
break;
)
ucState=(ucState+1)%6;/*循环检测*/
}
/**************************************************************:**************************************
*****
**Functionname:mazeSearch
**Descriptions:迷宫搜索,假设发现分支路或者前方有挡板那么退出
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
**************************************************************林*************************************
****/
voidmazeSearch(void)
int8cL=0,cR=0:
/*
*设定运行任务
*/
GucMouseState=GOAHEAD;
GmRight.cDir=MOTORGOAHEAD;
GmLeft.eDir=MOTORGOAHEAD;
GmRight.uiPulse=MAZETYPE*ONEBLOCK;
GmLcft.uiPuIsc=MAZETYPE*ONEBLOCK;
GmRight.cState=MOTORRUN;
GmLeft.cState=MOTORRUN:
whiIe(GmLeft.cState!=MOTORSTOP){
if(GucDistance[FRONT])(/*前方有墙
*/
/*
*设置继续前进的步数,以实现能停止在单元格中心的目的
*/
GriRight.uiPulse=GmRight.uiPuIseCtr+70;
GmLeft.uiPulse=GmLeft.uiPulseCtr+70;
/*
*反复检测前方传感器的状态,以消除误判
*/
whiIe(GucDistance[FRONT])(
if((GmLeft.uiPulseCtr+50)>GmLeft.uiPulse){
gotoEnd;/*跳出循环,跳到程序结束处
*/
*程序执行到此步说明出现误判,那么重新设定电机运行任务
*/
GmRight.uiPulse=MAZETYPE*ONEBLOCK;
GmLeft.uiPulse=MAZETYPE*ONEBLOCK;
)
if(cL){/*是否允许检测左边
*/
if((GucD.stance[LEFT]&0x01)=0){/*左边有支路*/
/*
*设置继续前进的步数,以实现能停止在单元格中心的目的
*/
GriRight.uiPulse=GmRight.uiPulseCtr+74;
GmLeft.uiPulse=GmLeft.uiPulseCtr+74;
/*
*反复检测前方传感器的状态,以消除误判
*/1
whiIe((GucDistance[LEFT]&0x01)=0){
if((GrnLeft.uiPulseCtr+50)>GmLeft.uiPulse){
gotoEnd;/*跳出循环,跳到程序结束处
*/
}
*程序执行到此步说明出现误判,那么重新设定电机运行任务
*/
GmRight.uiPulse=MAZETYPE*ONEBLOCK;
GmLeft.uiPulse=MAZETYPE*ONEBLOCK;
)
}else{/*左边有墙时开始允许检;则左边
*/
if(GucDistance[LEFT]&0x01){
cL=1;
if(cR){/小是否允许检测右边
*/1
if((GucDistance[RIGHT]&0x01)=0){/*右边有支路*/
/*
*设置继续前进的步数,以实现能停止在单元格中心的目的
*/
GmRight.uiPulse=GmRight.uiPulseCtr+74;
GreLeft.uiPuIse=GmLeft.uiPuIseCtr+74;
/*
*反复检测前方传感器的状态,以消除误判
*/1
while((GucDistance[RIGHT]&0x01)==0){
if((GmLeft.uiPuIseCtr+50)>GmLeft.uiPulse){
gotoEnd;/*跳出循环,跳到程序结束处
*/
)
)
/*
*程序执行到此步说明出现误判,那么重新设定电机运行任务
*/
GmRight.uiPulse=MAZETYPE*ONEBLOCK;
GmLeft.uiPulse=MAZETYPE*ONEBLOCK;
)
}else(
if(GucDistance[RIGHT]&0x01){/*右边有墙时开始允许检测右边*/
cR=1;
I
)
End::
)
/*************************************************************"*************************************
*林**
**Functionname:mouseTurnright
**Descriptions:右转
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
**************************************************************科*************************************
*林*/
voidmouseTurnright(void)
(
/*
*等待停止
*/1
while(GmLeft.cState!=MOTORSTOP);
whiIe(GmRight.cState!=MOTORSTOP);
GucMouseState=TURNRIGHT:/*标记电脑鼠的运行状态
*/
/♦
*开始右转
*/
GmRight.cDir=MOTORGOBACK;/*控制右轮向后转动
*/1
GmRight.uiPulse=41;/*设定右轮转动的步数
*/
GmLeft.eDir=MOTORGOAHEAD;/*控制左轮向前转动
*/
GmLeft.uiPulse=41;/*设定左轮转动的步数
*/
GmRight.cState=MOTORRUN;/*使能右轮转动
*/
GmLeft.cState=MOTORRUN:/*使能左轮转动
*/
/*
*等待右转完成
*/
while(GmLeft.cState!=MOTORSTOP);
while(GmRight.cState!=MOTORSTOP);
)
/****************************************************************************************************
*****
**Functionname:mouseTurnleft
**Descriptions:左转
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
*****************************************************************************************************
****/
voidmouseTurnleft(void)
(
/*
*等待停止
while(GmLeft.cState!=MOTORSTOP);
whiIe(GmRight.cState!=MOTORSTOP);
GucMouseState=TURNLEFT;/*标记电脑鼠的运行状态
*/
/*
*开始左转
*/1
GmRight.cDir=MOTORGOAHEAD;/*控制右轮向前转动
♦/
GmRight.uiPulse=41;/*设定右轮转动的步数
*/
GmLeft.eDir=MOTORGOBACK;/*控制左轮向后转动
*/
GmLeft.uiPulse=41;/*设定左轮转动的步数
*/
GriRight.cState=MOTORRUN;/*使能右轮转动
*/
GmLeft.cState=MOTORRUN:/*使能左轮转动
*/1
/*
*等待左转完成
*/
while(GmLeft.cState!=MOTORSTOP):
whiIe(GmRight.cState!=MOTORSTOP);
)
/****************************************************************************************************
*****
**Functionname:mouseTurnback
**Descriptions:后转
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
*****************************************************************************************************
****/
voidmouseTurnback(void)
/»
*等待停止
*/1
whiIe(GmLeft.cState!=MOTORSTOP);
whiIe(GmRight.cState!=MOTORSTOP);
GucMouseState=TURNBACK;
/*
*开始后转
*/
GmRight.eDir=MOTORGOBACK;
GriRight.uiPulse=81;
GmLeft.eDir=MOTORGOAHEAD;
GmLeft.uiPulse=81;
GmLeft.cState=MOTORRUN:
GmRight.cState=MOTORRUN;
/*
*等待后转完成
*/
whiIe(GmLeft.cState!=MOTORSTOP);
while(GmRight.cState!=MOTORSTOP);
)
/****************************************************************************************************
*****
**Fundionname:keyCheck
**Descriptions:读取按键
**inputparameters:无
**outputparameters:无
**Returnedvalue:true:按键已按下
**false:按键未按下
**************************************************************"*************************************
****/
uint8keyCheck(void)
(
if(GPIOPinRead(GPIO_PORTC_BASE,KEY)==0){
deIay(50);
while(GPIOPinRead(GPIO_PORTC_BASE,KEY)=0);
return(true);
}eIse(
return(faIse);
*****
**Functionname:SysTick_ISR
♦*Descriptions:定时中断扫描。
**inputparameters:无
**outputparameters:无
**Returnedvalue:无
****/
voidSysTickISR(void)
(
staticint32iL=0,iR=0;
/*
*如果左电机长时间停止,那么断电
*/,
if(GmLeft.cState==MOTORSTOP){
iL++;
}else(
iL=0;
)
if(iL>=500)(
GPIOPinWrite(GPI0PORTD_BASE,
PHLA1|PHLA2|PHLB1|PHLB2.
0>:00);
)
/*
*如果右电机长时间停止,那么断电
*/
if(GmRight.cState=MOTORSTOP){
iR++;
}eIse{
iR=0:
)
if(iR>=500)(
GPIOPinWrite(GPIO_PORTD_BASE.
PHRA1|PHRA2|PHRB1|PHRB2,
0>:00);
)
/*
*红外线检测
*/1
irCheck();
)
/*************************************************************"*************************************
*****
**Functionname:waIICheck
**Descriptions:根据传感器检测结果判断是否存在墙壁
**inputparameters:无
**outputparameters:无
科Returnedvalue:ucWalI:低三位从左到右一次代表左前右。1为有墙,0为没墙。
**************************************************************料*************************************
****/
uint8walICheck(void)
I
uint8ucWa11=0:
if(GucDistance[LEFT]&0x01)(
ucWaII|=0x04;
}eIse(
ucWalI&=*0x04;
)
if(GucDistance[FRONT]&0x01){
ucWall|=0x02;
}eIse(
ucWa11&=~0x02;
I
if(GucDistance[RIGHT]&0x01){
ucWall|=0x01;
}eIse(
ucWall&=~0x01;
)
return(ucWa11);
J
/************************它**************************************************************************
*****
**Fundionname:sensorInit
**Descriptions:传感器控制初始化
**inputparameters:无
**outputparameters:无
**Returned
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 伊克昭盟达拉特旗2025-2026学年第二学期六年级语文第四单元测试卷(部编版含答案)
- 茂名市茂港区2025-2026学年第二学期四年级语文第五单元测试卷(部编版含答案)
- 永州市祁阳县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 毕节地区金沙县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 德阳市中江县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 服装公司营销策划方案
- 深度解析(2026)《AQ 5203-2008电镀生产装置安全技术条件》
- 代数考试陷阱题及答案
- 《高考快车道》专题1 信息类文本阅读(课后习题)(学生版)(有答案)高三 二轮专题复习讲义 语文
- 市场调研与预测专业知识与实践技能试题及答案
- 2026年电子信息工程专业信号与系统真题单套试卷
- DB36T+2220-2026饮用水水源蓝藻水华应急防控技术指南
- 2026年员工体检组织计划
- 5.1 人民代表大会制度 课件(内嵌视频)-2025-2026学年统编版道德与法治八年级下册
- 2026江西省江盐集团盐品事业部招聘24人笔试参考题库及答案解析
- 2026年危险废物经营许可证管理办法题库及答案
- 安全管理人员考勤制度
- 运维技术人员考核制度
- 起重安全生产管理制度
- (完整版)泵站工程监理实施细则
- 模具钳工技能培训
评论
0/150
提交评论