#include <reg51.h>
#include <intrins.h>
sbit Out1=P0^6; //右边循迹一路
sbit Out2=P1^6; //左边循迹一路
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
#define Right_moto_go {P0_3=1,P0_4=0,P0_1=1,P0_2=0;} //右边边两个电机向前走
#define Right_moto_back {P0_3=0,P0_4=1,P0_1=0,P0_2=1;} //右边两个电机向后转
#define Right_moto_Stop {P0_3=0,P0_4=0,P0_1=0,P0_2=0;} //右边两个电机停转
#define Left_moto_go {P1_4=1,P1_3=0,P1_2=1,P1_1=0;} //左边两个电机向前走
#define Left_moto_back {P1_4=0,P1_3=1,P1_2=0,P1_1=1;} //左边两个电机向后走
#define Left_moto_Stop {P1_4=0,P1_3=0,P1_2=0,P1_1=0;} //左边两个电机停转
#define Left_moto_pwm P1_5 //左前方电机信号端ENA
#define Left_moto_pwm1 P1_0 //左后方电机信号端ENB
#define Right_moto_pwm P0_5 //右前方电机信号端ENB
#define Right_moto_pwm1 P0_0 //右后方电机信号端ENA
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned char pwm_val_left =0;//变量定义
unsigned char push_val_left =0;// 左电机占空比N/10
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右电机占空比N/10
unsigned int time=0;
unsigned int timer=0; //延时基准变量
/************************************************************************/
//延时函数
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
void delay_1ms(unsigned char x) //1ms延时函数100ms以内可用
{
unsigned char i;
while(x--)
for(i=124;i>0;i--);
}
/************************************************************************/
//全速前进
void run(void)
{
push_val_left=7; //速度调节变量 0-9。。。9最大,0最小
push_val_right=7;
Left_moto_go ; //左电机往前走
Right_moto_go ; //右电机往前走
}
/************************************************************************/
//全速后退
void backrun(void)
{
push_val_left=4; //速度调节变量 0-9。。。9最大,0最小
push_val_right=4;
Left_moto_back ; //左电机往后走
Right_moto_back ; //右电机往后走
}
/************************************************************************/
//左转
void leftrun(void)
{
push_val_left=7; //速度调节变量 0-9。。。9最大,0最小
push_val_right=7;
Left_moto_back ; //左电机往后走
Right_moto_go ; //右电机往前走
}
/************************************************************************/
//右转
void rightrun(void)
{
push_val_left=7; //速度调节变量 0-9。。。9最大,0最小
push_val_right=7;
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往后走
}
/************************************************************************/
//STOP
void stoprun(void)
{
Left_moto_Stop ; //左电机停走
Right_moto_Stop ; //右电机停走
}
/************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{
Left_moto_pwm=1;
Left_moto_pwm1=1;
}
else
{
Left_moto_pwm=0;
Left_moto_pwm1=0;
}
if(pwm_val_left>=10)
pwm_val_left=0;
}
else
{
Left_moto_pwm=0;
Left_moto_pwm1=0;
}
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
Right_moto_pwm1=1;
}
else
{
Right_moto_pwm=0;
Right_moto_pwm1=0;
}
if(pwm_val_right>=10)
pwm_val_right=0;
}
else
{
Right_moto_pwm=0;
Right_moto_pwm1=0;
}
}
/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
void timer1()interrupt 3 using 2
{
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
timer++; //定时器100US为准。在这个基础上延时
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/***************************************************/
void main(void)
{
TMOD=0X11;
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
TH0=0;
TL0=0;
TR1= 1;
ET1= 1;
ET0= 1;
EA = 1;
delay(100);
while(1) /*无限循环*/
{
if(Out1==0&&Out2==0)
run();
if(Out1==1&&Out2==1)
run();
if(Out1==1&&Out2==0)
rightrun();
if(Out1==0&&Out2==1)
leftrun();
}
}