发布时间:2019-08-26 21:04:29
#include<reg52.h>
sbit Left_moto_pwm=P1^6; //PWM信号端
sbit Right_moto_pwm=P1^7; //PWM信号端
sbit Left_led=P3^7; //左传感器
sbit Right_led=P3^6; //右传感器
#define Left_moto_go {P1^2=1,P1^3=0;} //左电机向前走
#define Left_moto_back {P1^2=0,P1^3=1;} //左边电机向后转
#define Left_moto_Stop {P1^2=0,P1^3=0;} //左边电机停转
#define Right_moto_go {P1^4=1,P1^5=0;}//右边电机向前走
#define Right_moto_back {P1^4=0,P1^5=1;}//右边电机向后走
#define Right_moto_Stop {P1^4=0,P1^5=0;} //右边电机停转
#define uchar unsigned char
#define uint unsigned int
uchar pwm_val_left =0;//变量定义
uchar push_val_left =0;// 左电机占空比N/20
uchar pwm_val_right =0;
uchar push_val_right=0;// 右电机占空比N/20
uchar Right_moto_stop=1;
uchar Left_moto_stop =1;
uint time=0;
/************************************************************************/
//延时函数
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
void run(void)
{
push_val_left=12; //速度调节变量 0-20。。。0最小,20最大
push_val_right=12;
Left_moto_go ; //左电机往前走
Right_moto_go ; //右电机往前走
}
//后退函数
void backrun(void)
{
push_val_left=12; //速度调节变量 0-20。。。0最小,20最大
push_val_right=12;
Left_moto_back; //左电机往后走
Right_moto_back; //右电机往后走
}
//左转
void leftrun(void)
{
push_val_left=5;
push_val_right=15;
Right_moto_go ; //右电机往前走
Left_moto_back ; //左电机后走
}
//右转
void rightrun(void)
{
push_val_left=16;
push_val_right=8;
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往后走
}
/************************************************************************/
/* 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;
}
else
{
Left_moto_pwm=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
Left_moto_pwm=0;
}
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1; ;
}
else
{
Right_moto_pwm=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
Right_moto_pwm=0;
}
}
/***************************************************/
//*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0XFc; //1Ms定时
TL0=0X18;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/*********************************************************************/
void main(void)
{
unsigned char i;
P1 =0X00; //关电机
TMOD=0X01;
TH0= 0XFc; //1ms定时
TL0= 0X18;
TR0= 1;//打开定时器T0
ET0= 1;
EA = 1;//开总中断
while(1)//无限循环
{
if(Left_led==0&&Right_led==0) //有信号为0 没有信号为1
run(); //调用前进函数
else
{
if(Left_led==1&&Right_led==0) //左边检测到黑线
{
leftrun();//调用小车左转 函数
}
if(Right_led==1&&Left_led==0)//右边检测到黑线
{
rightrun(); //调用小车右转函数
}
}
}
}
你的
#define Left_moto_go {P1^2=1,P1^3=0;} //左电机向前走
#define Left_moto_back {P1^2=0,P1^3=1;} //左边电机向后转
#define Left_moto_Stop {P1^2=0,P1^3=0;} //左边电机停转
#define Right_moto_go {P1^4=1,P1^5=0;}//右边电机向前走
#define Right_moto_back {P1^4=0,P1^5=1;}//右边电机向后走
#define Right_moto_Stop {P1^4=0,P1^5=0;} //右边电机停转
全是错的
你可以先用
sbit P12 = P1^2;
然后再用
P12=1或P12=0
但不能用
P1^2=1,这样的写法的