智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1368|回复: 3
打印 上一主题 下一主题

请大神帮我看下这个代码

[复制链接]

1

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
32
威望
30
贡献
2
兑换币
5
注册时间
2014-4-10
在线时间
1 小时
毕业学校
华南农业大学
跳转到指定楼层
1#
发表于 2014-4-10 15:00:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2贡献
本人新手,接触C语言一星期左右,弄了个小车代码但是发现好多问题。看来看去还是发现不了问题所在心累了。。请大神来看下代码然后告诉我哪里错了,还有就是要是可以的话告诉下怎么改。  小车流程是这样:先探测前方小车是否动,动了就跟着前方小车一起动(速度已知,而且同时要红外探黑线)。随后前方小车停止,我方小车也要停止。当前方小车再动时,我方小车要超车,然后回到原本轨道,跟着黑线走到终点。
我写的代码是这样的:

回复

使用道具 举报

1

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
32
威望
30
贡献
2
兑换币
5
注册时间
2014-4-10
在线时间
1 小时
毕业学校
华南农业大学
2#
 楼主| 发表于 2014-4-10 15:00:56 | 只看该作者
本帖最后由 Azkban 于 2014-4-10 15:09 编辑

#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;
}            
回复

使用道具 举报

4

主题

142

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1667
威望
890
贡献
491
兑换币
609
注册时间
2014-1-10
在线时间
143 小时
毕业学校
四川某大学
3#
发表于 2014-4-14 23:17:42 | 只看该作者
#include <reg52.H>                //器件配置文件
#include <intrins.h>
sbit RX=P1^5  ;   //#define  RX  P1_5
sbit TX=P1^4  ;//#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;
}   

//主要是前面几行不对,位定义应该用sbit.另外定义段码那里少了东西*
回复

使用道具 举报

1

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
506
威望
278
贡献
136
兑换币
130
注册时间
2013-12-30
在线时间
46 小时
毕业学校
安徽大学
4#
发表于 2014-5-4 19:00:18 | 只看该作者
整个文档啊,这样看多别扭啊
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-17 17:11 , Processed in 0.063086 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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