標(biāo)題: 51循跡小車(chē)程序 [打印本頁(yè)]

作者: baozhouyang    時(shí)間: 2018-7-24 09:24
標(biāo)題: 51循跡小車(chē)程序
#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()//大左轉(zhuǎn)
{
        zkb1 =22;
        zkb2= 13;
        IN1 = 0;
        IN2 = 1;
    IN3 = 0;
    IN4 = 1;

}

void turn_left1() //小左轉(zhuǎn)
{

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

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

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

void turn_right3()//中右轉(zhuǎn)
{
        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;//沒(méi)有加這個(gè)導(dǎo)致的判斷程序錯(cuò)亂
                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()//左電機(jī)反轉(zhuǎn) //pwm2
{
        IN1=1;
        IN2=0;
}

void forward_turn2()//右電機(jī)正轉(zhuǎn)  //pwm1
{
        IN3=0;
        IN4=1;
}

void reverse_turn2()//右電機(jī)反轉(zhuǎn)
{
        IN3=1;
        IN4=0;
}

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

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


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

  a=10;
  b=30;
}
}

}         




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

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

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

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

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











                /*if((ZN==1)&&(YN==1)&&(ZW==0)&&(YW==0))//小車(chē)直行
                {
                        advance();
                        delayms(100);
                        PWM1=1,PWM2=1;
                        delayms(40);
                        PWM1=0,PWM2=0;
                }
                if((ZW==0)&&(ZN==0)&&(YN==1)&&(YW==0))//小右轉(zhuǎn)
                {
                        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))//中右轉(zhuǎn)
                {
                        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))//大右轉(zhuǎn)
                {
                        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))//小左轉(zhuǎn)
                {
                        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))//中左轉(zhuǎn)
                {
                        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))//大左轉(zhuǎn)
                {
                        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))//小車(chē)后退
                {
                        houtui();
                        delayms(100);
                        PWM1=1,PWM2=1;
                        delayms(40);
                        PWM1=0,PWM2=0;
                }
        }
}*/










作者: 怦然心動(dòng)$$    時(shí)間: 2019-12-20 20:45
這是幾路循跡呀




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1