求大神帮看智能车代码

2019-03-24 18:14发布

本人新手,接触C语言一星期左右,弄了个小车代码但是发现好多问题。看来看去还是发现不了问题所在心累了。。请大神来看下代码然后告诉我哪里错了,还有就是要是可以的话告诉下怎么改。  小车流程是这样:先探测前方小车是否动,动了就跟着前方小车一起动(速度已知,而且同时要红外探黑线)。随后前方小车停止,我方小车也要停止。当前方小车再动时,我方小车要超车,然后回到原本轨道,跟着黑线走到终点。
我写的代码是这样的:

#include <AT89x51.H>                //器件配置文件
#include <intrins.h>
#define  RX  P1_5
#define  TX  P1_4
unsigned int  time=0;
unsigned int  timer=0;
unsigned char posit=0;
unsigned long S=0;
unsigned char k=0;
unsigned char mode;
unsigned char i;

sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;

//bit      flag =0;
//unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[3]={ 0xdf,0xef,0xf7};
unsigned char disbuff[4]           ={ 0,0,0,0,};

#define shuma P0                                                        //定义P0口为数据口
sbit R1=P0^0;
sbit R2=P0^1;
sbit L1=P0^3;
sbit L2=P0^2;
sbit LED_4=P1^0;
sbit LED_5=P1^1;
sbit LED_6=P1^2;
sbit LED_7=P1^3;
void delay(unsigned int x);                                        //声明延时函数
void display2();//unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);
                                                                                        //声明数码管显示函数
/定义段码=====0-9=====A-G=====*/
unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
             0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/********************************************************/

/********************************************************/
    void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
        
         S=(time*1.7)/100;     //算出来是CM
         if(S>=700) //超出范围显示“-”
         {         
          disbuff[0]=10;           //“-”
          disbuff[1]=10;           //“-”
          disbuff[2]=10;           //“-”
         }
         else
         {
          disbuff[0]=S%1000/100;
          disbuff[1]=S%1000%100/10;
          disbuff[2]=S%1000%10 %10;
         }
        }
/*******************o函数功能:定时器初始化和变量初始化************************/  
void init_sys(void)                   //定时器初始化函数
{   
          TMOD=0X01;
        TH0=0;                 
        TL0=0;
        EA=1;                                            //开启中断
        ET0=1;                           //允许T0中断
    EX0=1;
          IT0=1;
}
/******************************3超声波工作时序********************************/
void  StartModule()                     //启动模块
  {
          TX=1;                                    //启动一次模块
          _nop_();                                         //延时1个(机器)指令周期
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();

          TX=0;
  }
        
        void delayx(unsigned long o)

{

while(o--);;;

}

void cejuxianshi()
{
            StartModule();                //启动超声波模块
            while(!RX);                        //当RX为0时等待
            TR0=1;                            //开始计数
            while(RX);                        //当RX为1时计数等待
            TR0=0;                                //关闭计数
        Conut();                        //计算
        display2();
        }
        
void main()
        {
        init_sys();
        while(1)
        {
cejuxianshi();
        

        while(S<20&&k==0)
        {
cejuxianshi();
          IN1=IN2=IN3=IN4=0;
         
                }
        
        while(S>=20&&k==0)
        {
cejuxianshi();
        mode=1;
         
         if(L2)
                        mode=2;
                if(R2)
                        mode=3;

                if(mode==2 && L2==0)
                        mode=1;
                if(mode==3 && R2==0)
                        mode=1;

         delayx(800);
         if(S==20)
         k=1;
                }
                        
        while(S<=20&&k==1)
{
cejuxianshi();
                IN1=IN2=IN3=IN4=0;
                delayx(800);
                if(S>20)
                k=2;
}               
  while(k==2)
        { cejuxianshi();
        mode=4;
           }

while(k==3)        
{  
cejuxianshi();
                IN1=IN3=1;
                IN2=IN4=0;
    if(L1==1||L2==1)
    mode=2;
                if(R1==1||R2==1)
                mode=3;
                }
                        

               
               
                switch(mode)
                {
                        case 1:
                        for(i=0;i<255;i++)
                  {
                           if(i<=65)
                           {
                                    IN1=1;IN2=0;IN3=1;IN4=0;
                           }
                        else
                  {
                                  IN1=IN2=IN3=IN4=0;
                        }
break;
                }
                        
                        case 3:
                        for(i=0;i<255;i++)
                {
                        if(i<=55)
                        {
                                IN1=1;IN2=0;IN3=1;IN4=0;
                        }
                        if(i>55&&i<=75)
                        {
                          IN3=1;IN1=IN2=IN4=0;
                        }
                        else
                        {
                                IN1=IN2=IN3=IN4=0;
                        }
break;
                }
                        
                        case 2:
                        for(i=0;i<255;i++)
                {
                        if(i<=55)
                        {
                                IN1=1;IN2=0;IN3=1;IN4=0;
                        }
                        if(i>55&&i<=75)
                        {
                          IN1=1;IN3=IN2=IN4=0;
                        }
                        }
break;

                        
                        case 4:
                        {
                          IN1=IN2=IN4=0;IN3=1;//原地左转

        delayx(11000);

   IN3=1;

   IN4=0;

   IN1=1;

   IN2=0;  //直走
   delayx(8000);

   IN1=1;

   IN4=0;

   IN2=0;

   IN3=0;  //原地右转

   delayx(15000);

   IN3=1;

   IN2=0;

   IN3=1;

   IN4=0;  //直走(超车)

   delayx(20000);

         IN1=1;

   IN4=0;

   IN3=0;

   IN2=0;  //原地右转
         delayx(10000);
         k=3;
         
}
break;
}
}
}

        

void delay(unsigned int x)
{
          unsigned int i;
        //x?a?óê±3¤?è,?éò?éè??
          for(i=0;i<x;i++);
}
   void display2()//unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)
{
          shuma=a[disbuff[0]];                                                //选中第五位,发送第一位段码
          LED_4=0;
          delay(100);
          LED_4=1;

          shuma=a[disbuff[1]];                                                //选中第六位,发送第二位段码
          LED_5=0;
          delay(100);
          LED_5=1;

          shuma=a[disbuff[2]];                                                //选中第七位,发送第三位段码
          LED_6=0;
          delay(100);
          LED_6=1;

          //shuma=a[d4];                                                //选中第八位,发送第四位段码
          //LED_7=0;
          //delay(100);
          //LED_7=1;
}          此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。