基于51单片机智能小车循迹程序.docx
- 文档编号:5523548
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:13
- 大小:15.94KB
基于51单片机智能小车循迹程序.docx
《基于51单片机智能小车循迹程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机智能小车循迹程序.docx(13页珍藏版)》请在冰点文库上搜索。
基于51单片机智能小车循迹程序
#inelude
#inelude
#defineuintunsignedint
#defineueharunsignedchar
/**********************************/
ueharled_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};
ueharturn_count=0;
bitend=0;//圈数跑完标志
/*********************************/
sbitxg0=P1A0;//左寻轨对管
sbitxg仁P1A1;//中间寻轨对管
sbitxg2=P1A2;//右寻轨对管
sbitxz=P1A3;〃感应挡板对管
/*********************************/
sbitQ_IN仁P2A0;//车前左轮控制
sbitQ_IN2=P2A1;
sbitQ_IN3=P2A2;//车前右轮控制
sbitQ_IN4=P2A3;
sbitH」N仁P2A4;//车尾左轮控制
sbitH_IN2=P2A5;
sbitH_IN3=P2A6;//车尾右轮控制
sbitH_IN4二P2八7;
sbitQ_ENA=P3A0;//车前左轮使能,PWM
sbitQ_ENB=P3A1;//车前右轮使能,
sbitH_ENA=P3A6;//车尾左轮使能,
sbitH_ENB=P3A7;//车尾右轮使能,
/****************************************/
#definestra_q_l100//直线行走时,四个轮子占空比调试
#definestra_q_r100
#definestra_h_l100
#definestra_h_r100
#defineturn_q」100//转弯时四个轮子的占空比调试
#defineturn_q」100
#defineturn_h」100
#defineturn_h」100
#defineturnr_time2900〃右转弯时的延时常数
#defineturnl_time3000//左转弯时的延时常数
#definedt_time5800//原地掉头时延时常数
#defineover_time1000//停止延时
#defineback_time2500//走完环形,回到直道延时转弯
#defineblack_time1500//过黑线的时间
#definecorrect_l_time700//左矫正时间
#definecorrect_r_time700//右矫正时间
#definehou_time200
/***************************************/
ucharq_duty_l,q_duty_r,h_duty_l,h_duty_r,〃车前后左右轮占空比i=0,j=0,k=0,m=0;
/**************************************/
voiddelay_cir(uintn)
{
ucharx;
while(n--)
{
for(x=0;x<250;x++);
};
}
/***********************************/
voiddelay(uintct)//延时函数
{
uintt;
t=ct;
while(t--);
}
/***************************************
voidstraight。
//直走
{
q_duty_l二stra_q_l;
q_duty_r=stra_q_r;
h_duty_l=stra_h」;
h_duty_r=stra_h_r;
Q_IN仁1;
Q」N2=0;
Q_IN3=1;
Q_IN4=0;
H」N仁1;
H」N2=0;
H_IN3=1;
H_IN4=0;
}
/***************************************
voidhoutui()//后退
{
q_duty_l=stra_q_l;
q_duty_r=stra_q_r;
h_duty_l二stra_h」;
h_duty_r=stra_h_r;
Q_IN仁0;
Q_IN2=1;
Q_IN3=0;
Q_IN4=1;
H」N仁0;
H_IN2=1;
H_IN3=0;
H_IN4=1;
}
/***************************************
voidturn」eft()//左转
{
q_duty_l=turn_q」;
q_duty_r=turn_q_r;
h_duty_l=turn_h_l;h_duty_r=turn_h_r;
Q_IN仁0;//左轮反转
Q_IN2=1;
H_IN2=1;
Q_IN3=1;//右轮正转
Q」N4=0;
H_IN3=1;
H_IN4=0;
delay(turnl_time);
}
/***********************************
voidturn_right()//右转
{
q_duty_l=turn_q」;
q_duty_r=turn_q_r;
h_duty_l=turn_q」;
h_duty_r=turn_q_r;
Q_IN仁1;//左轮正转
Q_IN2=0;
H」N仁1;
H」N2=0;
Q_IN3=0;//右轮反转
Q_IN4=1;
H_IN4=1;
delay(turnr_time);
}
/**************************************************/
voidturn_round()//原地掉头
{
q_duty_l=turn_q」;
q_duty_r=turn_q_r;
h_duty_l=turn_h_l;
h_duty_r=turn_h_r;
Q_IN仁0;//左轮反转
Q_IN2=1;
H」N仁0;
H_IN2=1;
Q_IN3=1;//右轮正转
Q_IN4=0;
H_IN3=1;
H_IN4=0;
delay(dt_time);
}
/******************************************************
voidover()//小车停止
{
Q_IN仁0;
Q」N2=0;
Q_IN3=0;
Q_IN4=0;
H」N仁0;
H」N2=0;
H_IN3=0;
H_IN4=0;
}
/*****************************************************
voidcorrect_right()//左偏,向右矫正
{
q_duty_l二turn_q」;
q_duty_r=turn_q_r;
h_duty_l=turn_q」;
h_duty_r=turn_q_r;
Q_IN仁1;//左轮正转
Q_IN2=0;
H_IN2=0;
Q_IN3=0;//右轮反转
Q_IN4=1;
H_IN3=0;
H_IN4=1;
delay(correct_r_time);
}
voidcorrect_left()//右偏,向左矫正
{
q_duty_l=turn_q」;
q_duty_r=turn_q_r;
h_duty_l=turn_h_l;
h_duty_r=turn_h_r;
Q_IN仁0;//左轮反转
Q_IN2=1;
H」N仁0;
H_IN2=1;
Q_IN3=1;//右轮正转
Q_IN4=0;
H_IN3=1;
H_IN4=0;
delay(correct_l_time);
}
/*************************************
voidxunji()
{
if(xg仁=1)
{
turn_count++;
over();
delay(over_time);
if(turn_count==1)
{straight。
;
delay(black_time);
}
else
if(turn_count==2)
{houtui();
delay(hou_time);
turn」eft();
}
else
if(turn_count==3){houtui();delay(hou_time);turn_right();
}
else
if(turn_count==4){houtui();delay(hou_time);turn_right();
}
else
if(turn_count==5){straight。
;delay(black_time);}
else
if(turn_count==6){houtui();delay(hou_time);turn_right();
else
if(turn_count==7){houtui();delay(hou_time);turn_right();
straight();delay(back_time);turn」eft();
}
else
if(turn_count==8){straight。
;delay(black_time);}else
if(turn_count==9){houtui();
delay(100);turn_round();
}
if(turn_count>=9)
{turn_count=0;
cir_count++;
circle--;
}
{end=1;
over();
delay(500);
}
}
else
if((xgO==O)&&(xg仁=0)&&(xg2==0))
{straight。
;}
else
if((xg0==1)&&(xg仁=0)&&(xg2==0))
{over();
delay(over_time);
houtui();
delay(hou_time);
correct_right();
}//左偏,向右矫正
elseif((xgO==O)&&(xg仁=0)&&(xg2==1))
{over();
delay(over_time);
houtui();
delay(hou_time);
correct_left();
}//右偏,向左矫正
}
/***********************************************/
voidint0(void)interrupt0//中断圈数设定
{
EX0=0;
delay_cir(250);
circle++;
if(circle>8)
{circle=0;
}
P0=led_data[circle];
EX0=1;
}
/*************************************/
voidtimel(void)interrupt3〃T1溢出中断,电机调速
{
i++;
j++;
k++;
m++;
if(i Q_ENA=1; elseQ_ENA=0; if(i>100) {Q_ENA=1;i=0;} if(j Q_ENB=1; elseQ_ENB=0; if(j>100) {Q_ENB=1;j=0;} if(k H_ENA=1; elseH_ENA=0; if(k>100) {H_ENA=1;k=0;} if(m H_ENB=1; elseH_ENB=O; if(m>100) {H_ENB=1;m=0;} PO=led_data[circle]; TH1=0XFF; TL1=0XF6; } /*************************************/ voidmain() { PO=led_data[circle]; P1=0xFF; P1=0XFF;〃P1口做输入 P2=0X00;〃P2口初始化,小车禁止 P3=0XFF; TMOD=OX11;//TO,T1,工作方式1 TH1=0XFF;〃T1中断一次10US TL1=0XF6; TR仁1; EX0=1; ET1=1; EA=1; while (1) { while((xz==1)&&(end! =1))//无挡板,扫描对管,前进 { xunji(); }; }; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 智能 小车 程序