大神指点(?????)っ
感觉应该是循迹小车吧,论坛里应该有,可以找找
对,就 是循记
//我之前模仿AGV功能小车写的,给你借鉴一下。我知识有限。就看你怎么玩了。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP=P0^7;
sbit k1=P0^6;
sbit k2=P0^5;
unsigned char xunji;//轨道循迹switch 数据
unsigned char xunji2;//轨道循迹switch 数据2
unsigned char zhanwei;//站位数据
unsigned char shijian,dinshi;//控制站位时间
unsigned char shezhi; //控制站数量
unsigned char R; //前后标志位
//************************************************
unsigned char zhan_wei[]={
1, 2, 3, 4, 5, 6//, 7, 8, 9, 10,
//11,12,13,14,15,16,17,18,19,20,
//21,22,23,24,25,26,27,28,29,30
};
//==============================站位数据
unsigned char ting_zhan_wei[]={
1, 2, 3, 4, 5, 6//, 7, 8, 9, 10,
// 11,12,13,14,15,16,17,18,19,20,
// 21,22,23,24,25,26,27,28,29,30
};
//==============================停站数据
//************************************************
//============================
void zhixing(); //直行
void zhixing2();//直行2
void daotui(); //倒退
void zuozhuanwan1();//小左转弯
void youzhuanwan1();//小右转弯
void zuozhuanwan2();//大左转弯
void youzhuanwan2();//大右转弯
void zuozhuanwan3();//最大左转弯
void youzhuanwan3();//最大右转弯
void zuozhuanwan1_1();//小左转弯
void youzhuanwan1_1();//小右转弯
void zuozhuanwan2_2();//大左转弯
void youzhuanwan2_2();//大右转弯
void zuozhuanwan3_3();//最大左转弯
void youzhuanwan3_3();//最大右转弯
void chilushibie();//磁路检测数据
void xunjichazao();//磁路数据循迹查找 直走
void chilushibie2();//倒磁路检测数据
void xunjichazao2();//倒磁路数据循迹查找 倒走
void beep(); //发现障碍报警-蜂鸣器
void kaijibeep(void); //开机正常音
void zhangdianbeep(void);
void yunxingbeep(void);
//============================
void delayqudong(unsigned char t) //大概猜测3ms
{unsigned char a1,b1;
while(t--)
{
for(a1=15;a1>0;a1--) //15
for(b1=100;b1>0;b1--); // 100
}
}
//=======================
void delay2(unsigned char t)
{unsigned char a,b;
while(t--)
{
for(a=10;a>0;a--)
for(b=30;b>0;b--);
}
}
//========================
void delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
//=======================
void delay310us(void)//310us延时函数
{
unsigned char i;
for (i = 143; i > 0; i--);
}
//=======================
void main(void)
{ kaijibeep();//开机正常音
P0=0xff; //按键初始化。
P2=0xff; //马达输出初始化。停车状态。
P1=0xff; //轨道检测初始化。
P3=0xff; //初始化
EA=1; //开总中断开关
EX1=1; //打开外部中断1开关
IT1=1; //触发方式设置//下降沿触发
EX0=1; //打开外部中断0开关
IT0=0; //触发方式设置//电平触发
PX0=1; //设置外部中断0为高优先级
PT0=1; //设置定时器0为高优先级
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256; //设置初值
TL0=(65536-50000)%256;
//ET0=1; //打开定时器中断
//TR0=1; //启动定时器
//=============================
R=0;
//****************************
shezhi=1; //第几站
shijian=4; //需要停多少秒?
//****************************
while(1)
{
if(R==1)
{
chilushibie2();
xunjichazao2();
}
else{
chilushibie();
xunjichazao();
}
//yunxingbeep();
}
}
//====================================
void int0 () interrupt 0 //避障碍物中断
{
if(k1==0)
{delay10ms();
if(k1==1)
{
R=0;
}
}
if(k2==0)
{delay10ms();
if(k1==1)
{
R=1;
}
}
if(k1==1)
{//delay1(5);
if(k2==1)
{
P2=0xff; //马达输出初始化。停车状态。
beep();
}
}
}
//====================================
void int2 () interrupt 2 //站位中断
{
unsigned char i=0;
if(zhan_wei[zhanwei]==ting_zhan_wei[zhanwei])
{
ET0=1; //打开定时器中断0
TR0=1; //启动定时器0
P2=0xff;
zhangdianbeep();
do
{
P2=0xff; //马达输出初始化。停车。
if(dinshi==shijian)
{ dinshi=0; i=1;
TR0=0; //关闭定时器0
ET0=0; //关闭定时器中断0
}
}while(i==0);//*/
zhangdianbeep();
}
zhanwei++;
if(zhanwei==shezhi)
{zhanwei=0; R=1;
//EX1=0; //关外部中断1开关
}
}
//================================
void zhixing()//直行
{
P2=0xaa;
//delayqudong(1);
//P2=0xff;
}
void zhixing2()//反向直行
{
P2=0x55;
//delayqudong(1);
//P2=0xff;
}
void daotui()//倒退
{
P2=0x55;
delayqudong(5);
P2=0xff;
}
//=================
void zuozhuanwan1()//小左转弯
{ P2=0xff;
P2=0x0a;
delay2(1);
//while(xunji==0x08);//1000
P2=0xff;
}
void youzhuanwan1()//小右转弯
{
P2=0xff;
P2=0xa0;
delay2(1);
//while(xunji==0x01);//0001
P2=0xff;
}
void zuozhuanwan2()//大左转弯
{P2=0xff;
P2=0x0a;
delayqudong(5); //4
// while(xunji==0x0c); //1100
P2=0xff;
}
void youzhuanwan2()//大右转弯
{ P2=0xff;
P2=0xa0;
delayqudong(5); //4
//while(xunji==0x03); //0011
P2=0xff;
}
void zuozhuanwan3()//最大左转弯
{ P2=0xff;
P2=0x5a;
delayqudong(5); // delay(5);
//while(xunji==0x0e); //1110
P2=0xff;
}
void youzhuanwan3()//最大右转弯
{ P2=0xff;
P2=0xa5;
delayqudong(5); // delay(5);
//while(xunji==0x07); //0111
P2=0xff;
}
//==================================倒走
void zuozhuanwan1_1()//倒小左转弯
{ P2=0xff;
P2=0x05;
delay2(1);
//while(xunji2==0x80);//
P2=0xff;
}
void youzhuanwan1_1()//倒小右转弯
{ P2=0xff;
P2=0x50;
delay2(1);
//while(xunji2==0x10);
P2=0xff;
}
void zuozhuanwan2_2()//倒大左转弯
{P2=0xff;
P2=0x05;
delayqudong(5);
// while(xunji2==0xc0);
P2=0xff;
}
void youzhuanwan2_2()//倒大右转弯
{P2=0xff;
P2=0x50;
delayqudong(5);
//while(xunji2==0x30);
P2=0xff;
}
void zuozhuanwan3_3()//倒最大左转弯
{ P2=0xff;
P2=0xa5;
delayqudong(5); // delay(3);
//while(xunji2==0xe0);
P2=0xff;
}
void youzhuanwan3_3()//倒最大右转弯
{ P2=0xff;
P2=0x5a;
delayqudong(5); // delay(3);
// while(xunji2==0x70);
P2=0xff;
}
//==========================
void chilushibie()
{//delay310us();
//delay310us();
xunji=0x0f&P1;
}
void chilushibie2()
{//delay310us();
//delay310us();
xunji2=0xf0&P1;
}
void xunjichazao()
{
switch(xunji)
{
case 0x0f: P2=0xff;break;//停车
case 0x00: zhixing();break;//直行
case 0x04: zhixing();break;//0100直行
case 0x02: zhixing();break;//0010直行
case 0x09: zhixing();break;//1001直行
// 8421
case 0x07: youzhuanwan3();break;//0111右转最大弯
case 0x03: youzhuanwan2();break;//0011右转大弯
case 0x01: youzhuanwan1();break;//0001右转小弯
case 0x0d: youzhuanwan1();break;//1101右转小弯
case 0x05: youzhuanwan1();break;//0101右转小弯
case 0x0e: zuozhuanwan3();break;//1110左转最大弯
case 0x0c: zuozhuanwan2();break;//1100左转大弯
case 0x08: zuozhuanwan1();break;//1000左转小弯
case 0x0b: zuozhuanwan2();break;//1011左转大弯
case 0x0a: zuozhuanwan1();break;//1010左转小弯
}
}
void timer0 () interrupt 1
{unsigned char kk;
TH0=(65536-50000)/256; //设置初值
TL0=(65536-50000)%256;
kk++;
if(kk==20)//1秒
{kk=0;
dinshi++;
}
}
void xunjichazao2()
{
switch(xunji2)
{
case 0xff: P2=0xff;break;//停车
case 0x00: zhixing2();break;//直行 1111
case 0x40: zhixing2();break;//0100直行
case 0x20: zhixing2();break;//0010直行
case 0x90: zhixing2();break;//1001直行
// 8421
case 0x70: youzhuanwan3_3();break;//0111右转最大弯
case 0x30: youzhuanwan2_2();break;//0011右转大弯
case 0x10: youzhuanwan1_1();break;//0001右转小弯
case 0xd0: youzhuanwan1_1();break;//1101右转小弯
case 0x50: youzhuanwan1_1();break;//0101右转小弯
case 0xe0: zuozhuanwan3_3();break;//1110左转最大弯
case 0xc0: zuozhuanwan2_2();break;//1100左转大弯
case 0xb0: zuozhuanwan2_2();break;//1011左转大弯
case 0x80: zuozhuanwan1_1();break;//1000左转小弯
case 0xa0: zuozhuanwan1_1();break;//1010左转小弯 // 8421
}
}
void beep()
{unsigned int j;
for (j = 490; j > 0; j--)//490
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delay310us(); //延时310us
delay310us(); //延时310us
}
for (j = 490; j > 0; j--)//490
//关300ms
{
BEEP = 1; //关闭蜂鸣器
delay310us(); //延时310us
delay310us(); //延时310us
}
}
void kaijibeep(void)
{ unsigned int y;
for (y = 500; y > 0; y--)//490
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delay310us(); //延时310us
}
for (y = 500; y > 0; y--)//490
//关300ms
{
BEEP = 1; //关闭蜂鸣器
delay310us(); //延时310us
}
}
void zhangdianbeep(void)
{ unsigned int y;
for (y = 200; y > 0; y--)//490
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delay310us(); //延时310us
}
for (y = 600; y > 0; y--)//490
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delay310us(); //延时310us
}
for (y = 600; y > 0; y--)//490
//关300ms
{
BEEP = 1; //关闭蜂鸣器
delay310us(); //延时310us
}
}
void yunxingbeep(void)
{
unsigned int y;
for (y = 200; y > 0; y--)//490
//响300ms
{
BEEP = ~BEEP; //输出频率800Hz
delay310us(); //延时310us
}
for (y = 600; y > 0; y--)//490
//关300ms
{
BEEP = 1; //关闭蜂鸣器
delay310us(); //延时310us
}
}