找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2638|回复: 1
打印 上一主题 下一主题
收起左侧

51循迹小车程序

[复制链接]
跳转到指定楼层
楼主
ID:378302 发表于 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();

        }
          
          //等待中断发生       
         
}         

         
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 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:669415 发表于 2019-12-20 20:45 | 只看该作者
这是几路循迹呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表