基于51单片机的四路红外传感器的循迹小车
(班门弄斧,请各位大神批评指正,烦请提出宝贵意见。)
循迹小车
- 材料:①:51单片机小车具体结构及相关部件清单见该文章
②:红外四路循迹模块(图片来源与网络,侵删)
(功能简述:四对红外发射和接收管,工作时成对用,当发射管发出红外光,照射在白纸上,接收管收到红外信号,输出端输出低电平,照射到黑纸上,光被吸收,接收管收不到红外信号,输出端输出高电平,所以可以用来找追寻黑线) - 步骤:①把红外四路循迹模块的输出端接到P1.0~P1.3;
②把带有上拉电阻的单片机的四路IO口分别接到电机驱动上(我是选P0)
③给单片机、电机驱动、红外循迹模块接电源线;
④下载程序到单片机。
⑤开机运行,测试。 - 代码:
应该注意的一点是:
**给电机驱动的四路IO口最好要带上拉电阻,不然可能驱动不了。**我就在这卡了好久。
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#define time_0 800
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit output_date1=P0^7;
sbit output_date2=P0^6;
sbit output_date3=P0^5;
sbit output_date4=P0^4;
#define GO_STAIGHT {output_date1=1,output_date2=0,output_date3=1,output_date4=0;} //前进
#define GO_BACK {output_date1=0,output_date2=1,output_date3=0,output_date4=1;} //后退
#define TURN_RIGHT {output_date1=1,output_date2=0,output_date3=0,output_date4=1;} //右转
#define TURN_LEFT {output_date1=0,output_date2=1,output_date3=1,output_date4=0;} //左转
#define STOP_CAR {output_date1=0,output_date2=0,output_date3=0,output_date4=0;} //停车
#define Left_1_led P1^0 //四路寻迹模块接口第一路
#define Left_2_led P1^1 //四路寻迹模块接口第二路
#define Right_1_led P1^2 //四路寻迹模块接口第三路
#define Right_2_led P1^3 //四路寻迹模块接口第四路
void delay(u16 n);
void delay(u16 n) //1ms (误差 -0.651041666667us)
{
u16 i ;
unsigned char a,b;
for(i=1;i<=n;i++)
{
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
}
void main()
{
while(1)
{
switch(P1&0x0f)
{
case 0x00: // 全部没有压线,前进
GO_STAIGHT;
break;
case 0x01: // 右压线,左转
TURN_LEFT;
delay(10);
break;
case 0x02: // 右压线,左转
TURN_LEFT;
delay(5);
break;
case 0x04: // 左压线,右转
TURN_RIGHT;
delay(5); //转向延时
break;
case 0x08: // 左压线,右转
TURN_RIGHT;
delay(10); //转向延时
break;
case 0x0f:
STOP_CAR;
break;
default:
break;
}
}
}
有其他疑问可以移步公众号“电子玩家营地”