📄 autocar4_4.1.c
字号:
if (accespeed != 0) //加速度不为零时,梯形加速
{
if (Lines >= 3)
TrapeziaV.SpeedState = ACCESTATE; //梯形速度曲线设置
else
TrapeziaV.SpeedState = REGUSTATE; //如果走的线数太少时,不走梯形曲线
}
else
{
TrapeziaV.SpeedState = REGUSTATE; //匀速
}
TrapeziaV.AcceSpeed = accespeed;
while (CrossedLines < Lines)
{
if (RSensorON) //判断在线
{
delay_100us(1);
if (RSensorON) //二次判断在线,确认信号
{
while (1) //在白线,等待出线。
{
if (!RSensorON)
{
delay_100us(1);
if (!RSensorON)
{
CrossedLines++;
if (Lines >= 3) //如果走的线数太少时,不走梯形曲线, 保持匀速过程
{
/************************************数线减速************************/
if (CrossedLines == (Lines - decespeedline)) //从终点线的前decespeedline根线开始减速
{
TrapeziaV.SpeedState = DECESTATE;
TrapeziaV.AcceSpeed = -accespeed; //减速度设定,与加速阶段对称
}
}
break;
}
}
}
}
}
}////////
TCCR2 = 0x00;
//set_distance(100, 1); //保证将数线传感器移出白线
//set_distance(100, 0);
//delay_ms(200);
//左转
set_distance(0, 0); //左轮不动
set_speed(800, 1); //右轮旋转,实现左转
while (flag)
{
if (RSensorON)
{
delay_100us(1);
if (RSensorON)
{
while (1)
{
if (!RSensorON) //两次判断左边数线从传感器出线。
{
delay_100us(1);
if (!RSensorON)
{
while (PINA != 0xF9); //当前排传感器没有达到特定的状态时,持续转动
flag = 0;
break;
}
}
}
}
}
}
set_speed(0, 1);
set_speed(0, 0);
return 1;
}
///////////////////////////////////////////////////////
//用右边传感器数线,直走,到达终点,停车
unsigned char GoSraight_R(unsigned char Lines, signed int motorinitspeed, signed int accespeed, unsigned char decespeedline)
{
unsigned char flag = 1, CrossedLines = 0; //小车已经通过的横向白线数目
TCCR2 = 0x07; //寻线
TrapeziaV.MotorSpeed = motorinitspeed;
if (accespeed != 0) //加速度不为零时,梯形加速
{
if (Lines >= 3)
TrapeziaV.SpeedState = ACCESTATE; //梯形速度曲线设置
else
TrapeziaV.SpeedState = REGUSTATE; //如果走的线数太少时,不走梯形曲线
}
else
{
TrapeziaV.SpeedState = REGUSTATE; //匀速
}
TrapeziaV.AcceSpeed = accespeed;
while (CrossedLines < Lines)
{
if (RSensorON) //判断在线
{
delay_100us(1);
if (RSensorON) //二次判断在线,确认信号
{
while (1) //在白线,等待出线。
{
if (!RSensorON)
{
delay_100us(1);
if (!RSensorON)
{
CrossedLines++;
if (Lines >= 3) //如果走的线数太少时,不走梯形曲线, 保持匀速过程
{
/************************************数线减速************************/
if (CrossedLines == (Lines - decespeedline)) //从终点线的前decespeedline根线开始减速
{
TrapeziaV.SpeedState = DECESTATE;
TrapeziaV.AcceSpeed = -accespeed; //减速度设定,与加速阶段对称
}
}
break;
}
}
}
}
}
}////////
TCCR2 = 0x00;
set_speed(0, 1);
set_speed(0, 0);
return 1;
}
void dongzuo(void)
{
push2go();
delay_ms(3000);
push2back();
delay_ms(3000);
riseback();
}
void qidong(void)
{
set_speed(500,1);
set_speed(800,0);
delay_ms(1500);
set_speed(0,0);
delay_ms(800);
}
/*********************************************************************************/
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
spi_init( );
uart0_init();
timer2_init();
//init_7279();
SEEK_PIDInit(0x00); //PID 参数初始化
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x40; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
void main(void)
{
unsigned char i = 1;
init_devices();
//insert your functional code here...
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
flag=0;
while(!flag);
while(flag)
{
load_para();
if(i == 1)
{
send(0x01);
i = 0;
}
if(sel==1)
{
//这条路径,从红区出发,在第2个拐弯以后会出现少数一条线的现象。未解决。
//从蓝区出发,未发现此现象。可见程序上应没问题。多设路径,看成功率。
/*
Count2TurnR(13, 500, 320, 2); //
Count2TurnR(6, 500, 320, 2 );
Count2TurnL(6, 500, 320, 2);
Count2TurnL(4, 500, 320, 2);
Count2TurnR(2, 500, 0, 0);
Count2TurnL(1, 500, 0, 0);
Count2TurnL(4, 500, 320, 2);
Count2TurnL(2, 500, 0, 0); */ //直接编译下载,运行,看效果。
Count2TurnR(14, 500, 320, 2);
Count2TurnR(6, 500, 320, 2 );
while (1)
{Count2TurnL(11, 500, 320, 2);
Count2TurnL(4, 500, 320, 2);
Count2TurnL(11, 500, 320, 2);
Count2TurnL(4, 500, 320, 2);}
}
//////////////////////////////////////////////////////////////////////////////////////
/*此为Go函数的测试。
GoSraight_R(13, 500, 320, 2);
delay_s(2);
GoSraight_L(3, 500, 0, 0);
delay_s(2);
GoSraight_R(2, 500, 0, 0);
delay_s(2);
GoSraight_L(13, 500, 320, 2);*/
///////////////////////////////////////////////////////////////////////////////////
if(sel==2) //侧投中桥
{
qidong();
Count2TurnR(12, 500, 320, 2);
Count2TurnR(6, 500, 320, 2 );
Count2TurnL(2, 800, 0, 0 );
Count2TurnR(2, 800,0, 0 );
GoSraight_L(1, 800, 0, 0);
delay_ms(500);
risego();
set_speed(0, 1);
set_speed(0, 0);
delay_ms(2300);
GO;
while((PINB&0x01)!=0);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
dongzuo();
}
if(sel==3) //投对方一分区
{
qidong();
Count2TurnR(14, 500, 320, 2);
Count2TurnR(11, 500, 320, 2);
Count2TurnL(6, 500, 320, 2 );
GO;
delay_ms(100);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
risego();
delay_ms(2300);
dongzuo();
}
if(sel==4) //右桥投块
{
qidong();
Count2TurnR(14, 500, 320, 2);
Count2TurnR(11, 500, 320, 2 );
Count2TurnR(10, 500, 320, 2 );
GoSraight_L(2, 800, 0, 0);
delay_ms(500);
risego();
delay_ms(2300);
GO;
set_speed(800,1);
set_speed(800,0);
while((PINB&0x01)!=0);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
dongzuo();
delay_ms(3000);
set_speed(-600,1);
set_speed(-600,0);
delay_ms(3000);
set_speed(0,1);
set_speed(0,0);
Count2TurnL(1, 800, 0, 0 );
Count2TurnR(1, 800, 0, 0 );
Count2TurnR(3, 800, 0, 0 );
while(1)
{Count2TurnR(2, 800, 0, 0 );}
}
if(sel==5) //投左桥
{
qidong();
Count2TurnR(12, 500, 320, 2 );
GoSraight_R(7,500, 320, 2);
delay_ms(50);
risego();
delay_ms(2300);
GO;
while((PINB&0x01)!=0);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
dongzuo();
}
if(sel==6)
{
qidong();
Count2TurnR(11, 500, 320, 2 );
Count2TurnR(3, 800, 0, 0 );
GO;
delay_ms(100);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
risego();
delay_ms(2300);
dongzuo();
}
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
while(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -