#include<avr/BoeBot.h>
#include<avr/usta.h>
int PC0_state(void)
{
return (PINC&0x01)?1:0;
}
int PC1_state(void)
{
return (PINC&0x02)?1:0;
}
void Forward(void)
{
PORTC|=_BV(PC3);
delay_nus(1700);
PORTC&=~_BV(PC3);
PORTC|=_BV(PC2);
delay_nus(1300);
PORTC&=~_BV(PC2);
delay_nms(20);
}
void Left_Turn(void)
{
for(uint16_t i=1;i<=30;i++)
{
PORTC|=_BV(PC3);
delay_nus(1300);
PORTC&=~_BV(PC3);
PORTC|=_BV(PC2);
delay_nus(1300);
PORTC&=~_BV(PC2);
delay_nms(20);
}
}
void Right_Turn(void)
{
for(uint16_t i=1;i<=45;i++)
{
PORTC|=_BV(PC3);
delay_nus(1700);
PORTC&=~_BV(PC3);
PORTC|=_BV(PC2);
delay_nus(1700);
PORTC&=~_BV(PC2);
delay_nms(20);
}
}
void Backward(void)
{
for(uint16_t i=1;i<=9;i++)
{
PORTC|=_BV(PC3);
delay_nus(1300);
PORTC&=~_BV(PC3);
PORTC|=_BV(PC2);
delay_nus(1700);
PORTC&=~_BV(PC2);
delay_nms(20);
}
}
int main(void)
{
usta_Init();
int irDetectLeft;
int irDetectRight;
DDRD|=_BV(PD6)|_BV(PD7);
DDRC|=_BV(PC2)|_BV(PC3);
printf("Program Running!");
for(uint16_t counter=1;counter<=6000;counter++)//开始/复位信号
{
PORTD|=_BV(PD7);
delay_nus(166);
PORTD&=~_BV(PD7);
delay_nus(166);
}
while(1)
{
for(uint16_t counter=0;counter<11.5;counter++)
{
PORTD|=_BV(PD6);
delay_nus(13);
PORTD&=~_BV(PD6);
delay_nus(13);
}
irDetectLeft=PC0_state();
irDetectRight=PC1_state();
if((irDetectLeft==0)&&(irDetectRight==0))//两边同时接收到红外线
{
Backward();
Left_Turn();
}
else if(irDetectLeft==0)//只有左边接收到红外线
{
Backward();
Right_Turn();
}
else if(irDetectRight==0)//只有右边接收到红外线
{
Backward();
Left_Turn();
}
else
Forward();
}
}