📄 m.c
字号:
#include "C_main.h"
//各段状态变量
unsigned char NoWState;
//BD DC各段时间
unsigned int16 ABTime;
unsigned int16 BDTime;
unsigned int16 DCTime;
//骑线次数
unsigned char PassLine;
//临时变量
unsigned char tmp;
//已经检测到铁标志
int1 eorned;
//走S路线使用罗盘标志
int1 SroadNorth;
//起始阶段NowState
#define StartState 1
//========================================主函数======================================
void main()
{
//系统初始化
init_sys();
//初始化罗盘
init_spi();
//各段初始值
ABTime=24;
BDTime=6;
DCTime=5;
//开始NowState
NoWState=StartState;
//骑线标志
PassLine=0;
//走S路线标志
SroadNorth=0;
//===============================开机自检=============
//电磁铁检测
Iron(1);
//底盘光电开启
Butten_Detect=1;
LCDprintR(&frm_welcom,3,2);
//设置用户原点
SetOrg(GetNorth());
//蜂鸣器检测
beep(1);
delay_ms(10);
Beep(0);
//=========================================================
//等待用户按键开始按下
while(input(Key)==1)
{
delay_ms(100);
LCD_setpos(3,3);
//显示电量
NowV=GetVol();
LCD_disp_valueInt16(NowV);
//获得各种传感器状态
GetSenser();
//显示罗盘
dispNorth();
};
//等待用户按键抬起
while(input(Key)==0);
//==========================================================
//底盘光电关闭
Butten_Detect=0;
//电磁铁关闭
Iron(0);
//设置用户原点
SetOrg(GetNorth());
//启动电机
PWM_Start();
//清屏
LCD_disp_CLS();
//前进
Left_along();
//显示正在进行第一段
LCD_setpos(4,3);
LCD_disp_Putchar('0');
//计时开始
Time_Start(0);
//=========================================主循环===============================
while(1)
{
//1秒时间计时
if (Time_update==1)
{
LCD_setpos(4,2);
LCD_disp_valueInt16(Time_Get());
/*1S更新一次电压,显示PWM
LCD_setpos(0,2);
LCD_disp_valueInt16(100-Left_Pwm);
LCD_setpos(6,2);
LCD_disp_valueInt16(Right_Pwm);
*/
}
//巡线堵转超时调整
if (TimeOut>9 && NoWState==8)
{
TimeOut=0;
PWM_SetDRC(1,2);
PWM_SetDuty(99,99);
}
//罗盘读数
if (TimeUs>100)
{
TimeUs=0;
//电子罗盘走S路线
dispNorth();
if (SroadNorth==1)
{
if ( NorthRad>280 && NorthRad<300 )
{
SroadNorth=0;
NoWState=6;
LCD_setpos(4,3);
LCD_disp_Putchar('L');
Left_along();
}
}
}
//一直扫描各传感器状态,并保存到状态变量
GetSenser();
//走迷宫
if (LightUpdateS==1)
{
switch(NoWState)
{
//阶段一=====================================================
case 1:
Left_along();
if(HS==1)
{
PWM_Stop();
CC_turnright90();
delay_ms(450);
while(Hs==1)
{
GetSenser();
}
PWM_Start();
NoWState=2;
LCD_setpos(4,3);
LCD_disp_Putchar('1');
}
break;
//阶段二=====================================================
case 2:
Left_along();
if(HS==1)
{
PWM_Stop();
CC_turnright90();
delay_ms(450);
while(Hs==1)
{
GetSenser();
}
PWM_Start();
NoWState=3;
LCD_setpos(4,3);
LCD_disp_Putchar('2');
}
break;
//阶段三 =====================================================
case 3:
Left_along();
if(HS==1)
{
PWM_Stop();
CC_turnleft90();
delay_ms(400);
PWM_Start();
NoWState=4;
LCD_setpos(4,3);
LCD_disp_Putchar('3');
}
break;
//阶段四 =====================================================
case 4:
Left_along();
if(HS==1)
{
PWM_Stop();
CC_turnleft90();
//delay_ms(380);
while(HS==1|| RS==0)
{
GetSenser();
}
PWM_Start();
NoWState=5;
LCD_setpos(4,3);
LCD_disp_Putchar('4');
//定时
TimeUs=0;
}
break;
//走S缺口================================================================
case 5:
if (RS==1)
{
PWM_SetDRC(2,1);
PWM_SetDuty(90,90);
SroadNorth=0;
};
if (RS==0)
{
PWM_SetDRC(1,2);
PWM_SetDuty(80,20);
SroadNorth=1;
};
if(HS==1)
{
NoWState=6;
LCD_setpos(4,3);
LCD_disp_Putchar('5');
SroadNorth=0;
}
break;
//S撞墙===================================================================
case 6:
//Left_along();
Right_along();
if(HS==1)
{
PWM_Stop();
CC_turnleft90();
while(HS==1)
{
GetSenser();
}
//delay_ms(500);
PWM_Start();
NoWState=7;
LCD_setpos(4,3);
LCD_disp_Putchar('6');
}
break;
//走到B点停5秒=====================================================================
case 7:
Left_along();
if(HS==1)
{
PWM_Stop();
CC_turnright90();
delay_ms(400);
while(LS==1 || HS==1)
{
GetSenser();
}
//延时五秒
Time_Stop();
CC_CarStop();
ABTime=Time_Get();
//显示AB段时间
LCD_disp_CLS();
LCDprintR(&frmAbtime,0,0);
LCD_disp_valueInt16(ABTime);
tmp=0;
while(tmp!=25)
{
tmp++;
Beep(1);
delay_ms(50);
Beep(0);
delay_ms(150);
}
LCD_disp_CLS();
LCD_setpos(4,2);
LCDprintR(&Blank,1,1);
//计时重新开始
Time_Start(0);
NoWState=8;
LCD_setpos(4,3);
LCD_disp_Putchar('B');
Butten_Detect=1;
eorned=0;
Iron(1);
PWM_Start();
//骑线标志
PassLine=0;
}
break;
//巡线检测==========================================================
case 8:
if (BL==1 && BR==1)
{
PWM_SetDuty(25,20);
PWM_SetDRC(1,1);
}
else
{
//超时标志,正常情况下小车每隔几秒都要压线调整清超时标志
TimeOut=0;
if (BR==0)
{
//右面压线说明已经基本骑到线上
PassLine=2;
PWM_SetDRC(1,2);
PWM_SetDuty(99,99);
}
else if (BL==0 && PassLine==2 )
{
PWM_SetDRC(2,1);
PWM_SetDuty(99,99);
};
}
//检测到铁片显示
if(ES==1 && eorned==0)
{
Time_Stop();
BDTime=Time_Get();
PWM_Stop();
eorned=1;
//显示BD段时间
LCD_disp_CLS();
LCDprintR(&frmBCtime,0,0);
LCD_disp_valueInt16(BDTime);
LCDprintR(&ERon,2,2);
//延时三秒
tmp=0;
while(tmp!=20)
{
tmp++;
Beep(1);
delay_ms(100);
Beep(0);
delay_ms(50);
}
//清超时
TimeOut=0;
LCD_disp_CLS();
PWM_Start();
Time_Start(0);
};
//检测到最终的墙壁停止
if(HS==1)
{
Time_Stop();
DCTime=Time_Get();
PWM_Stop();
Iron(0);
Beep(1);
delay_ms(40);
Beep(0);
delay_ms(100);
Beep(1);
delay_ms(40);
Beep(0);
LCD_setpos(4,3);
LCD_disp_Putchar('C');
LCD_disp_CLS();
LCDprintR(&finish,2,0);
LCD_setpos(3,1);
LCD_disp_Putchar('A');
LCD_disp_Putchar('B');
LCD_disp_Putchar(':');
LCD_disp_valueInt16(ABTime);
LCD_disp_Putchar(' ');
LCD_setpos(3,2);
LCD_disp_Putchar('B');
LCD_disp_Putchar('D');
LCD_disp_Putchar(':');
LCD_disp_valueInt16(BDTime);
LCD_disp_Putchar(' ');
LCD_setpos(3,3);
LCD_disp_Putchar('D');
LCD_disp_Putchar('C');
LCD_disp_Putchar(':');
LCD_disp_valueInt16(DCTime);
//停止
while(1);
}
break;
}
}//if light update
}//While
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -