谢谢大神,还有我现在一个寻黑线,就是寻迹的程序总是搞不出来帮我看看,有四个寻迹红外,中间有两个。
我写的程序是这样的,大神帮我改一改试一下,多谢大神#include<AT89X52.H> //reg52.h
#define uchar unsigned char
#define uint unsigned int
sbit QL1 = P1^0;
sbit QL2 = P1^1; // 前面左边 前进(正转)
sbit HL1 = P1^2; // 前面左边 后退(反转)
sbit HL2 = P1^3;
sbit QR1 = P1^4;
sbit QR2 = P1^5;
sbit HR1 = P1^6;
sbit HR2 = P1^7;
sbit EN1 = P2^0; // 高电平使能
sbit EN2 = P2^1; // 高电平使能
sbit EN3 = P2^2; // 高电平使能
sbit EN4 = P2^3; // 高电平使能
#define Left_go {QL1=1,QL2=0,HL1=1,HL2=0;} //左边电机向前走
#define Left_back {QL1=0,QL2=1,HL1=0,HL2=1;} //左边电机向后走
#define Left_Stop {QL1=1,QL2=1,HL1=1,HL2=1;} //左边电机停转
#define Right_go {QR1=1,QR2=0,HR1=1,HR2=0;} //右边电机向前走
#define Right_back {QR1=0,QR2=1,HR1=0,HR2=1;} //右边电机向后走
#define Right_Stop {QR1=1,QR2=1,HR1=1,HR2=1;} //右边电机停转
#define XL P2_3 // 左传感器
#define XML P2_4 // 中左传感器
#define XMR P2_5 // 中右传感器
#define XR P2_6 // 右传感器
#define Left_pwm1 P2_0 //PWM信号端
#define Left_pwm2 P2_1 //PWM信号端
#define Right_pwm1 P2_2 //PWM信号端
#define Right_pwm2 P2_3 //PWM信号端
uchar pwmleft =0;//变量定义
uchar pushleft1 =0;// 左电机1占空比N/20
uchar pushleft2 =0;// 左电机2占空比N/20
uchar pwmright =0;
uchar pushright1=0;// 右电机1占空比N/20
uchar pushright2=0;// 右电机2占空比N/20
bit Right_stop=1;
bit Left_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++);
}
//go
void run(void)
{
pushleft1=7; //速度调节变量 0-20,0最小,20最大
pushleft2=7;
pushright1=7;
pushright2=7;
Left_go ; //左电机往前走
Right_go ; //右电机往前走
}
//left
void leftrun(void)
{
pushleft1=7;
pushleft2 =7;
pushright1=7;
pushright2=7;
Right_go ; //右电机往前走
Left_Stop ; //左电机停止
}
//right
void rightrun(void)
{
pushleft1=7;
pushleft2=7;
pushright1=7;
pushright2=7;
Left_go; //左电机往前走
Right_Stop; //右电机往前走
}
// 左电机调速
//调节push_val_left的值改变电机转速,占空比
void pwm_out_left(void)
{
if(Left_stop&&Left_stop)
{
if(pwmleft<=pushleft1&&pwmleft<=pushleft2)
{
Left_pwm1=1;
Left_pwm2=1;
}
else
{
Left_pwm1=0;
Left_pwm2=0;
}
if(pwmleft>=20)
pwmleft=0;
}
else
{
Left_pwm1=0;
Left_pwm2=0;
}
}
// 右电机调速
void pwm_out_right(void)
{
if(Right_stop)
{
if(pwmright<=pushright1&&pwmright<=pushright2)
{
Right_pwm1=1;
Right_pwm2=1;
}
else
{
Right_pwm1=0;
Right_pwm2=0;
}
if(pwmright>=20)
pwmright=0;
}
else
{
Right_pwm1=0;
Right_pwm2=0;
}
}
void main(void)
{
P1=0X00;
delay(100);
run();
TMOD=0X01;
TH0= 0XFc; //1ms定时
TL0= 0X18;
TR0= 1;
ET0= 1;
EA = 1; //开总中断
while(1)
{
//有信号为0 没有信号为1
if(XL==0&&XR==0&&XML==0&&XMR==0)
run();
else
{
if(XL==1&&XR==0) //左边检测到黑线
{
leftrun();
}
if(XR==1&&XL==0) //右边检测到黑线
{
rightrun();
}
}
}
}
//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1 using 2
{
TH0=0XFc; //1Ms定时
TL0=0X18;
time++;
pwmleft++;
pwmright++;
pwm_out_left();
pwm_out_right();
} C:\Documents and Settings\Administrator\桌面 |