硬件:电机用两个8050驱动 单片机是M16(内部8M) 传感器是红外对管(两个) 测到黑线为低电平 两个传感器夹黑线
可以实现:在小车循迹过程中 把小车拉离黑线(在拉离的时候要保持传感器能测到的高度 小车不能提起) 小车可以自动返回黑线
代码很简单
//左传感器接PA0 右传感器接PA1 (面对车头)
#include<iom16v.h>
#include<macros.h>
#define uint8 unsigned char
#define int8 signed char
#define uint16 unsigned int
#define int16 signed int
#define LIFT 5
#define RIGHT 6
uint8 flag,signal;
void delay(uint16 a)
{
uint8 i,j;
for(i=10;i>0;i--)
for(j=a;j>0;j--);
}
void motor_run()
{
PORTD |= (1<<LIFT)|(1<<RIGHT);
}
void motor_stop()
{
PORTD &= ~(1<<LIFT)&~(1<<RIGHT);
}
void motor_r()
{
PORTD = 0XFF;
PORTD &= ~(1<<LIFT);
}
void motor_l()
{
PORTD = 0XFF;
PORTD &= ~(1<<RIGHT);
}
void main()
{
DDRD = 0XFF;
DDRA = 0X00;
PORTA = 0XFF;
while(1)
{
flag = PINA;
signal = flag & 0X03;
switch(signal)
{
case 0X00:motor_run();//两黑
break;
case 0X01:motor_r();//右黑左白
break;
case 0X02:motor_l();//左黑右白
break;
case 0X03: while(!(signal==0x03)); //两白
break;
default: motor_run();
}
}
}
小车实现“自动返回黑线(也就不怕冲出跑道)”是我在实验过程中无意中实现的 我正在找原因 现在的情况是:
传感器 轮子
左黑 右黑 左转右转 前进
左白 右黑 (保持左白) 左停右转 左拐
左白 右白(保持左白) 左停右转 左拐 在其中一个传感器测到白色(输出高)并保持一直测到白色,另一个无论测到黑或白
右白 左黑 (保持右白) 左停右转 右拐 电机的状态都不变
右白 左白(保持右白) 左停右转 右拐
小车可以转过90度折线 甚至80度的折线
当我把 上边代码中
case 0X03: while(!(signal==0x03));
break;
两句注释掉的时候
小车必须 很慢很慢(速度要比原来的1/2还慢才行) 才能循迹 并且不能过90度的折线 不能实现“自动返回黑线”
还有:1,在把车放在白色区域 上电 车会前进一下 然后就不动了 放回到黑线线上就开始动了
2,很快的把车从黑线的左边拿到右边(保持车不要离地太高)在把车放下 车左拐 反之右拐 |