智能循迹小车程序
}
if(R==0 && L==0)//都检测到黑线则停止
{
stop();
j = 0;//定时器仍在工作,计数时间清空
}
else//都没有检测到黑线
{
ENB = 0;//关闭转向控制
forward();
}
}
}
Init();//定时器初始化
while(1)
{
if(R==0 && L==1)//右传感器检测到黑线
{
right();//右转
forward();
while(R==0 && L==1);
}
if(R==1 && L==0)//左传感器检测到黑线
{
left();
forward();
while(R==1 && L==0);
{
IN2=0;
IN1=1;
}
void left()//左转
{
ENB=1;//打开使能
IN3=1;
IN4=0;
}
void right()//右转
{
ENB=1;//打开使能
IN3=0;
IN4=1;
}
void stop()//停止
{
IN2=0;
IN1=0;
IN3=0;
IN4=0;
}
void main()
{
}
if(i == 3)
{
P0 = 0x00;
P0 = table[time/ 1000% 10];
}
P2 = ( 0x10 << i );//送位选信号
if(j == 500)
{
time ++;//500次为1秒
j = 0;
}
}
void forward()//前进
{
IN2=1;
IN1=0;
}
void back()//后退
TH0=(256-200)/256; //pwm
TL0=(256-200)/256;
TH1 = 0x0F8;//定时2ms
TL1 = 0x30;
EA = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
}
void tim0(void) interrupt 1 //产生PWM
{
speed ++;
if(speed <= pwm)//pwm就相当于占100的比例{Biblioteka ENA = 1;}
else if(speed < 100)
{
ENA = 0;
}
else
speed = 0;
}
void time1() interrupt 3//定时2ms
{
TH1 = 0x0F8;
TL1 = 0x30;
i =(i+1) % 4;//0-3循环
sbitENB=P1^0;//前轮电机停止控制使能
sbitENA=P1^1;//后轮控制调速控制端口
sbitIN1=P1^2;//前轮
sbitIN2=P1^3;//前轮
sbitIN3=P1^4;//后轮
sbitIN4=P1^5;//后轮
void Init()
{
TMOD = 0x12;//定时器0用方式2,定时器1用方式1
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//D0-D7:f,b,a,e,d,h,c,g共阴依次编码
//74LS04反相器驱动数码管
uchar code table[10] = {0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7};
j++;
if(i == 0)//显示最低位数码管
{
P0 = 0x00;//段选清零防止乱码
P0 = table[time%10];//送段码信号
}
if(i == 1)
{
P0 = 0x00;
P0 = table[time/ 10% 10];
}
if(i == 2)
{
P0 = 0x00;
P0 = table[time/ 100% 10];
uchari = 0;//用于0-3数码管轮流显示
uintj = 0;//计时的次数
uinttime=0;//计时
uintpwm=16;//占空比
uintspeed;//调制PWM波的当前的值
sbitR=P3^2; //右边传感器P3^2
sbitL=P3^3; //左边传感器P3^3
//电机驱动口定义