本人剛剛完成了兩周的電子工藝實習,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();}//前進
}
}
|