#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
////P1.0,P1.1电机方向控制 电机左
//#define motol_en1 P1|=0x01
//#definemotol_en2 P1|=0x02
//#definemotol_uen1 P1&=~0x01 //清零
//#definemotol_uen2 P1&=~0x02
//// //P1.2,P1.3电机方向控制 电机右
//#define motor_en1 P1|=0x04
//#definemotor_en2 P1|=0x08
//#definemotor_uen1 P1&=~0x04
//#definemotor_uen2 P1&=~0x08
#defineT0_EN TR0=1
#defineT0_UEN TR0=0
#defineT1_EN TR1=1
#defineT1_UEN TR1=0
//
sbit motol_en1=P1^0;
sbit motol_en2=P1^1;
sbit motor_en1=P1^2;
sbit motor_en2=P1^3;
sbit D4=P0^0;
sbit D3=P0^1;
sbit D2=P0^2;
sbit D1=P0^3;
sbit D5=P0^4;
sbit D6=P0^5;
uint OCR0; //定时器0低八位初值
uint OCR1; //定时器0高八位初值
volatile uchar flag; //状态 0正 1左偏 2右偏 3前出线 4后出线
sbit ENA=P1^6;
sbit ENB=P1^5;
sbit beer=P1^4;
bit PWMS=0x06;
bit PWMS1=0x06;
void Delay100us(uchar n)
{
uchar i;
for(i=147;n!=0;n--)
while(--i);
}
void Delay1ms(uint n)
{
for(;n!=0;n--)
{Delay100us(10);}
}
void Delay1s(uint n)
{
n=n*40;
for(;n!=0;n--)
{Delay100us(250);
}
}
// 驱动程序
void left_go(uchar speed) //左前
{
motol_en1=1;
motol_en2=0;
if(speed!=0)
{
OCR0=speed;
}
T0_EN;
}
//void left_set(uchar speed)
//{
// if(speed!=0)
// {OCR0=speed;}
//}
void right_go(uchar speed)
{motor_en1=1;
motor_en2=0;
if(speed!=0)
{
OCR1=speed;
}
T1_EN; }
//void right_set(uchar speed)
//{
// if(speed!=0)
// {
// OCR1=speed;
//}
//}
//小车动作
void go(void)
{
left_go(250); // 20
right_go(250); //20
}
void turn_left(void)
{
left_go(800); // 0
right_go(600); // 20
}
void turn_right(void)
{
left_go(600); //20
right_go(800); // 0
}
void turn_right_mic(void)
{
left_go(600); // 20
right_go(700); // 0
}
void turn_left_mic(void)
{
left_go(700); // 0
right_go(600); // 20
}
void flag_test(void)
{
uchar flag;
if((D1==1)&&(D2==1)&&(D3==1)&&(D4==1))
{flag=0;}
if (((D1==0)&&(D2==1)&&(D3=1)&&(D4==1))||((D1==0)&&(D2==0)&&(D3==1)&&(D4==1)))
{flag=1;}
if (((D1==1)&&(D2==1)&&(D3=1)&&(D4==0))||((D1==1)&&(D2==1)&&(D3==0)&&(D4==0)))
{flag=2;}
if(D5==1)
{flag=3;}
if(D6==1)
{flag=4;}
}
// 中断
void timer0(void) interrupt 1 //左轮
{
PWMS=~PWMS;
if(PWMS==1)
{
ENA=0;
TL0=OCR0;
}
else
{
ENA=1;
TL0=1000-OCR0;
}
}
void timer1(void) interrupt 3 //右轮
{
PWMS1=~PWMS1;
if(PWMS1==1)
{
ENB=0;
TH0=OCR1;
}
else
{
ENB=1;
TH0=1000-OCR1;
}
}
void port_init(void) //端口初始化
{
EA=1;
ENA=0;
ENB=0;
}
void timer0_init(void) //定时器0初始
{
ET0=1;
TR0=0;
TH0=0;
TL0=0;
}
void timer1_init(void) // 定时器1初始
{
ET1=1;
TR1=0;
TH1=0;
TL1=0;
}
void CLI()
{
EA=0;
// ET0=0;
// ET1=0;
}
void init_devices(void)
{
CLI();
port_init();
timer1_init();
timer0_init();
TMOD=0x33;
}
void main(void)
{
init_devices();
// go();
flag_test();
while(1)
{
flag_test();
switch(flag)
{
case 0:
// right_set(0x50); //80
// left_set(0x50); //80
go();
break;
case 1:
turn_right_mic();
break;
case 2:
turn_left_mic();
break;
case 3:
turn_left();
break;
case 4:
turn_right();
break;
// case 5:
//
// break;
default:
break;
};
};
}
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
////P1.0,P1.1电机方向控制 电机左
//#define motol_en1 P1|=0x01
//#definemotol_en2 P1|=0x02
//#definemotol_uen1 P1&=~0x01 //清零
//#definemotol_uen2 P1&=~0x02
//// //P1.2,P1.3电机方向控制 电机右
//#define motor_en1 P1|=0x04
//#definemotor_en2 P1|=0x08
//#definemotor_uen1 P1&=~0x04
//#definemotor_uen2 P1&=~0x08
#defineT0_EN TR0=1
#defineT0_UEN TR0=0
#defineT1_EN TR1=1
#defineT1_UEN TR1=0
//
sbit motol_en1=P1^0;
sbit motol_en2=P1^1;
sbit motor_en1=P1^2;
sbit motor_en2=P1^3;
sbit D4=P0^0;
sbit D3=P0^1;
sbit D2=P0^2;
sbit D1=P0^3;
sbit D5=P0^4;
sbit D6=P0^5;
uint OCR0; //定时器0低八位初值
uint OCR1; //定时器0高八位初值
volatile uchar flag; //状态 0正 1左偏 2右偏 3前出线 4后出线
sbit ENA=P1^6;
sbit ENB=P1^5;
sbit beer=P1^4;
bit PWMS=0x06;
bit PWMS1=0x06;
void Delay100us(uchar n)
{
uchar i;
for(i=147;n!=0;n--)
while(--i);
}
void Delay1ms(uint n)
{
for(;n!=0;n--)
{Delay100us(10);}
}
void Delay1s(uint n)
{
n=n*40;
for(;n!=0;n--)
{Delay100us(250);
}
}
// 驱动程序
void left_go(uchar speed) //左前
{
motol_en1=1;
motol_en2=0;
if(speed!=0)
{
OCR0=speed;
}
T0_EN;
}
//void left_set(uchar speed)
//{
// if(speed!=0)
// {OCR0=speed;}
//}
void right_go(uchar speed)
{motor_en1=1;
motor_en2=0;
if(speed!=0)
{
OCR1=speed;
}
T1_EN; }
//void right_set(uchar speed)
//{
// if(speed!=0)
// {
// OCR1=speed;
//}
//}
//小车动作
void go(void)
{
left_go(250); // 20
right_go(250); //20
}
void turn_left(void)
{
left_go(800); // 0
right_go(600); // 20
}
void turn_right(void)
{
left_go(600); //20
right_go(800); // 0
}
void turn_right_mic(void)
{
left_go(600); // 20
right_go(700); // 0
}
void turn_left_mic(void)
{
left_go(700); // 0
right_go(600); // 20
}
void flag_test(void)
{
uchar flag;
if((D1==1)&&(D2==1)&&(D3==1)&&(D4==1))
{flag=0;}
if (((D1==0)&&(D2==1)&&(D3=1)&&(D4==1))||((D1==0)&&(D2==0)&&(D3==1)&&(D4==1)))
{flag=1;}
if (((D1==1)&&(D2==1)&&(D3=1)&&(D4==0))||((D1==1)&&(D2==1)&&(D3==0)&&(D4==0)))
{flag=2;}
if(D5==1)
{flag=3;}
if(D6==1)
{flag=4;}
}
// 中断
void timer0(void) interrupt 1 //左轮
{
PWMS=~PWMS;
if(PWMS==1)
{
ENA=0;
TL0=OCR0;
}
else
{
ENA=1;
TL0=1000-OCR0;
}
}
void timer1(void) interrupt 3 //右轮
{
PWMS1=~PWMS1;
if(PWMS1==1)
{
ENB=0;
TH0=OCR1;
}
else
{
ENB=1;
TH0=1000-OCR1;
}
}
void port_init(void) //端口初始化
{
EA=1;
ENA=0;
ENB=0;
}
void timer0_init(void) //定时器0初始
{
ET0=1;
TR0=0;
TH0=0;
TL0=0;
}
void timer1_init(void) // 定时器1初始
{
ET1=1;
TR1=0;
TH1=0;
TL1=0;
}
void CLI()
{
EA=0;
// ET0=0;
// ET1=0;
}
void init_devices(void)
{
CLI();
port_init();
timer1_init();
timer0_init();
TMOD=0x33;
}
void main(void)
{
init_devices();
// go();
flag_test();
while(1)
{
flag_test();
switch(flag)
{
case 0:
// right_set(0x50); //80
// left_set(0x50); //80
go();
break;
case 1:
turn_right_mic();
break;
case 2:
turn_left_mic();
break;
case 3:
turn_left();
break;
case 4:
turn_right();
break;
// case 5:
//
// break;
default:
break;
};
};
}