📄 mcu1_main.c
字号:
m=1;
while(m<=m_total)
{
temp_rec=getrecord(n,m);
cmd=temp_rec>>12;
temp_lc=temp_rec&0x0fff;
switch(cmd)
{
case COM_QIAN: //前进命令
//等待一段里程,长度为该命令和上一个命令之间的距离
//wait_lc()函数正常返回时返回0
//若在等待的过程中按下“停止”键或出现障碍返回非0值
if(wait_lc(temp_lc))return;
setspeed(1);
break;
case COM_HOU: //后退命令
if(wait_lc(temp_lc))return;
setspeed(-1);
break;
case COM_ZUO: //左转命令
if(wait_lc(temp_lc))return;
if(getnowdegree()>10)turnmid();
else if(getnowdegree()>(-10))turnleft();
if(!getspeed())delay_ms(2000);
break;
case COM_YOU: //右转命令
if(wait_lc(temp_lc))return;
if(getnowdegree()<(-10))turnmid();
else if(getnowdegree()<10)turnright();
if(!getspeed())delay_ms(2000);
break;
case COM_FEN: //漏粉命令
if(wait_lc(temp_lc))return;
loufen(1); //开始漏粉
break;
case COM_NOFEN: //停止漏粉命令
if(wait_lc(temp_lc))return;
loufen(0); //停止漏粉
break;
case COM_TING: //停车命令
if(wait_lc(temp_lc))return;
setspeed(0);
delay_ms(1000);
break;
}
m++;
}
}
/////////////////////////////////////////////////////////////////////
//走2字
void go_2(void)
{
setdegree(50);
delay_ms(2000);
loufen(1);//开始漏粉
setspeed(1);
if(wait_lc(100))return;
setdegree(0);
if(wait_lc(80))return;
setdegree(-50);
if(wait_lc(20))return;
setdegree(0);
if(wait_lc(10))return;
loufen(0);//停止漏粉
if(wait_lc(30))return;
setspeed(0);
delay_ms(1000);
setdegree(-50);
delay_ms(2000);
setspeed(-1);
if(wait_lc(47))return;
setspeed(0);
delay_ms(1000);
setdegree(0);
delay_ms(2000);
setspeed(1);
if(wait_lc(30))return;
setspeed(0);
delay_ms(1000);
setspeed(-1);
loufen(1);//开始漏粉
if(wait_lc(60))return;
setspeed(0);
loufen(0);//停止漏粉
}
/////////////////////////////////////////////////////////////////////
//走3字
void go_3(void)
{
setdegree(50);
delay_ms(1000);
loufen(1);//开始漏粉
setspeed(1);
if(wait_lc(142))return;
setspeed(0);
delay_ms(1000);
setdegree(-50);
delay_ms(1000);
setspeed(-1);
if(wait_lc(150))return;
setdegree(0);
setspeed(0);
loufen(0);//停止漏粉
}
/////////////////////////////////////////////////////////////////////
//走5字
void go_5(void)
{
setdegree(0);
delay_ms(1000);
setspeed(1);
loufen(1);//开始漏粉
if(wait_lc(60))return;
setspeed(0);
delay_ms(1000);
loufen(0);//停止漏粉
setspeed(-1);
if(wait_lc(30))return;
setspeed(0);
delay_ms(500);
setdegree(50);
delay_ms(2000);
setspeed(1);
if(wait_lc(47))return;
setspeed(0);
delay_ms(500);
setdegree(0);
delay_ms(2000);
setspeed(-1);
if(wait_lc(30))return;
loufen(1);//开始漏粉
if(wait_lc(30))return;
loufen(0);//停止漏粉
setspeed(0);
delay_ms(1000);
setspeed(1);
if(wait_lc(30))return;
setspeed(0);
delay_ms(500);
setdegree(50);
delay_ms(2000);
setspeed(-1);
if(wait_lc(47))return;
setspeed(0);
delay_ms(500);
setdegree(0);
delay_ms(2000);
setspeed(1);
if(wait_lc(30))return;
setspeed(0);
delay_ms(1000);
setspeed(-1);
loufen(1);//开始漏粉
if(wait_lc(28))return;
setdegree(-50);
if(wait_lc(47))return;
setdegree(0);
if(wait_lc(28))return;
setdegree(-50);
if(wait_lc(100))return;
setspeed(0);
setdegree(0);
loufen(0);//停止漏粉
}
/////////////////////////////////////////////////////////////////////
//走8字
void go_8(void)
{
delay_ms(500);
setdegree(-50);
delay_ms(2000);
loufen(1);//开始漏粉
setspeed(1);
if(wait_lc(190))return;
setspeed(0);
setdegree(50);
delay_ms(2000);
setspeed(1);
if(wait_lc(185))return;
setdegree(0);
setspeed(0);
loufen(0);//停止漏粉
}
////////////////////////////////////////////////////////////////////
//等待一段时间后返回0
//当遇到障碍或按下停止键后返回相应的消息值
uchar wait_time(uint ms)
{
data unsigned long temp_time;
bdata bit flag_ting=1;
bdata bit flag_dispmode=0;
temp_time=gettime();
temp_time+=(unsigned long)ms;
while(1)
{
if(temp_time<gettime())return 0;
if((KEY_TING==imgetch())&&(!flag_ting)) //等待过程中按下停止键则返回1
{
beep(1);
return MSG_K_TING;//等待过程按下停止键返回停止键消息
}
else flag_ting=0; //刚进入该函数时KEY_TING键可能是按下的
//等到该键松开后置标志flag_ch=0
if((KEY_DISPMODE==imgetch())&&(!flag_dispmode)) //数码管显示模式切换
{
beep(1);
flag_dispmode=1;
if(MODE_TIME==getdispmode())setdispmode(MODE_LICHENG);
else if(MODE_LICHENG==getdispmode())setdispmode(MODE_TIME);
}
else if(KEY_DISPMODE!=imgetch())
{
flag_dispmode=0;
}
if(getqianzhang()&&(getspeed()>0))
{
warning();//报警
return MSG_QIANZHANG; //前进时前方遇到障碍返回前障消息
}
if(gethouzhang()&&(getspeed()<0))
{
warning(); //报警
return MSG_HOUZHANG; //后退时后方遇到障碍返回后障消息
}
}
}
////////////////////////////////////////////////////////////////////
//等待一段里程后返回0
//当遇到障碍或按下停止键后返回非0值
uchar wait_lc(uint licheng)
{
data uint temp_licheng;
bdata bit flag_ting=1;
bdata bit flag_dispmode=0;
if(!getspeed())return 0;
temp_licheng=getlicheng();
temp_licheng+=licheng;
while(1)
{
if(getlicheng()>temp_licheng)return 0;//正常情况下,等到预定里程值返回0
if((KEY_TING==imgetch())&&(flag_ting==0)) //等待过程中按下停止键则返回1
{
beep(1);
return MSG_K_TING;//等待过程按下停止键返回停止键消息
}
else if(KEY_TING!=imgetch())
{
flag_ting=0; //刚进入该函数时KEY_TING键可能是按下的
} //等到该键松开后置标志flag_ch=0
if((KEY_DISPMODE==imgetch())&&(!flag_dispmode)) //数码管显示模式切换
{
beep(1);
flag_dispmode=1;
if(MODE_TIME==getdispmode())setdispmode(MODE_LICHENG);
else if(MODE_LICHENG==getdispmode())setdispmode(MODE_TIME);
}
else if(KEY_DISPMODE!=imgetch())
{
flag_dispmode=0;
}
if(getqianzhang()&&(getspeed()>0))
{
warning();//报警
return MSG_QIANZHANG; //前进时前方遇到障碍返回前障消息
}
if(gethouzhang()&&(getspeed()<0))
{
warning(); //报警
return MSG_HOUZHANG; //后退时后方遇到障碍返回后障消息
}
}
}
///////////////////////////////////////////////////////////////////
//遇到障碍时的报警处理
//可以在此处添加更多的障碍处理功能
void warning(void)
{
imstop();//刹车
beep(5);
if(getqianzhang())LED_QZ=1; //障碍指示灯亮
if(gethouzhang())LED_HZ=1;
}
///////////////////////////////////////////////////////////////////
//解除警报函数
void nowarning(void)
{
if(!getqianzhang())LED_QZ=0; //障碍指示等灭
if(!gethouzhang())LED_HZ=0;
}
////////////////////////////////////////////////////////////////////////
//选择模式函数
//返回所选择的模式代码MODE_SHOUDONG,MODE_ZIDONG或MODE_ZOULUXIAN
uchar selmode(void)
{
data uchar ch;
data uchar temp_mode;
setdispmode(MODE_USER);
led[0]=5|LED_SHANSHUO; //前三个数码管显示:SEL字符
led[1]=CHAR_E|LED_SHANSHUO;
led[2]=CHAR_L|LED_DP|LED_SHANSHUO;
led[3]=1; //默认选择第一种模式(手动模式)
LED_SHOUDONG=1;
LED_ZIDONG=0;
LED_ZOUSHUZI=0;
SSLED_SHOUDONG=1;
SSLED_ZIDONG=1;
SSLED_ZOUSHUZI=1;
setspeed(0);
//setdegree(0);
delay_ms(300);
while(1)
{
ch=getmsg();
switch(ch)
{
case MSG_K_QIAN: //选择下一种模式
beep(1);
led[3]++;
if(led[3]>3)led[3]=1;
goto LEDSDEAL;
case MSG_K_HOU: //选择上一种模式
beep(1);
led[3]--;
if(led[3]<1)led[3]=3;
LEDSDEAL:
LED_SHOUDONG=0;
LED_ZIDONG=0;
LED_ZOUSHUZI=0;
switch(led[3])
{
case 1:
LED_SHOUDONG=1;
break;
case 2:
LED_ZIDONG=1;
break;
case 3:
LED_ZOUSHUZI=1;
break;
default:
break;
}
break;
case MSG_K_TING: //确定选择
beep(2);
temp_mode=led[3]&0x07;
SSLED_SHOUDONG=0;
SSLED_ZIDONG=0;
SSLED_ZOUSHUZI=0;
return temp_mode;
break;
case MSG_K_MODE: //取消选择
beep(1);
//return 0;
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -