本人写的程序:(目前实现了循线和避障功能)
#include"reg51.h"
sbit p00=P0^0; //左端灰度传感器
sbit p01=P0^1; //左中灰度传感器
sbit p02=P0^2; //右中灰度传感器
sbit p03=P0^3; //右端灰度传感器
sbit p04=P0^4; // 前端避障传感器
sbit p05=P0^5; // 右侧避障传感器
sbit p10=P1^0; //p10=0,p11=1--左转
sbit p11=P1^1; //p10=1,p11=0--右转
sbit p12=P1^2; //p12=1,p13=0--前进
sbit p13=P1^3; //p12=0,p13=1--后退
unsigned long i=0;
bit zhuan=1;//用于循线与避障之间的切换
bit j=1;
void kongzhi() //控制车前轮转向的程序
{
p00=1;p01=1;p02=0;p03=1;
if(p00==0) //左端灰度检测到黑线
{
p10=0;p11=1; //左转
}
if(p01==0) //左中灰度检测到黑线
{
p10=0;p11=1; //左转
}
if(p02==0) //右中灰度检测到黑线
{
p10=1;p11=0; //右转
}
if(p03==0) //右端灰度检测到黑线
{
p10=1;p11=0; //右转
}
if(p00==1&&p01==1&&p02==1&&p03==1) //四个灰度传感器都检测不到黑线
{
p10=1;p11=1; //不做任何方向的改变
}
}
void delay1() //后轮转速控制延时
{
unsigned long i;
for(i=0;i<320;i++);
}
void delay2() //后轮转速控制延时
{
unsigned long i;
for(i=0;i<500;i++);
}
void xingzou() //控制车后轮转动的程序
{
p12=1;p13=0; //前进
delay1();
p13=1; //停止 构成脉宽控速
delay2();
}
void bizhang() //避障程序
{
p04=1;p05=1;
if(p04==0) //前端避障传感器检测到障碍
{
if(j==1){
TH0=0x63;
TL0=0x18;
}
p10=0;p11=1;j=0; //左转
}
if(p05==0&&j==1) //右侧避障传感器检测到障碍
{
p10=0;p11=1; //左转
}
if(p04==1&&p05==1&&j==1) //都检测不到障碍物
{
p10=1;p11=0; //右转
}
}
void timer0(void) interrupt 1
{
TH0=0x63;
TL0=0x18;
i++;
if(i==100){
i=0;j=1;
}
}
void main() //主函数
{
TMOD=0x01;
TH0=0x63;
TL0=0x18; //5ms
TR0=1;
ET0=1;
EA=1;
while(1)
{
xingzou(); //前进
if(p01==0&&j==1)zhuan=1; //
if(p04==0)zhuan=0;
if(zhuan==1)kongzhi(); //转向
if(zhuan==0)bizhang(); //避障
}
}
程序比较简单。
下面发一个循线和避障的视频,为了方便看,我发了MP4和WMV两种格式。