本人刚刚完成了两周的电子工艺实习,0基础完成了红外线智能循迹小车的设计。
分享源代码给大家,希望能对0基础新手有所帮助~
说明:此智能小车拥有五个传感器,在车头由左到右均匀分布,本文附件中最后的注释中详细分析了传感器信号的32种情况。
以下是源程序:
#include <reg52.h>
#define uchar unsigned char
//传感器
sbit left2 = P3^6;//左外
sbit left1 = P3^5;//左内
sbit middle = P3^4;//中间
sbit right1 = P3^3;//右内
sbit right2 = P3^2;//右外
// motoa 右车轮
sbit IN1 = P1^3;
sbit IN2 = P1^5;
sbit ENA = P1^4;
// motob 左车轮
sbit IN3 = P1^2;
sbit IN4 = P1^0;
sbit ENB = P1^1;
//转弯标志
uchar data r=0;
uchar data l=0;
//计时
uchar data t=0;
//延时函数
void Delay_ms(uint xms) //延时程序,xms是形式参数
{
uint i, j;
for(i=xms;i>0;i--) // i=xms,即延时xms, xms由实际参数传入一个值
for(j=115;j>0;j--); //此处分号不可少
}
//中断服务函数
void timer0() interrupt 1 //定时器1溢出中断函数
{
TH1=0XFC; //重置定时器1初值
TL1=0X18;
t++; //每一毫秒t2加一
if(t==6)
t=0; //六毫秒为一周期为电机和数码管延时
if(P3^6==1&&P3^5==1) l=1; //左侧探头探测到黑线
if(P3^3==1&&P3^2==1) r=1; //右侧探头探测到黑线
}
//直行函数
void forward()
{
IN1=1;IN2=0;
IN3=1;IN4=0;
}
//右转函数
void turnright()
{
IN1=0;IN2=0;
IN3=1;IN4=0;
}
//左转函数
void turnleft()
{
IN1=1;IN2=0;
IN3=0;IN4=0;
}
//原地右转函数
void rturnback()
{
IN1=0;IN2=1;
IN3=1;IN4=0;
}
//原地左转函数
void lturnback()
{
IN1=0;IN2=1;
IN3=1;IN4=0;
}
//主函数
void main()
{
TMOD=0X11; //定时器工作模式设定
IE=0X8A; //允许定时器0,1溢出中断
TR1=1; //定时器1运行
TH1=0XFC; //定时器1初值设定
TL1=0X18;
IN1=1;IN2=0;IN3=1;IN4=0;
ENA=1;ENB=1; //开始前进
while(1) //死循环
{
if(left2==0&&left1==0&&right1==1)
{turnright();}//右转
else if(left1==1&&right1==0&&right2==0)
{turnleft();}//左转
else if(left2==1&&left1==0&&middle==0&&right1==0&&right2==0)
{lturnback();}//向左原地转弯
else if(left2==0&&left1==0&&middle==0&&right1==0&&right2==1)
{rturnback();}//向右原地转弯
else if(left2==0&&left1==0&&middle==0&&right1==0&&right2==0&&r==1&&l==0)
{lturnback();}//如果之前左侧探头检测到轨道则向左原地转弯
else if(left2==0&&left1==0&&middle==0&&right1==0&&right2==0)
{ turnleft();
if(left2==0&&left1==0&&middle==0&&right1==0&&right2==0&&r==1&&l==0) rturnback();
else turnleft();
}//如果之前右侧探头检测到轨道则向右原地转弯
else {forward();}//前进
}
}
|