和PINC&0x01有关的代码
下边这段代码是小车在行走到墙角处两根触须交替碰墙4次时做一个180度的转弯,逃离死角,在烧片实验时,两根触须碰到墙角,小车还是前行,手动实验也是如此,问题大概还是出在
PINC&0x01
和
PINC&0x02
这两个地方,请老师指点 ,应该如何修改?
#include <avr/robot.h>
//小车的标准头文件
#include <avr/usta.h>
//串口的头文件
int PC0_state(void)
//获取PC0的状态
{
return (PINC&0x01)?1:0;
// 判断左胡须是否遇到障碍物
}
int PC1_state(void)
//获取PC1的状态
{
return (PINC&0x02)?1:0;
// 判断右胡须是否遇到障碍物
}
void Forward(void)
//声明一个前进子函数
{
HIGH_PORTC3;
//设置PC3输出高电平
delay_nus(1700);
//延时0.0017s
LOW_PORTC3;
//设置PC3输出低电平
HIGH_PORTC2;
//设置PC2输出高电平
delay_nus(1300);
//延时0.0013s
LOW_PORTC2;
//设置PC2输出低电平
delay_nms(20);
//延时20ms
}
void Left_Turn(void)
//声明一个向左子函数
{
for(uint16_t i=1;i<=26;i++)
/*声明定义16位无符号整型变量i*/
{
HIGH_PORTC3;
//设置PC3输出高电平
delay_nus(1300);
//延时0.0013s
LOW_PORTC3;
//设置PC3输出低电平
HIGH_PORTC2;
//设置PC3输出高电平
delay_nus(1300);
//延时0.0013s
LOW_PORTC2;
//设置PC2输出低电平
delay_nms(20);
//延时20ms
}
}
void Right_Turn(void)
//声明一个向右子函数
{
for(uint16_t i=1;i<=26;i++)
/*声明定义16位无符号整型变量i*/
{
HIGH_PORTC3;
//设置PC3输出高电平
delay_nus(1700);
//延时0.0017s
LOW_PORTC3;
//设置PC3输出低电平
HIGH_PORTC2;
//设置PC2输出高电平
delay_nus(1700);
//延时0.0017s
LOW_PORTC2;
//设置PC2输出低电平
delay_nms(20);
//延时20ms
}
}
void Backward(void)
//声明一个向后子函数
{
for(uint16_t i=1;i<=65;i++)
/*声明定义16位无符号整型变量i*/
{
HIGH_PORTC3;
//设置PC3输出高电平
delay_nus(1300);
//延时0.0013s
LOW_PORTC3;
//设置PC3输出低电平
HIGH_PORTC2;
//设置PC2输出高电平
delay_nus(1700);
//延时0.0017s
LOW_PORTC2;
//设置PC2输出低电平
delay_nms(20);
//延时20ms
}
}
int main(void)
{
usta_Init();
//串口初始化
printf("Program Running!");
//在调试窗口显示一条信息
SET_DDRD7;
//设置PD7为输出口
SET_DDRC3;
//设置PC3为输出口
SET_DDRC2;
//设置PC2为输出口
for(uint16_t counter=1;counter<=6000;counter++)
//开始/复位信号 蜂鸣器
{
HIGH_PORTD7;
//设置PD7输出高电平
delay_nus(166);
//延时0.00016s
LOW_PORTD7;
//设置PD7输出低电平
delay_nus(166);
//延时0.00016s
}
int
old2=1;
//整型变量初始化
int
old3=0;
//整型变量初始化
int counter=1;
//整型变量初始化
while(1)
if(PC0_state()!=PC1_state())
//判断是否有一根胡须被触动
{
if((old2!=PC0_state())&&(old3!=PC1_state()))
//再次检查是否有一根胡须被触动
{
counter=counter+1;
//胡须触动计数器加1
old2=PC0_state();
//交换变量值
old3=PC1_state();
//交换变量值
if(counter>4)
// 如果发现胡须连续四次被触动,那么计数值置1,并且进行"U"型拐弯
{
counter=1;
//胡须触动计数器置1
Backward();
//向后
Left_Turn();
//向左
Left_Turn();
//向左
}
}
else
//小车没有陷入墙角
counter=1;
//胡须触动计数器置1
}
if((PC0_state()==0)&&(PC1_state()==0))
//两个胡须同时检测到障碍物时,后退,再向左转180度
{
Backward();
//向后
Left_Turn();
//向左
Left_Turn();
//向左
}
else if(PC0_state()==0)
//左边胡须检测到障碍物时,后退,再向右转90度
{
Backward();
//向后
Right_Turn();
//向右
}
else if(PC1_state()==0)
//左边胡须检测到障碍物时,后退,再向左转90度
{
Backward();
//向后
Left_Turn();
//向左
}
else
//没有胡须检测到障碍物时,向前走
Forward();
//向前
}
}