|
紅外探頭只工作一次,就是按剛開始檢測到的黑線來算,然后只能前進或者右轉(zhuǎn)左轉(zhuǎn),電機一直保持這種狀態(tài),不能按照黑線方向來改變運動狀態(tài)
#include "reg52.h"
#include <intrins.h>
sbit IN1=P1^0; //定義驅(qū)動模塊IN1為P1.0 左上電機 M2 OUT1 OUT2
sbit IN2=P1^1; //定義驅(qū)動模塊IN2為P1.1
sbit IN3=P1^2; //定義驅(qū)動模塊IN3為P1.2 左下電機 M3 OUT3 OUT4
sbit IN4=P1^3; //定義驅(qū)動模塊IN4為P1.3
sbit IN5=P1^4; //定義驅(qū)動模塊IN5為P1.4 右上電機 M1 OUT5 OUT6
sbit IN6=P1^5; //定義驅(qū)動模塊IN6為P1.5
sbit IN7=P1^6; //定義驅(qū)動模塊IN7為P1.6 右下電機 M4 OUT7 OUT8
sbit IN8=P1^7; //定義驅(qū)動模塊IN8為P1.7
sbit left_led=P2^5; //定義左路尋跡為P2.5
sbit middle_led=P2^6; //定義中路尋跡為P2.6
sbit right_led=P2^7; //定義右路尋跡為P2.7
#define Left_moto_go {IN1=1,IN2=0,IN3=1,IN4=0;} //左邊兩個電機向前走
#define Left_moto_back {IN1=0,IN2=1,IN3=0,IN4=1;} //左邊兩個電機向后轉(zhuǎn)
#define Left_moto_Stop {IN1=0,IN2=0,IN3=0,IN4=0;} //左邊兩個電機停轉(zhuǎn)
#define Right_moto_go {IN5=1,IN6=0,IN7=1,IN8=0;} //右邊兩個電機向前走
#define Right_moto_back {IN5=0,IN6=1,IN7=0,IN8=1;} //右邊兩個電機向后轉(zhuǎn)
#define Right_moto_Stop {IN5=0,IN6=0,IN7=0,IN8=0;} //右邊兩個電機停轉(zhuǎn)
bit Right_moto_stop=1;
bit Left_moto_stop =1;
sbit IRIN=P3^2;//紅外接收器為P3.2
#define Imax 14000 //晶振位11.0592時的值 (12÷11.0592)*13≈14ms
#define Imin 8000 // 8毫秒
#define Inum1 1450 //
#define Inum2 700
#define Inum3 3000
unsigned char f=0;
unsigned char Im[4]={0x00,0x00,0x00,0x00};
unsigned char show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;
//延時函數(shù)
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
//接收頭解碼
void intersvr0(void) interrupt 1 using 1 //定時器T0
{
Tc=TH0*256+TL0; //提取中斷時間間隔時長
TH0=0;
TL0=0; //定時中斷重新置零
if((Tc>Imin)&&(Tc<Imax))
{
m=0;
f=1;
return;
} //找到啟始碼
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80; m++;
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1; m++; //取碼
}
if(m==32) //接收完32位數(shù)據(jù) 用戶碼/用戶反碼/數(shù)據(jù)碼/數(shù)據(jù)反碼
{
m=0;
f=0;
if(Im[2]==~Im[3])
{
IrOK=1; //拉高紅外接收頭電平
}
else IrOK=0; //取碼完成后判斷讀碼是否正確
}
//準備讀下一碼
}
}
//前進函數(shù)
void run(void)
{
Left_moto_go ; //左電機往前走
Right_moto_go ; //右電機往前走
}
//后退函數(shù)
void backrun(void)
{
Left_moto_back ; //左電機往后走
Right_moto_back ; //右電機往后走
}
//左轉(zhuǎn)函數(shù)
void leftrun(void)
{
Left_moto_Stop ; //左電機往后走
Right_moto_go ; //右電機往前走
}
//右轉(zhuǎn)函數(shù)
void rightrun(void)
{
Left_moto_go ; //左電機往前走
Right_moto_Stop ; //右電機往后走
}
//小車停止
void stop(void)
{
Left_moto_Stop ; //左電機往前走
Right_moto_Stop ; //右電機往前走
}
void xunji(void)
{
if(right_led==1&&middle_led==1&&left_led==1) //三路檢測到黑線
{
run();//前進
}
else
{
if(right_led==1&&middle_led==0&&left_led==0) //右邊檢測到黑線
{
rightrun();//右轉(zhuǎn)
}
if(right_led==0&&middle_led==0&&left_led==1) //左邊檢測到黑線
{
leftrun();//左轉(zhuǎn)
}
}
}
//主函數(shù)
void main(void)
{
m=0;
f=0;
IT0=1;
EX0=1;
TMOD=0x11;//工作方式3
TH0=0;
TL0=0;
TR0=1;
EA=1; //總中斷打開
delay(100);
while(1) /*無限循環(huán)*/
{
if(IrOK==1) //判斷接收頭是否為1
{
switch(Im[2])
{
case 0x18: run(); //前進
break;
case 0x52: backrun(); //后退
break;
case 0x08: leftrun(); //左轉(zhuǎn)
break;
case 0x5A: rightrun(); //右轉(zhuǎn)
break;
case 0x1C: stop(); //停止
break;
case 0x55:xunji (); //尋跡
break;
default:break;
}
IrOK=0;
}
}
}
|
|