帮忙看看谢谢大家
单片机源程序如下:
#include <reg52.h>#define uint unsigned int
#define uchar unsigned char
sbit IN11=P1^6; //左前轮
sbit IN12=P1^7;
sbit IN13=P1^4; //右前轮
sbit IN14=P1^5;
sbit IN21=P1^0; // 左后轮
sbit IN22=P1^1;
sbit IN23=P1^2; //右后轮
sbit IN24=P1^3;
sbit S1=P0^3; //速度
sbit S2=P0^2;
sbit S3=P0^1;
sbit S4=P0^0;
sbit D1=P2^3; //循迹
sbit D2=P2^2;
sbit D3=P2^1;
sbit D4=P2^0;
uchar counter,compare;
void a () //左轮前进
{
IN11=1;
IN12=0;
IN21=1;
IN22=0;
}
void aa () //左轮后退
{
IN11=0;
IN12=1;
IN21=0;
IN22=1;
}
void b ()
{
IN13=0; //右轮前进
IN14=1;
IN23=0;
IN24=1;
}
void bb ()
{
IN13=1; //右轮后退
IN14=0;
IN23=1;
IN24=0;
}
void car_stop () //停止
{
IN11=1;
IN12=1;
IN13=1;
IN14=1;
IN21=1;
IN22=1;
IN23=1;
IN24=1;
}
void Timer0_Init() //100微秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xA4; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //定时器0中断允许开关
EA=1; //定时器总开关
PT0=0; //定时器0中断优先级
}
void Timer0_Routine() interrupt 1 //中断函数
{
TL0 = 0xA4;
TH0 = 0xFF;
compare=6;
counter++;
if(counter>=20)
{
counter=0;
}
if(counter<compare)
{
S1=1;
S2=1;
S3=1;
S4=1;
}
else
{
S1=0;
S2=0;
S3=0;
S4=0;
}
}
void car_go() //小车向前
{
compare=5;
a();
b();
}
void car_back()//小车向后
{
compare=5;
aa();
bb();
}
void car_leftgo()//左拐
{
compare=5;
aa();
b();
}
void car_rightgo() //右拐
{
compare=5;
a();
bb();
}
void delayms (uint x)
{
int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void xunji ()
{
if(D1==1&&D2==1&&D3==1&&D4==1) //全检测到黑线
{
car_go ();
}
if(D1==0&&D2==1&&D3==0&&D4==0) //中间右侧检测到黑线,小车偏左,小车向右移动
{
car_rightgo ();
if(D1==0&&D2==0&&D3==0&&D4==0)
{
car_go ();
}
}
if(D1==0&&D2==0&&D3==1&&D4==0) //中间左侧检测到黑线,小车偏右,小车向左移动
{
car_leftgo ();
if(D1==0&&D2==0&&D3==0&&D4==0)
{
car_go ();
}
}
if(D1==0&&D2==0&&D3==1&&D4==1) //直角左拐
{
car_go ();
delayms(500);
if(D1==0&&D2==0&&D3==0&&D4==0)
{
car_stop();
delayms(500);
car_leftgo ();
}
}
if(D1==1&&D2==1&&D3==0&&D4==0) //直角右拐
{
car_go ();
delayms(500);
if(D1==0&&D2==0&&D3==0&&D4==0)
{
car_stop();
delayms(500);
car_rightgo ();
}
}
if((D1==0&&D2==0&&D3==0&&D4==1)||(D1==0&&D2==1&&D3==0&&D4==1)||(D1==0&&D2==1&&D3==1&&D4==1)) //锐角左拐
{
car_go ();
delayms(500);
delayms(500);
if(D1==0&&D2==0&&D3==0&&D4==0)
{
car_stop();
delayms(500);
car_leftgo();
}
}
if((D1==1&&D2==0&&D3==0&&D4==0)||(D1==1&&D2==0&&D3==1&&D4==0)||(D1==1&&D2==1&&D3==1&&D4==0)) //锐角右拐
{
car_go ();
delayms(500);
delayms(500);
if(D1==0&&D2==0&&D3==0&&D4==0)
{
car_stop();
delayms(500);
car_rightgo();
}
}
if(D1==0&&D2==1&&D3==1&&D4==0)
{
car_go();
}
}
void main ()
{
Timer0_Init();
car_go ();
while (1)
{
xunji ();
}
} |