打印
[PIC®/AVR®/dsPIC®产品]

请大神帮忙看下这个程序

[复制链接]
1110|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Azkban|  楼主 | 2014-4-10 14:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人单片机新手,现要写个智能小车的程序,但是现在程序烧到小车上是直接执行mode4 ,前面的程序都无视了。找了好久都没发现问题心累了。。。请问有大神能帮忙看下程序吗?或者说教下怎么改。

/***********************************************************************************************************/

/***********************************************************************************************************/            
#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;
unsigned char gate1=55;
unsigned char gate2=65;
unsigned char gate3=75;

sbit IN3=P2^0;
sbit IN4=P2^1;
sbit IN1=P2^2;
sbit IN2=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);
                                                                                        //声明数码管显示函数2
/*定义段码=====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;
         }
        }
/*******************函数功能:定时器初始化和变量初始化************************/  
void init_sys(void)                   //定时器初始化函数  
{   
          TMOD=0X01;
        TH0=0;                 
        TL0=0;
        EA=1;                                            //开启中断
        ET0=1;                           //允许T0中断
  //        EX0=1;
          IT0=1;
}
/******************************超声波工作时序********************************/
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为零时等待
            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<=gate2)
                           {
                                    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<=gate1)
                        {
                                IN1=1;IN2=0;IN3=1;IN4=0;
                        }
                        if(i>gate1&&i<=gate3)
                        {
                          IN3=1;IN1=IN2=IN4=0;
                        }
                        else
                        {
                                IN1=IN2=IN3=IN4=0;
                        }
                        break;
                }
                       
                        case 2:
                        for(i=0;i<255;i++)
                {
                        if(i<=gate1)
                        {
                                IN1=1;IN2=0;IN3=1;IN4=0;
                        }
                        if(i>gate1&&i<=gate3)
                        {
                          IN1=1;IN3=IN2=IN4=0;
                        }
                        break;
                        }
                       
                        case 4:
                        {
                          IN1=IN2=IN4=0;IN3=1;//Ô原地左转

        delayx(10000);

   IN3=1;

   IN4=0;

   IN1=1;

   IN2=0;  //直走

   delayx(10000);

   IN1=1;

   IN4=0;

   IN2=0;

   IN3=0;  //原地右转

   delayx(9000);

   IN3=1;

   IN2=0;

   IN3=1;

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

   delayx(30000);

         IN1=1;

   IN4=0;

   IN3=0;

   IN2=0;  //Ô原地右转
         delayx(5000);
         k=k+1;
         
}
break;
}
}
}

       

void delay(unsigned int x)
{
          unsigned int i;
        //x为延时长度
          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;
}            
沙发
yyq12311| | 2014-4-24 15:57 | 只看该作者
这个貌似是51的吧?怎么发到PIC这里来了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝