找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助,新手搞了一个小车程序基本能实现功能,但有点错误,希望大神们能帮忙指出来

[复制链接]
跳转到指定楼层
楼主
ID:183982 发表于 2017-4-3 21:05 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
从网上买了一个能够循迹,避障,红外的小车,自己加入了能够调速的程序,本来能按下按键功能能循环的,加入调速的程序后就不循环了。(新人第一次做小车,程序是拿别人的拼出来的,但感觉逻辑上没什么大问题),程序如下,希望大神们能帮忙指出问题(第三个红外的相关程序因不需要已经删除)#include <REGX52.H> //包含51单片机相关的头文件
#include <intrins.h>
sbit LeftLed=P2^0;                        //定义前方左侧指示灯端口
sbit RightLed=P0^7;                       //定义前方右侧指示灯端口
sbit FontLled=P1^7;

sbit LeftIR=P3^5;                         //定义前方左侧红外探头端口
sbit RightIR=P3^6;                        //定义前方右侧红外探头端口
sbit FontIR=P3^7;                         //定义前方正前方红外探头端口

sbit M1A=P0^0;                            //定义左侧电机驱动A端
sbit M1B=P0^1;                            //定义左侧电机驱动B端

sbit M2A=P0^2;                            //定义右侧电机驱动A端
sbit M2B=P0^3;                            //定义右侧电机驱动B端

sbit B1=P0^4;                             //定义语音识识别传感器端口
sbit SB1=P0^6;                            //定义蜂鸣器端口
sbit IRIN=P3^3;                                       //定义红外接收端口

unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定义数码管显示数据
                                   0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
unsigned char code  RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};
unsigned char IRCOM[7];
static unsigned int LedFlash;                         //定义闪动频率计数变量
bit EnableLight=0;                                    //定义指示灯使能位
#define ShowPort P2                                   //定义数码管显示端口
unsigned char temp = 1;
unsigned char timer1;
void tingzhi()
{
   M1A=0;                                   //将M1电机A端初始化为0
   M1B=0;                                   //将M1电机B端初始化为0
   M2A=0;                                   //将M2电机A端初始化为0
   M2B=0;

}

void qianjin()
{
   M1A=1;                                   
   M1B=0;                                   
   M2A=1;                                   
   M2B=0;
}

void houtui()
{
   M1A=0;                                   
   M1B=1;                                   
   M2A=0;                                   
   M2B=1;
}

void zuozhuan()
{
   M1A=0;                                   
   M1B=1;                                   
   M2A=1;                                   
   M2B=0;
}

void youzhuan()
{
   M1A=1;                                   
   M1B=0;                                   
   M2A=0;                                   
   M2B=1;
}

void Delay1ms(unsigned int i)
{
unsigned char j,k;
do{
  j = 10;
  do{
   k = 50;
   do{
    _nop_();
   }while(--k);     
  }while(--j);
}while(--i);

}

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

}  

void delayms(unsigned char x)                         //0.14mS延时程序
{
  unsigned char i;                                    //定义临时变量
  while(x--)                                          //延时时间循环
  {
    for (i = 0; i<13; i++) {}                         //14mS延时
  }
}

void Delay()                                          //定义延时子程序
{
  unsigned int DelayTime=30000;                       //定义延时时间变量
  while(DelayTime--);                                 //开始进行延时循环
  return;                                             //子程序返回
}
void ControlCar(unsigned char ConType)    //定义电机控制子程序
{

  tingzhi();
switch(ConType)                          //判断用户设定电机形式
{
  case 1:  //前进                         //判断用户是否选择形式1
  {
    //tingzhi();                                                      //进入前进之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
        //Delay1ms(50);
        LeftLed = 0 ;
        qianjin();
    break;
  }
  case 2: //后退                          //判断用户是否选择形式2
  {
   // tingzhi();                                                              //进入后退之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
   // Delay1ms(50);
    LeftLed = 1 ;          
        houtui();                                //M2电机反转
    break;
  }
  case 3: //左转                          //判断用户是否选择形式3
  {
     //tingzhi();                                                                  //进入左转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
        // Delay1ms(50);
         zuozhuan();                               //M2电机正转
         break;
  }
  case 4: //右转                          //判断用户是否选择形式4
  {
   // tingzhi();                                                                  //进入右转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
//        Delay1ms(50);
        youzhuan();                                //M1电机正转
                                          //M2电机反转
        break;
  }
  case 8: //停止                          //判断用户是否选择形式8
  {
    tingzhi();
        break;                                //退出当前选择
  }
}
}

void ControlCar_yaokong(unsigned char ConType)    //定义电机控制子程序        (红外遥控单独设置一个 switch  case  语句  )
{

  tingzhi();
switch(ConType)                          //判断用户设定电机形式
{
  case 1:  //前进                         //判断用户是否选择形式1
  {
    tingzhi();                                                      //进入前进之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
        Delay1ms(150);
        LeftLed = 0 ;
        qianjin();
    break;
  }
  case 2: //后退                          //判断用户是否选择形式2
  {
    tingzhi();                                                              //进入后退之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
    Delay1ms(150);
    LeftLed = 1 ;          
        houtui();                                //M2电机反转
    break;
  }
  case 3: //左转                          //判断用户是否选择形式3
  {
     tingzhi();                                                                  //进入左转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
         Delay1ms(150);
         zuozhuan();                               //M2电机正转
         break;
  }
  case 4: //右转                          //判断用户是否选择形式4
  {
     tingzhi();                                                                  //进入右转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
         Delay1ms(150);
     youzhuan();                                //M1电机正转  //M2电机反转
         break;
  }
  case 8: //停止                          //判断用户是否选择形式8
  {
    tingzhi();
        break;                                //退出当前选择
  }
}
}
void Robot_Avoidance()                   //机器人避障子程序
{

   LeftLed=LeftIR;                        //前方左侧指示灯指示出前方左侧红外探头状态
   RightLed=RightIR;                      //前方右侧指示灯指示出前方右侧红外探头状态
   FontLled= FontIR;
   SB1=FontIR;

    if(FontIR == 0)                          //如果前面避障传感器检测到障碍物
   {
      ControlCar(8);                       //停止
      delay_nms (300);                                           //停止300MS   防止电机反相电压冲击  导致系统复位
          ControlCar(2);                                           //后退  
          delay_nms (1000);                                           //后退1500MS  
          ControlCar(3);                                           //
          delay_nms (1800);       
  }
   else
   {
      ControlCar(1);                      //右侧没有信号时,开始向左转一定的角度
      delay_nms (10);
   }
    ControlCar(1);
}
//机器人循迹子程序
void Robot_Traction()                     //机器人循迹子程序
{
   LeftLed=LeftIR;                        //前方左侧指示灯指示出前方左侧红外探头状态
   RightLed=RightIR;                      //前方右侧指示灯指示出前方右侧红外探头状态
   FontLled= FontIR;
   SB1=LeftIR;
   if(LeftIR == 0 && RightIR == 0)    //三个红外检测到黑线,就前进
   {
      ControlCar(1);                      //左侧没有信号时,开始向右转一定的角度
      delay_nms (10);
   }

   else if(LeftIR == 0 && RightIR == 1)
   {
      ControlCar(3);                      //右侧没有信号时,开始向左转一定的角度
      delay_nms (10);
   }

   else if(LeftIR == 1 && RightIR == 0)
   {
      ControlCar(4);                      //右侧没有信号时,开始向左转一定的角度
      delay_nms (10);
   }
    ControlCar(8);
}
/*******************************************************************************
* 函 数 名       : Time1
* 函数功能                 : 定时器1的中断函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void Time1Config();
void RobotV1()                     //机器人循迹子程序
{
   Time1Config();
   while (temp==4)
        {
                if(timer1>100)  //PWM周期为100*0.5ms
                {
                        timer1=0;
                }
                if(timer1 <50)        //改变30这个值可以改变直流电机的速度
                {
                        M1A=1;
                        M2A=1;
                }
                else
                {
                        M1A=0;
                        M2A=0;
                }
       
        }
}





/*******************************************************************************
* 函 数 名       : Time1Config
* 函数功能                 : 设置定时器
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void Time1Config()
{
        TMOD|= 0x10;   //设置定时计数器工作方式1为定时器

        //--定时器赋初始值,12MHZ下定时0.5ms--//  
        TH1 = 0xFE;
        TL1 = 0x0C;

       
        ET1 = 1;          //开启定时器1中断
        EA = 1;
        TR1 = 1;         //开启定时器       
}

/*******************************************************************************
* 函 数 名       : Time1
* 函数功能                 : 定时器1的中断函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/

void Time1(void) interrupt 3    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
{
        TH1 = 0xFE;  //重新赋初值
        TL1 = 0x0C;
        timer1++;   
}

void main()                               //主程序入口
{

  bit RunFlag=0;                          //定义小车运行标志位
  LedFlash=3000;                                       //对闪灯数据进行初始化
  ControlCar(8);
  while(1)                                //程序主循环
  {
             if(P3_2 == 0)
          {
           delay_nms(10);
           if(P3_2 == 0)
           {
                     temp++;
                  while(!P3_2);
           }
          }
          if(temp > 4)
          {
          temp = 1;
          }
          switch(temp)
          {
                   case 1:        ShowPort = LedShowData[1];Robot_Traction();break;
                case 2: ShowPort = LedShowData[2];Robot_Avoidance();break;
                case 3: ShowPort = LedShowData[3];break;
                case 4: ShowPort = LedShowData[4];RobotV1();break;
          }
  }
  }




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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