找回密码
 立即注册

QQ登录

只需一步,快速开始

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

循迹小车源程序

[复制链接]
跳转到指定楼层
楼主
ID:202296 发表于 2017-6-4 18:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit ENA=P0^5;   //右侧电机使能端
sbit ENB=P0^0;   //左侧电机使能端

sbit IN2=P0^4;        //右侧电机正端
sbit IN1=P0^3;        //右侧电机负端
sbit IN4=P0^2;        //左侧电机正端
sbit IN3=P0^1;        //左侧电机负端

sbit you1=P1^3;         //循迹模块定义
sbit you2=P1^2;         
sbit zuo2=P1^1;         
sbit zuo1=P1^0;

uchar speed;
uchar t;         
unsigned int k=50;
unsigned int i;                                   
void T0_init()
   {
           TMOD|=0x01;          //设置16位定时器方式
           TH0=0xD8;                 // 65535-55535=10000                0XD8EF=55535       
           TL0=0xEF;
           ET0=1;
           EA=1;
           TR0=1;
   }

void qianjin()  //前进程序
   {
      IN1=1;
          IN2=0;
          IN3=1;
          IN4=0;
           {
           t++;
           if(t>=10)
              {
                      t=0;
              }
           if(t<k)
              {
                      ENA=ENB=1;
              }
           else if(t>=k)
              {
                      ENA=ENB=0;
              }       
   }
   }
void houtui()  //后退程序
   {
      IN1=0;
          IN2=1;
          IN3=0;
          IN4=1;
   }
void tingzhi() //停止程序
   {
      IN1=0;
          IN2=0;
          IN3=0;
          IN4=0;
   }
void zuozhuan()        //da左转程序
   {
      IN1=0;
          IN2=1;
          IN3=1;
          IN4=0;
           {
           t++;
           if(t>=10)
              {
                      t=0;
              }
           if(t<k)
              {
                      ENA=ENB=1;
              }
           else if(t>=k)
              {
                      ENA=ENB=0;
              }       
   }
   }
  void xiaozuozhuan()        //xiao左转程序
   {
      IN1=0;
          IN2=0;
          IN3=1;
          IN4=0;
   }
void youzhuan()        //da右转程序
   {
      IN1=1;
          IN2=0;
          IN3=0;
          IN4=1;
           {
           t++;
           if(t>=10)
              {
                      t=0;
              }
           if(t<k)
              {
                      ENA=ENB=1;
              }
           else if(t>=k)
              {
                      ENA=ENB=0;
              }       
   }
   }

   void xiaoyouzhuan()        //xiao右转程序
   {
      IN1=1;
          IN2=0;
          IN3=0;
          IN4=0;         

   }

void delay_nus(unsigned int i)  //延时:i>=12 ,i的最小延时单12 us
   {
       i=i/14;
       while(--i);
   }
void delay_nms(unsigned int n)  //延时n ms
   {
       n=n+1;
       while(--n)  
       delay_nus(10);         //延时 1ms,同时进行补偿
   }

void ControlCar(unsigned char ConType)    //定义电机控制子程序
   {
       tingzhi();
       switch(ConType)       //判断用户设定电机形式
          {
              case 1:  //判断用户是否选择形式1
                 {
                     qianjin();         //前进
                     break;
                 }
              case 2: //判断用户是否选择形式2
                 {
                     houtui();  //后退
                     break;
                 }
              case 3:    //判断用户是否选择形式3
                 {
                                     zuozhuan(); //da左转
                         break;
                 }
                                 case 4:
                                 {
                                     xiaozuozhuan(); //xiao左转
                         break;
                 }

              case 5:   //判断用户是否选择形式4
                 {
                     youzhuan();   //da右转  
                     break;
                 }
                                 case 6:   //判断用户是否选择形式4
                 {
                     xiaoyouzhuan();   //xiao右转  
                     break;
                 }
                               
              case 8:    //判断用户是否选择形式8
                 {
                     tingzhi();        //停止
                         break;   //退出当前选择
                 }
          }
   }

void main()       //主程序入口
   {
       bit RunFlag=1;   //定义小车运行标志位
          //Ru nShow=0;  //初始化显示状态

       ControlCar(8);   //初始化小车运行状态
       T0_init();
          // speed=8;
           while(1)                                //程序主循环
          {
             Start:
             if(zuo1==0&&zuo2==0&&you1==0&&you2==0) //四个循迹都没有检测到     
                {
                    ControlCar(1);   
                    delay_nms (5);
                        goto NextRun;
                }

                         if(zuo1==1&&zuo2==1&&you1==1&&you2==1) //四个循迹都检测到     
                {
                    ControlCar(1);   
                    delay_nms (5);
                        goto NextRun;
                }
                          if(zuo1==1&&zuo2==1&&you2==1&&you1==0) //da zuo
                           {
                           ControlCar(3);                     
                           delay_nms (5);
                   goto NextRun;
                           }
                          if(you1==1&&you2==1&&zuo2==1&&zuo1==0) //da you
                          {
                          ControlCar(5);                     
                          delay_nms (5);
                  goto NextRun;
                          }
                          if(you1==1&&you2==1&&zuo2==0&&zuo1==1)
                           {
                          ControlCar(8);                     
                          delay_nms (5);
                  goto NextRun;
                          }
                         if(you1==1&&you2==0&&zuo2==1&&zuo1==1)
                           {
                          ControlCar(8);                     
                          delay_nms (5);
                  goto NextRun;
                          }
                          if(you1==1&&zuo1==1&&you2==0&&zuo2==0)//liang bian jian ce
                           {
                          ControlCar(8);                     
                          delay_nms (5);
                  goto NextRun;
                          }

                            if(zuo2==1&&you2==1&&you1==0&&zuo1==0) //中间两个循迹都检测到     
                {
                    ControlCar(4);            //xiao zuo
                    delay_nms (5);
                        goto NextRun;
                }

                                if(you1==1&&you2==1&&zuo2==0&&zuo1==1)        //you bian liang ge jian ce
                                {
                                ControlCar(5);
                                delay_nms (5);
                                goto NextRun;
                                }
                                if(zuo1==1&&zuo2==1&&you1==0&&you2==0) //zuo bian liang ge jian ce
                                {
                                ControlCar(3);                     
                                delay_nms (5);
                    goto NextRun;
                                }
                                if(zuo1==1&&zuo2==0&&you1==0&&you2==0) //zuo 1  jian ce
                                {
                                ControlCar(4);                     
                                delay_nms (5);
                    goto NextRun;
                                }
                                 if(zuo1==0&&zuo2==0&&you1==1&&you2==0) //you1 jian ce
                                {
                                ControlCar(6);                     
                                delay_nms (5);
                    goto NextRun;
                                }


             goto Start;
             NextRun:

             ControlCar(1);
         }
   }

void Timer0() interrupt 1
   {
           t++;
           if(t>=10)
              {
                      t=0;
              }
           if(t<speed)
              {
                      ENA=ENB=1;
              }
           else if(t>=speed)
              {
                      ENA=ENB=0;
              }       
   }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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