和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(); //向前
}
}