📄 mcu1_main.c
字号:
default:
break;
}
}
}
/*
//////////////////////////////////////////////////////////////
//记录一条命令
static data uint temp_licheng; //暂存里程
void writecommand(uchar com,uchar flag)
{
static data uchar n; //当前记录的条数
data uint temp_record; //暂存本次将要保存的记录
static data uchar page; //路线保存在24C08中的页号
switch(flag)
{
case FLAG_BEGIN:
page=(com-1); //此时com传递的页号
n=0; //初始化记录数
temp_licheng=getlicheng();//初始化里程值
writerecord(page,0,0); //记录数清0,表示删除原来的那条路线数据
return;
case FLAG_END:
n++;
writerecord(page,n,(getlicheng()-temp_licheng));
writerecord(page,0,n);//写入本条路线的记录条数
return;
case FLAG_COM:
temp_record=(getlicheng()-temp_licheng);
temp_licheng=getlicheng();
temp_record&=0x0fff;
temp_record|=(com<<12);
if(n<127)
{
n++;
writerecord(page,n,temp_record);
}
return;
default:
return;
}
}
*/
data int source_dg; //暂存光源角度值
data uchar lc; //暂存需要行走的里程值
data uchar fangxiang; //暂存光源的方向标志,0:前方 1:左侧 2:右侧
data uchar dg; //暂存光源和正前方的夹角
bdata bit flag; //是否找到光源标志
uchar qianzhang(void);//前方有障碍,后方无障碍的处理
uchar houzhang(void);//前方无障碍,后方有障碍的处理
uchar qianhouwuzhang(void);//前方无障碍,后方也无障碍的处理
///////////////////////////////////////////////////////////////
//自动寻找光源模式处理函数
uchar zidong(void)
{
setspeed(0);//停车
delay_ms(200);//等待200毫秒
loufen(0); //停止漏粉
setlicheng(0);//复位里程值
resettime();//复位系统时间
setdispmode(MODE_TIME);
while(1)
{
setspeed(0);//停车
sendmsg(MSG_ENDFIND);//向从机发送停止寻找光源命令
delay_ms(200);
sendmsg(MSG_BEGINFIND);//向从机发送寻找光源命令
//等待5秒,若等待过程中按下停止键则转到ENDFIND出作处理
//if(MSG_K_TING==wait_time(10000));
//led[3]=0;
if(MSG_K_TING==wait_time(6000))goto ENDFIND;
//led[3]=1;
if(flag=testfound())//如果发现光源
{
source_dg=getsourcedegree(); //取光源方位
if(source_dg<(-10)) //光源在左侧
{
fangxiang=-1;
dg=(uchar)(-source_dg/2);
}
else if(source_dg>10) //光源在右侧
{
fangxiang=1;
dg=(uchar)(source_dg/2);
}
else //光源在前方
{
fangxiang=0;
}
dg/=2;
}
if(getqianzhang()&&(!gethouzhang()))//前方有障碍,后方无障碍
{
if(flag&&(fangxiang==0))//找到光源,结束
{
//led[3]=3;
setdispmode(MODE_USER);
led[0]=0;
led[1]=0;
led[2]=0;
led[3]=0;
//显示:Find
led[0]=CHAR_F|LED_SHANSHUO;
led[1]=1|LED_SHANSHUO;
led[2]=CHAR_n|LED_SHANSHUO;
led[3]=CHAR_d|LED_SHANSHUO;
beep(3);
while(1)
{
wait_time(60000);
goto ENDFIND;
}
}
else
{
//led[3]=4;
if(MSG_K_TING==qianzhang())goto ENDFIND;
}
}
else if((!getqianzhang())&&gethouzhang())//前方无障碍,后方有障碍
{
//led[3]=5;
if(MSG_K_TING==houzhang())goto ENDFIND;
}
else if((!getqianzhang())&&(!gethouzhang()))//前方无障碍,后方也无障碍
{
//led[3]=6;
if(MSG_K_TING==qianhouwuzhang())goto ENDFIND;
}
else if(getqianzhang()&&gethouzhang())//前方有障碍,后方也有障碍
{
//led[3]=7;
beep(10);
goto ENDFIND;//强行停止寻找光源
}
}
ENDFIND://强行停止寻找光源处理
beep(1);
imstop();
while(1)
{
//led[3]=8;
switch(getmsg())
{
case MSG_K_MODE:
beep(1);
return selmode();
case MSG_K_DISPMODE:
beep(1);
if(MODE_TIME==getdispmode())
setdispmode(MODE_LICHENG);
else setdispmode(MODE_TIME);
break;
default:
break;
}
}
}
////////////////////////////////////////////////////////////////////
//前方有障碍,后方无障碍的处理
uchar qianzhang(void)
{
//led[2]=0;
if(flag) //发现光源
{
//led[2]=1;
if(fangxiang==-1)//光源在左侧
{
//led[2]=2;
turnright();//右转
setspeed(-1);//倒车
if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
return 0;
}
if(fangxiang==1)//光源在右侧
{
//led[2]=3;
turnleft();//左转
setspeed(-1);//倒车
if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
return 0;
}
if(fangxiang==0)//光源在前方,认为找到光源
{
//上一层函数已处理此种情况
}
}
else //未发现光源
{
//led[2]=4;
turnleft();
//led[2]=5;
setspeed(-1);
if(MSG_K_TING==wait_lc(40))return MSG_K_TING;
return 0;
}
}
////////////////////////////////////////////////////////////////////
//前方无障碍,后方有障碍的处理
uchar houzhang(void)
{
if(flag) //发现光源
{
if(fangxiang==-1)//光源在左侧
{
turnleft();//左转
setspeed(1);//前进
if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
return 0;
}
if(fangxiang==1)//光源在右侧
{
turnright();//右转
setspeed(1);//前进
if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
return 0;
}
if(fangxiang==0)//光源在前方
{
turnmid();
setspeed(1); //前进
if(MSG_K_TING==wait_lc(60))return MSG_K_TING;
return 0;
}
}
else //未发现光源
{
turnmid();
setspeed(1); //前进
if(MSG_K_TING==wait_lc(60))return MSG_K_TING;
return 0;
}
}
////////////////////////////////////////////////////////////////////
//前方无障碍,后方也无障碍的处理
uchar qianhouwuzhang(void)
{
if(flag) //发现光源
{
if(fangxiang==-1)//光源在左侧
{
turnleft();//左转
setspeed(1);//前进
if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
return 0;
}
if(fangxiang==1)//光源在右侧
{
turnright();//右转
setspeed(1);//前进
if(MSG_K_TING==wait_lc(dg))return MSG_K_TING;
return 0;
}
if(fangxiang==0)//光源在前方
{
turnmid();
setspeed(1);
if(MSG_K_TING==wait_lc(60))return MSG_K_TING;
return 0;
}
}
else //未发现光源
{
turnmid();
setspeed(1);
if(MSG_K_TING==wait_lc(60))return MSG_K_TING;
return 0;
}
}
///////////////////////////////////////////////////////////////////////
//重放路线模式处理函数,包括走数字
//前四条路线为用户记录的路线,存在24C08串行EEPROM
//后四条路线为系统预先定义好的路线,
//是用一段程序来控制小车走一段路线
uchar zouluxian(void)
{
data uchar n;
data uchar ch;
setspeed(0); //停车
setdegree(0); //转正
loufen(0); //停止漏粉
do
{
if(n=sel_record(9)) //选择了一条路线重放
{
setlicheng(0); //重设里程值为0
setdispmode(MODE_LICHENG); //显示里程
LED_RECORD=1;
SSLED_RECORD=0;
switch(n)
{
case 5: //走系统预定义的2字
go_2();
break;
case 6: //走系统预定义的3字
go_3();
break;
case 7: //走系统预定义的5字
go_5();
break;
case 8: //走系统预定义的8字
go_8();
break;
case 9:
read(); //调试命令,读出路线记录并显示
break;
case 1:
case 2:
case 3:
case 4:
replay(n); //重放用户记录的路线1~4
break;
default:
break;
}
}
setspeed(0);
setdegree(0);
LED_RECORD=0;
setdispmode(MODE_USER); //显示提示信息:End
led[0]=CHAR_MIE;
led[1]=CHAR_E|LED_SHANSHUO;
led[2]=CHAR_n|LED_SHANSHUO;
led[3]=CHAR_d|LED_SHANSHUO;
beep(2);
loufen(0);//停止漏粉
while(1)
{
ch=getmsg(); //读取按键
if(ch==MSG_K_MODE) //模式选择
{
beep(1);
return selmode();
}
else if(ch==MSG_K_REC) //重房另一条路线
{
beep(1);
break;
}
else
{
continue;
}
}
}while(1);
}
/////////////////////////////////////////////////////////////////////
//重放记录在24C08中用户记录的路线
void replay(uchar n)
{
data uchar cmd; //暂存命令值
data uint temp_rec;//暂存读出的记录
data uint temp_lc; //暂存里程
data uchar m; //当前重放第m个记录
data uchar m_total;//总记录数
n--; //n--后为记录存放在24C08中的页号
m_total=(uchar)getrecord(n,0); //取本条路线的总记录数
if(!m_total)return; //有效的数目在1~127之间
if(m_total>127)return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -