微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大神指点(?????)っ

大神指点(?????)っ

时间:10-02 整理:3721RD 点击:
需要做一个小车控制系统~  要求是规划一条螺旋路径与S路径,控制4轮小车沿路径运行,中途随意暂停,启动后沿该线路运行。  应该从何下手? 新手不懂。

感觉应该是循迹小车吧,论坛里应该有,可以找找

对,就 是循记

//我之前模仿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
    }

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top