我用十三个对管,舵机控制转向,八个对管的话状态改下就行,给你参考下,不明白可以追问我,qq 181325995
#include<reg52h>
#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;
}
}
//包含所需头文件
#include <ioM16vh>
#include <macrosh>
#include"time1_inith"
#include"motorh"
#define ahead 1
#define backwards 0
#define compare(x,y) (x<y1:0)
#define mid 0X17
//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x08;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
void timer0_init(void)
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0x00;//初始值
OCR0 = 0x17;//匹配值
TIMSK |= 0x00;//中断允许
TCCR0 = 0x7D;//启动定时器
}
void adc_init(void)
{
//adc转换初始化
ADCSRA = 0x00; //禁止AD转换
ADCSRA|=BIT(ADIF);
ADMUX=0X46;
SFIOR |= 0x00;
ACSR = 0x80; //禁止模拟比较器
ADCSRA = 0xE7;
}
void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
timer0_init();
timer1_init();
adc_init();
SEI();//开全局中断
}
uint sensor_head[3],sensor_back[3],cord; //存储6个传感器AD转换的值
uchar offset ; //黑线偏移小车中心轴的距离
uint sensor_compare_head[3]={300,300,300},sensor_compare_back[3]={300,300,300}; //判断黑线是否位于传感器下的阈值
uchar start_head_sensor(void)
{
uchar i,j=0,sum=0;
ADMUX=0X40;
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
for(i=0;i<3;i++)
{
ADMUX=0X40+i; //启用前端传感器0,1,2通道
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
sensor_head[i]=ADC;
}
for(i=3;i;i--)
{
if(compare(sensor_head[i-1],sensor_compare_head[i-1]))
{
sum+=i-1;
j++;
}
}
if(j)
offset=sum2/j;
ADMUX=0X46;
ADCSRA=0xE7;
return offset;
}
uchar start_back_sensor(void)
{
uchar i,j=0,sum=0;
ADMUX=0X43;
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
for(i=0;i<3;i++)
{
ADMUX=0X43+i; //启用前端传感器0,1,2通道
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
sensor_back[i]=ADC;
}
for(i=3;i;i--)
{
if(compare(sensor_back[i-1],sensor_compare_back[i-1]))
{
sum+=i-1;
j++;
}
}
if(j)offset=sum2/j;
ADMUX=0X46;
ADCSRA=0XE7;
return offset;
}
//角度传感器滤波函数
uint cord_sensor(void)
{
uchar i;
uint max=0,min=1023,sum=0;
for(i=0;i<5;i++)
{
ADCSRA|=BIT(ADIF);
while(!(ADCSRA&BIT(ADIF)));
cord=ADC;
sum+=cord;
max=(max>cord)max:cord;
min=(min<cord)min:cord;
}
return (sum-max-min)/3;
}
void direc_ctrl(uchar x,uchar y)
{
if(y)
{
if(x==0)OCR0=mid+3;
if(x==4)OCR0=mid-3;
if(x==2) OCR0=mid;
}
else OCR0=mid+x-2;
}
void menmber_path(void)
{
uchar j;
uint i;
uint max_head[3]={0,0,0},min_head[3]={1023,1023,1023},max_back[3]={0,0,0},min_back[3]={1023,1023,1023};
for(i=4000;i;i--)
{
start_head_sensor();
for(j=0;j<3;j++)
{
max_head[j]=(max_head[j]>sensor_head[j])max_head[j]:sensor_head[j];
min_head[j]= (min_head[j]<sensor_head[j])min_head[j]:sensor_head[j];
}
start_back_sensor();
for(j=0;j<3;j++)
{
max_back[j]=(max_back[j]>sensor_back[j])max_back[j]:sensor_back[j];
min_back[j]= (min_back[j]<sensor_back[j])min_back[j]:sensor_back[j];
}
}
for(j=0;j<3;j++)
{
sensor_compare_head[j]=(max_head[j]+min_head[j])/2;
sensor_compare_back[j]=(max_back[j]+min_back[j])/2;
}
}
uchar head_sensor_all(void)
{
start_head_sensor();
if( compare(sensor_head[0], sensor_compare_head[0]) && compare(sensor_head[1], sensor_compare_head[1]) && compare(sensor_head[2], sensor_compare_head[2]))
return 1;
else
return 0;
}
uchar back_sensor_all(void)
{
start_back_sensor();
if( compare(sensor_back[0], sensor_compare_back[0]-30) && compare(sensor_back[1], sensor_compare_back[1]-30) && compare(sensor_back[2], sensor_compare_back[2]-30))
return 1;
else
return 0;
}
void search_path_ahead(uchar speed)
{
motor_autorun(ahead,speed);
while(1)
{
if(head_sensor_all())
{
motor_stop();
return;
}
else
{
direc_ctrl(offset,1);
}
}
}
void search_path_backward(uchar speed)
{
motor_autorun(0,speed);
while(1)
{
if(back_sensor_all())
{
motor_stop();
return;
}
else
direc_ctrl(offset,0);
}
}
你好!可能的原因有三个:
1传感器故障
2程序逻辑问题
3机械结构故障
首先分析问题出在哪个环节,单独测试每一个传感器在遇到障碍和没有障碍情况下的实时输出信号是否正常,如果没有问题再测试机械结构,给电动机正常加上电源,观察小车能否走直线,如果都没有问题,再来观察程序代码,看在障碍解除后程序有无归位直线的逻辑…
先把这些最基本的排查问题的流程走完,如果还有问题那再具体分析!祝早日成功!
以上就是关于请问怎样使用tcrt5000光电开关实现智能小车自动避障,怎样调节避障距离啊怎样连接电路图啊,谢谢!全部的内容,包括:请问怎样使用tcrt5000光电开关实现智能小车自动避障,怎样调节避障距离啊怎样连接电路图啊,谢谢!、哪位大神可以提供智能小车循迹时候对其的资料或者程序、做了一个51单片机的避障智能小车,但是它在行驶的时候很容易打转,请问各位前辈这是怎么弄的啊,小车是等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)