#include<reg52.h>
// IO定义
sbit L=P1^3; //左边电机使用P1_3口
sbit R=P1^2; //右边电机使用P1_2口
sbit LS=P3^1;
sbit RS=P3^0;
unsigned char i,sgin=0;
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x00;
TL0 = 0x00;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void delay20() //误差 -0.86805555556us
{
unsigned char a,b;
for(b=155;b>0;b--)
for(a=52;a>0;a--);
}
void delay(char t)
{
switch(t)
{
case 12: TH0 = 0xfb;TL0 = 0xb4;break; //1200ms
case 14: TH0 = 0xfa;TL0 = 0xe2;break; //1430ms
case 15: TH0 = 0xfa;TL0 = 0xa1;break; //1500ms
case 16: TH0 = 0xfa;TL0 = 0x58;break; //1600ms
case 18: TH0 = 0xf9;TL0 = 0x8e;break; //1800ms
default :break;
}
TR0=1;
while(!sgin);
sgin=0;
}
void forward() //前进
{
L=1;
delay(18);
L=0;
R=1;
delay(12);
R=0;
delay20(); //20ms的低电平时间
}
void back() //后退
{
L=1;
R=0;
delay(12);
L=0;
R=1;
delay(18);
R=0;
delay20(); //20ms的低电平时间
}
void left_turn() //原地左转
{
L=1;
R=1;
delay(12);
L=0;
R=0;
delay20(); //20ms的低电平时间
}
void right_turn() //原地右转
{
L=1;
R=1;
delay(18);
L=0;
R=0;
delay20(); //20ms的低电平时间
}
void stop() //原地右转
{
L=1;
R=1;
delay(15);
L=0;
R=0;
delay20(); //20ms的低电平时间
}
void left_f()
{
R=1;
delay(12); //右快左慢前进
R=0;
L=1;
delay(16);
L=0;
delay20(); //20ms的低电平时间
}
void right_f()
{
R=1;
delay(14);
R=0;
L=1;
delay(18);
L=0;
delay20(); //20ms的低电平时间
}
void left_b()
{
R=1;
delay(18);
R=0;
L=1;
delay(14);
L=0;
delay20(); //20ms的低电平时间
}
void right_b()
{
R=1;
delay(16);
R=0;
L=1;
delay(12);
L=0;
delay20(); //20ms的低电平时间
}
void main()
{ unsigned char comd;
InitTimer0();
P3=0X00;
for(;;)
{
comd=P2&0x0f;
switch(comd)
{ case 1: left_f();break;
case 2: forward(); break;
case 3: right_f();break;
case 4: left_turn(); break;
case 5: stop(); break;
case 6: right_turn(); break;
case 7: left_b();break;
case 8: back(); break;
case 9: right_b();break;
default: stop(); break;
}
}
}
void Timer0Interrupt(void) interrupt 1
{
sgin=1;
}