謝謝大神,還有我現(xiàn)在一個尋黑線,就是尋跡的程序總是搞不出來幫我看看,有四個尋跡紅外,中間有兩個。
我寫的程序是這樣的,大神幫我改一改試一下,多謝大神#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;
//延時函數(shù)
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; //速度調節(jié)變量 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; //右電機往前走
}
// 左電機調速
//調節(jié)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中斷服務子函數(shù)產生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\桌面 |