#include <REGX52.H>
#define uchar unsinged char
#define uint unsinged int
//*****驱动芯片l298管脚位声明******
sbit PWM2=P1^0;
sbit PWM1=P1^5;
sbit IN1=P1^4;
sbit IN2=P1^3;
sbit IN3=P1^2;
sbit IN4=P1^1;
//*******传感器TCRT管脚位声明*******
sbit XL=P3^7;//左一
sbit YL=P3^6;//左二
sbit XR=P3^5;//右一
sbit YR=P3^4;//右二
//******用于定时计数的两个全局变量位声明****
int count1=0;
int count2=0;
//*****左边电机前进*****
void forward_turn1()
{
IN1=0;
IN2=1;
}
//*****左边电机后退*****
void reverse_turn1()
{
IN1=1;
IN2=0;
}
//*****右边电机前进*****
void forward_turn2()
{
IN3=0;
IN4=1;
}
//*****右边电机后退*****
void reverse_tuen2()
{
IN3=1;
IN4=0;
}
//******左边电机速度控制函数*****
void speed1(int ct,int sd)
{
if(ct<=sd)
PWM1=1;
else
PWM1=0;
}
//******右边电机速度控制函数*****
void speed2(int ct,int sd)
{
if(ct<=sd)
PWM2=1;
else
PWM2=0;
}
//**********小车直线前进函数*******
void advance(int ct1,int sd1,int ct2,int sd2)
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//******小车左转*******
void Left_turn1(int ct1,int sd1,int ct2,int sd2)
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//******小车右转*******
void Right_turn2(int ct1,int sd1,int ct2,int sd2)
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//*******主函数********
main()
{
TMOD=0X11;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
EX0=1;
ET0=1;
TR0=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EA=1;
EX1=1;
ET1=1;
TR1=1;
while(1)
{
if(XL==0&&XR==0&&YL==0&&YR==0) //传感器未检测到直线,小车直行
{
advance(count1,500,count2,500);
}
if(XL==0&&XR==0&&YL==1&&YR==0) //左边内测检测到,小左转
{
Left_turn1(count1,0,count2,100);
}
if(XL==1&&XR==0&&YL==0&&YR==0) //左外,大左转
{
Left_turn1(count1,0,count2,150);
}
if(XL==0&&XR==0&&YL==0&&YR==1) //右内,小右转
{
Right_turn2(count1,100,count2,0);
}
if(XL==0&&XR==1&&YL==0&&YR==0) //右外,大右转
{
Right_turn2(count1,150,count2,0);
}
/* if(XL==1&&XR==0&&YL==1&&YR==0) //左2,中左转
{
Left_turn1(count1,100,count2,300);
}
if(XL==0&&XR==1&&YL==0&&YR==1) //右2,中右转
{
Right_turn2(count1,300,count2,100);
} */
}
}
//*********中断服务程序*******
void time0() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
count1++;
if(count1>=1000)
count1=0;
}
void time1() interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count2++;
if(count2>=1000)
count2=0;
}
|