#include<reg52.h>
#define T_TH0 (65535-1000)/256//定时0.1ms
#define T_TL0 (65535-1000)%256
#define BUFF P2
sbit ENA=P3^6;
sbit IN1=P1^0;
sbit IN2=P1^1; //ENB使能
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit ENB=P3^7; //ENA使能
char flag=1; //标志变量
unsigned int temp=1,buff,num1,num2,count1=0,count2=0; //普通变量
void ahead();
void left1();
void left2();
void left3();
void left4();
void right1();
void right2();
void right3();
void right4();
void main()
{
ENA=1; //使能电机控制端口
ENB=1;
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=1;
IE=0X82; //使能定时器
TMOD=0x01;
TH0=T_TH0;
TL0=T_TL0;
while(1)
{
BUFF=BUFF&0x0f;
switch(BUFF)
{
case 0x00: flag=1; ahead();break;//flag yanchi
case 0x04: flag=2; right1();break;
case 0x08: flag=3; right2();break;
case 0x06: flag=3; right3();break;
case 0x14: flag=3; right4();break;
case 0x02: flag=4; left1();break;
case 0x01: flag=5; left2();break;
case 0x03: flag=5; left3();break;
case 0x07: flag=5; left4();break;
case 0xff:
case 0xce:
case 0x0c:
case 0x0e: flag=1;right1();break;
default : flag=flag; //flag=1;right1();break;
}
if(flag==1||flag==2||flag==4)
{
if(count1>num1)
{
IN1=0;//正轮
}
else IN1=1;
if(count2>num2)
{
IN4=0;
}
else IN4=1;
if(count1>100)
{
TR0=0;
count1=0;
count2=0;
}
}
if(flag==3)
{
if(count1>num1)
{
IN1=0;
}
else IN1=1;
if(count2>num2)
{
IN3=0;
}
else IN3=1;
if(count1>100)
{
TR0=0;
count1=0;
count2=0;
}
}
if(flag==5)
{
if(count1>num1)
{
IN1=0;
}
else IN1=1;
if(count2>num2)
{
IN2=0;
}
else IN2=1;
if(count1>100)
{
TR0=0;
count1=0;
count2=0;
}
}
}
}
void ahead()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN1=1; //zhengzhuan
IN4=1;
num1=100;
num2=100;
switch(temp)
{
case 3:right2(); break;
case 5:left2(); break;
default :TR0=1;
}
}
void right1()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN1=1;
IN4=1;
num1=20; //左
num2=100; //右
temp=0;
TR0=1;
}
void right2()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN3=0;
IN4=1;
num1=0;
num2=100;
temp=3;
TR0=1;
}
void right3()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN2=0;
IN4=1;
num1=0;
num2=100;
temp=3;
TR0=1;
}
void right4()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN2=1; //倒车
IN4=1;
num1=100;
num2=100;
temp=3;
TR0=1;
}
void left1()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN1=1;
IN4=1;
num1=100; //左
num2=18; //右
temp=4;
TR0=1;
}
void left2()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN1=1;
IN2=0;
num1=100;
num2=0;
temp=5;
TR0=1;
}
void left3()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN1=1;
IN2=0;
num1=100;
num2=0;
temp=5;
TR0=1;
}
void left4()
{
IN1=0; //给低电平
IN3=0; //给低电平
IN2=0;
IN4=0;
IN1=1;
IN2=1;
num1=100;
num2=100;
temp=5;
TR0=1;
}
void timer0()interrupt 1
{
TH0=T_TH0;
TL0=T_TL0;
count1++;
count2++;
}
里面num如何调节占空比的