找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2712|回復: 1
打印 上一主題 下一主題
收起左側

51循跡小車程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:378302 發(fā)表于 2018-7-24 09:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>

sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit ENA = P1^2;//右輪
sbit IN3 = P1^3;
sbit IN4 = P1^4;
sbit ENB = P1^5;//左輪


//循跡模塊
sbit left1  = P0^0;
sbit left2  = P0^1;
sbit right2 = P0^3;
sbit right1 = P0^2;


unsigned char zkb1 = 0;
unsigned char zkb2 = 0;
unsigned char t = 0;
unsigned char flag;

void init()
{

       
        EA = 1;
        TMOD |= 0x01;
        TH0 =(65536 - 100) / 256;
        TL0 = (65536 - 100)% 256;

        ET0 = 1;
        TR0 = 1;
        ENA = 1;
        ENB = 1;
}



void turn_left2()//大左轉
{
        zkb1 =22;
        zkb2= 13;
        IN1 = 0;
        IN2 = 1;
    IN3 = 0;
    IN4 = 1;

}

void turn_left1() //小左轉
{

        zkb1 = 20;
        zkb2 = 13;
        IN1 = 0;
        IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}
void turn_left3()//中左轉
{

        zkb1 = 22;
        zkb2 = 13;
        IN1 = 0;
        IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}
void turn_right1()//小右轉
{
        zkb1 = 10;
        zkb2 = 22;
        IN1 = 0;
        IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}

void turn_right2() //大右轉
{
        zkb1 = 13;
        zkb2 = 22;
        IN1 = 0;
        IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}

void turn_right3()//中右轉
{
        zkb1 = 10;
        zkb2 = 22;
        IN1 = 0;
        IN2 = 1;
    IN3 = 0;
    IN4 = 1;
}

void qianjin()
{
        zkb1=20;
    zkb2=22;
        IN1 = 0;
        IN2 = 1;
    IN3 = 0;
    IN4 = 1;

}
void houtui()
{
    zkb1=20;
    zkb2=22;
        IN1 = 1;
        IN2 = 0;
    IN3 = 1;
    IN4 = 0;

}


void xunji()
{
       
        if((left1 == 0)&&(left2 == 1)&&(right2 == 1)&&(right1 == 0))
        {
                flag = 0;
        }
        if((left1 == 0)&&(left2 ==0)&&(right2 == 1)&&(right1 == 0))
        {
                flag = 1;          
        }
        if((left1 == 0)&&(left2 == 1)&&(right2 == 0)&&(right1 == 0))
        {
                flag = 2;
        }
        if((left1 == 1)&&(left2 == 0)&&(right2 == 0)&&(right1 == 0))
        {
                flag = 3;
        }
        if((left1 == 0)&&(left2 == 0)&&(right2 == 0)&&(right1 == 1))
        {
                flag = 4;
        }
    if((left1 == 0)&&(left2 == 0)&&(right2 == 0)&&(right1 == 0))
        {
                flag = 5;
        }
        if((left1 == 1)&&(left2 == 0)&&(right2 == 1)&&(right1 == 0))
        {
                flag = 6;
        }
        if((left1 == 0)&&(left2 == 1)&&(right2 == 0)&&(right1 == 1))
        {
                flag = 7;
        }
        switch(flag)
        {
                case 0:qianjin();break;
               
                case 1:turn_right1();break;
               
                case 2:turn_left1();break;
               
                case 3:turn_left2();break;
               
                case 4:turn_right2();break;
               
                case 5:houtui();break;
               
                case 6:turn_left3();break;
               
                case 7:turn_right3();break;
            
                default:qianjin();break;       
               
               
        }
}
void timer0() interrupt 1
{

        TH0 = (65536 - 100) / 256;
        TL0 = (65536 - 100) % 256;

        if(t < zkb1 )
        {
                ENA = 1;
            
        }
        else
        {
                ENA = 0;
               
        }
        if(t < zkb2 )
        {
               
            ENB = 1;
        }
        else
        {
               
                ENB = 0;
        }

        ++t;
        if(t== 50)
        {
                ENA=~ENA;//沒有加這個導致的判斷程序錯亂
                ENB=~ENB;
                t = 0;
        }
       
       

}
void main()
{
        init();
        //zkb1 = 8;
        //zkb2 = 8;
        qianjin();
        while(1)
        {
                       
                        xunji();
                       
        }
}


































/*
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num1,num2,a,b,c,d;
uchar count1=0;
uchar count2=0;
sbit PWM1=P1^0;
sbit IN1=P1^1;
sbit IN2=P1^2;

sbit PWM2=P1^3;
sbit IN3=P1^4;
sbit IN4=P1^5;

sbit ZW=P0^0;
sbit ZN=P0^1;
sbit YN=P0^2;
sbit YW=P0^3;
void delayms (uint z)
{
        uchar y,x;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

void forward_turn1()
{
        IN1=0;
        IN2=1;
}

void reverse_turn1()//左電機反轉 //pwm2
{
        IN1=1;
        IN2=0;
}

void forward_turn2()//右電機正轉  //pwm1
{
        IN3=0;
        IN4=1;
}

void reverse_turn2()//右電機反轉
{
        IN3=1;
        IN4=0;
}

void advance()//前進
{
   forward_turn1();
        forward_turn2();
}
                          
void houtui()        //后退
{
        reverse_turn1();
        reverse_turn2();
}

void init()//初始化子函數
{
          TMOD=0x11;
          TH0=(65536-1000)/256;//中斷周期1ms
          TL0=(65536-1000)%256;
          TH1=(65536-1000)/256;//中斷周期1ms
          TL1=(65536-1000)%256;
          EA=1;//開總中斷
          ET0=1;//開定時器0中斷
          ET1=1;//開定時器1中斷
          TR0=1; //啟動定時器0
          TR1=1; //啟動定時器1


}
void depand()  //紅外對管賦值給pwm
{
while(1)
{
if((ZN==1)&&(YN==1)&&(ZW==0)&&(YW==0))
{

  a=10;
  b=30;
}
}

}         




//pwm1右電機,pwm2左電機
void main ()
{       
            advance();
         init();//初始化子函數
          while(1)
          {
          depand();

        }
          
          //等待中斷發(fā)生       
         
}         

         
void T0_time()interrupt 1//重裝初值,服務左電機
  {

   TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        num1++;
                if(num1=1)//一個定時器周期到了,即將進入中斷
          {
          count1++;
          num1=0;
          if(count1>a&&count1<=b)//左電機前進pwm
          {
          PWM2=0;
          }
          if(count1<=a)
          {
          PWM2=1;
          }
          if(count1==b)
          {
          count1=0;//等于7的時候清零
          }
          }            
}
void T1_time()interrupt 3//重裝初值,服務右電機
  {

   TH1=(65536-1000)/256;
        TL1=(65536-1000)%256;
        num2++;
                if(num2=1)//一個定時器周期到了,即將進入中斷
          {
          count2++;
          num2=0;
          if(count2>10||count2<=30)//左電機前進pwm
          {
          PWM1=0;
          }
          if(count2<=10)
          {
          PWM1=1;
          }
          if(count2==30)
          {
          count2=0;//等于7的時候清零
          }
          }            
}
   */
       
       











                /*if((ZN==1)&&(YN==1)&&(ZW==0)&&(YW==0))//小車直行
                {
                        advance();
                        delayms(100);
                        PWM1=1,PWM2=1;
                        delayms(40);
                        PWM1=0,PWM2=0;
                }
                if((ZW==0)&&(ZN==0)&&(YN==1)&&(YW==0))//小右轉
                {
                        advance();
                        delayms(110);
                        PWM1=1;
                        delayms(30);
                        PWM1=0;

                        delayms(30);
                        PWM2=1;
                        delayms(110);
                        PWM2=0;
                }
                if((ZW==0)&&(ZN==0)&&(YN==1)&&(YW==1))//中右轉
                {
                        advance();
                        delayms(100);
                        PWM1=1;
                        delayms(40);
                        PWM1=0;

                        delayms(60);
                        PWM2=1;
                        delayms(80);
                        PWM2=0;
                }
                if((ZW==0)&&(ZN==0)&&(YN==0)&&(YW==1))//大右轉
                {
                        advance();
                        delayms(110);
                        PWM1=1;
                        delayms(30);
                        PWM1=0;

                        delayms(50);
                        PWM2=1;
                        delayms(90);
                        PWM2=0;
                }
                if((ZW==0)&&(ZN==1)&&(YN==0)&&(YW==0))//小左轉
                {
                        advance();
                        delayms(30);
                        PWM1=1;
                        delayms(110);
                        PWM1=0;
                        delayms(110);
                        PWM2=1;
                        delayms(30);
                        PWM2=0;
                }
                if((ZW==1)&&(ZN==1)&&(YN==0)&&(YW==0))//中左轉
                {
                        advance();
                        delayms(60);
                        PWM1=1;
                        delayms(80);
                        PWM1=0;

                        delayms(100);
                        PWM2=1;
                        delayms(40);
                        PWM2=0;
                }
                if((ZW==1)&&(ZN==0)&&(YN==0)&&(YW==0))//大左轉
                {
                        advance();
                        delayms(50);
                        PWM1=1;
                        delayms(90);
                        PWM1=0;

                        delayms(110);
                        PWM2=1;
                        delayms(30);
                        PWM2=0;
                }
                if((ZN==1)&&(YN==1)&&(ZW==1)&&(YW==1))//停止
                {
                        IN1=0;
                        IN2=0;
                        IN3=0;
                        IN4=0;
                }
                if((ZW==0)&&(ZN==0)&&(YN==0)&&(YW==0))//小車后退
                {
                        houtui();
                        delayms(100);
                        PWM1=1,PWM2=1;
                        delayms(40);
                        PWM1=0,PWM2=0;
                }
        }
}*/









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:669415 發(fā)表于 2019-12-20 20:45 | 只看該作者
這是幾路循跡呀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表