????С???ĵ?·ͼ

核心提示我用十三个对管,舵机控制转向,八个对管的话状态改下就行,给你参考下,不明白可以追问我,qq 181325995#include<reg52.h>#define uint unsigned int #define uchar unsigned

我用十三个对管,舵机控制转向,八个对管的话状态改下就行,给你参考下,不明白可以追问我,qq 181325995

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uint i,count;

uchar pro; //

uchar finish=0;//停车标志

sbit le1=P1^0; //

sbit le2=P1^1;

sbit le3=P1^2;

sbit le4=P1^3;

sbit le5=P1^4;

sbit le6=P1^5;

sbit mid=P1^6;//

sbit ri6=P1^7;

sbit ri5=P2^3;

sbit ri4=P2^4;

sbit ri3=P2^5;

sbit ri2=P2^6;

sbit ri1=P2^7;//

sbit ENA=P2^0; //驱动电机pwm//

sbit moto1=P2^1; //电机控制//

sbit moto2=P2^2;

sbit PWM=P3^5; //舵机pwm//

sbit bz=P3^7;//蔽障管

init()

{

TMOD=0x11;//设定双定时器

EA=1;

TR0=1;

TR1=1;

TH0 = 0x0B1;//设定定时初始值,可去下载个定时器计算软件,

TL0 = 0x0E0;

TH1=(65536-100)/256;

TL1=(65536-100)%256;

ET0=1;

ET1=1;

ENA=1;

}

void delay(uint n)//延时函数

{

uchar a,b,c;

for(c=1;c>0;c--)

for(b=n;b>0;b--)

for(a=2;a>0;a--);

}

void delay2(uint z)

{

uchar a,b,c;

for(a=2;a>0;a--)

for(b=100;b>0;b--)

for(c=z;c>0;c--);

}

void qctyp(void) //光电管全无状态时(脱离轨道),读取前次状态

{

le1=P1^0;

le2=P1^1;

le3=P1^2;

le4=P1^3;

le5=P1^4;

le6=P1^5;

mid=P1^6;

ri6=P1^7;

ri5=P2^3;

ri4=P2^4;

ri3=P2^5;

ri2=P2^6;

ri1=P2^7;

}

void hhig(uint y)//前进函数

{

pro=y;//变量y是改变小车速度这里范围是0--39

moto1=1;

moto2=0;

}

void back(uint z)//后退函数

{

pro=z;//改变z 可改变行驶速度

moto1=0;

moto2=1;

}

void dj(uint m) //舵机控制

{

PWM=1;

delay(m); //改变m可改变舵机转向角度,

PWM=0;

}

void check_stop()//检测终点线,我用十三个对管,八个管停车状态自己分析

{

uchar start_flag;

if((le3&&le4)&&(!le1&&!le6)&&mid&&(ri3&&ri4)&&(!ri1&&!ri6))

start_flag=1;

else if((le2&&le3)&&!le5&&(le6&&mid)&&(ri3&&ri4)&&(ri1&&ri6))

start_flag=1;

else if((le2&&le3)&&le6&&(!le5&&!mid)&&(ri3&&ri4)&&(ri1&&ri6))

start_flag=1;

else if((le2&&le3)&&!le4&&(le5&&le6)&&!mid&&(ri5&&ri4)&&ri1)

start_flag=1;

else if((le2&&le3)&&(!le4&&!le6)&&le5&&!mid&&!ri4&&(ri1&&ri2))

start_flag=1;

else if(le2&&!le3&&(le4&&mid)&&(le5&&le6)&&(ri1&&ri2))

start_flag=1;

else if((le3&&le4)&&le6&&(ri6&&mid)&&(ri2&&ri3)&&!ri5)

start_flag=1;

else if((le5&&le4)&&(!le1&&!mid)&&ri6&&(ri2&&ri3)&&!ri5)

start_flag=1;

else if((le5&&le6)&&(!le1&&!le2)&&ri5&&ri2&&!ri4)

start_flag=1;

else if((le5&&le4)&&(!le1&&!le2)&&(!mid||!ri6)&&ri5&&(ri1&&ri2)&&!ri4)

start_flag=1;

else start_flag=0;

if(start_flag)

{

count++;

delay2(50);

if (count==1)

else if(count==2)

else if(count==3)

{

count=0;

finish=1;

P0=0xa4;//加led显示只是为了方便调试,两圈之后停车

}

else

finish=0;

}

if(finish)

{

ENA=0;

TR1=0;//关定时器1,驱动电机停转

}

}

void xunji()//循迹函数,读取光电管状态

{

if(!le1&&!le2&&!le3&&!le4&&!le5&&!le6&&mid&&!ri6&&!ri5&&!ri4&&!ri3&&!ri2&&!ri1)

{

dj(109);

hhig(39);

}

else if(le6&&mid&&!ri6&&!ri5&&!ri4&&!ri3&&!ri2&&!ri1)

{

dj(114);

hhig(35);

}

。

。

。//分析八个光电管状态,看你的电路检测到黑线输出1或者是0

else

{

dj(109);//舵机归中

hhig(25);

}

}

void main()

{

init();

while(1)

{

check_stop();

if(bz==0)//检测到障碍,。。。

{

back(18);

}

}

}

void timer0() interrupt 1//产生pwm信号控制舵机,周期20ms

{

TH0=0xb1;

TL0=0xe0;

xunji();

}

void timer1() interrupt 3//产生pwm信号控制驱动电机速度

{

TH1=(65536-100)/256;

TL1=(65536-100)%256;

i++;

if(i<=pro)

{

ENA=1;

}

else

{

ENA=0;

}

if(i==40)

{

ENA=~ENA;

i=0;

}

}

 
友情链接
鄂ICP备19019357号-22