墨逸、 发表于 2014-5-10 16:07:21

为什么我的子程序不执行呢

这是一个小车的
做的是小车循线超声避障循光入库

这是主程序


#include <AT89x51.H>                //Æ÷¼þÅäÖÃÎļþ
#include <intrins.h>
#include "dianji.h"
#include "xunxian.h"
#include "ceju.h"
#define ste P2_7      //¶æ»ú¿ØÖƽÅ
#define RIGHT_led P0_5    //ÓÒ²àÑ­¹âled
#define Before_led_one P0_6//Ç°·½Ñ­¹âled1
#define Before_led_two P0_7//Ç°·½Ñ­¹âled2
unsigned char Statusflag=1;//×Ü״̬±ê־λ
void delayhaomiao(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}

void main()
{
                while(Statusflag==1)
                {
               xunxian();
               ceju();
               if(S<=100)
               Statusflag=2;
                }
                while(Statusflag==2)
                {
               zuotui();
               youqian();
               delayhaomiao(500);         //´ËʱÊý¾Ý¹©±àÒ룬ʵ¼ÊÐèÒªÐë¸ù¾ÝС³µÇé¿ö¸ü¸Ä
               qianjin();
               delayhaomiao(30000);         //´ËʱÊý¾Ý¹©±àÒ룬ʵ¼ÊÐèÒªÐë¸ù¾ÝС³µÇé¿ö¸ü¸Ä
               youzhuan();
               delayhaomiao(500);         
               qianjin();
               Statusflag=3;
                }
        /*        while(Statusflag==3)
                {
                                if(RIGHT_led==0)
                                {
                                zuoqian();
                                youtui();
                                delayhaomiao(500);         
                                if((Before_led_one==0)&&(Before_led_two==0))
                                        {
                                        zuoqian();
                                  youtui();
                                        delayhaomiao(500);            
                                        qianjin();
                                        if(S==150)
                                        while(1);
                                        }
                                }
                }        */
}




/*这个是测距用1602显示的子程序*/

#include <AT89x51.H>                //Æ÷¼þÅäÖÃÎļþ
#include <intrins.h>
#include "ceju.h"
unsigned char code ASCII =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
unsigned char disbuff={0,0,0,0,};
unsigned char code mcustudio[] ={"==Range Finder=="};
unsigned char code email[] =    {" Hello Teachers "};
unsigned char code Cls[] =      {"                "};
static unsigned char DisNum = 0; //ÏÔʾÓÃÖ¸Õë                                  
unsigned inttime=0;
unsigned long S=0;
bit      flag =0;
       

/****************дÊý¾Ý****************/
void WriteDataLCM(unsigned char WDLCM)
{
        ReadStatusLCM(); //¼ì²âæ
        LCM_Data = WDLCM;
        LCM_RS = 1;
        LCM_RW = 0;
        LCM_E = 0; //Èô¾§ÕñËÙ¶ÈÌ«¸ß¿ÉÒÔÔÚÕâºó¼ÓСµÄÑÓʱ
        LCM_E = 0; //ÑÓʱ
        LCM_E = 1;
}

/****************дָÁî*****************/
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysCΪ0ʱºöÂÔæ¼ì²â
{
        if (BuysC) ReadStatusLCM(); //¸ù¾ÝÐèÒª¼ì²âæ
        LCM_Data = WCLCM;
        LCM_RS = 0;
        LCM_RW = 0;       
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;       
}

/****************¶ÁÊý¾Ý********************/
unsigned char ReadDataLCM(void)
{
        LCM_RS = 1;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        return(LCM_Data);
}

/*****************¶Á״̬********************/
unsigned char ReadStatusLCM(void)
{
        LCM_Data = 0xFF;
        LCM_RS = 0;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        while (LCM_Data & Busy); //¼ì²âæÐźÅ
        return(LCM_Data);
}
/********************LCM³õʼ»¯**********************/
void LCMInit(void)
{
        LCM_Data = 0;
        WriteCommandLCM(0x38,0); //Èý´ÎÏÔʾģʽÉèÖ㬲»¼ì²âæÐźÅ
        Delay5Ms();
        WriteCommandLCM(0x38,0);
        Delay5Ms();
        WriteCommandLCM(0x38,0);
        Delay5Ms();

        WriteCommandLCM(0x38,1); //ÏÔʾģʽÉèÖÃ,¿ªÊ¼ÒªÇóÿ´Î¼ì²âæÐźÅ
        WriteCommandLCM(0x08,1); //¹Ø±ÕÏÔʾ
        WriteCommandLCM(0x01,1); //ÏÔʾÇåÆÁ
        WriteCommandLCM(0x06,1); // ÏÔʾ¹â±êÒƶ¯ÉèÖÃ
        WriteCommandLCM(0x0F,1); // ÏÔʾ¿ª¼°¹â±êÉèÖÃ
}

/**********************°´Ö¸¶¨Î»ÖÃÏÔʾһ¸ö×Ö·û*********************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
        Y &= 0x1;
        X &= 0xF; //ÏÞÖÆX²»ÄÜ´óÓÚ15£¬Y²»ÄÜ´óÓÚ1
        if (Y) X |= 0x40; //µ±ÒªÏÔʾµÚ¶þÐÐʱµØÖ·Âë+0x40;
        X |= 0x80; //Ëã³öÖ¸ÁîÂë
        WriteCommandLCM(X, 1); //·¢ÃüÁî×Ö
        WriteDataLCM(DData); //·¢Êý¾Ý
}
/*****************°´Ö¸¶¨Î»ÖÃÏÔʾһ´®×Ö·û************************/
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
        unsigned char ListLength;

ListLength = 0;
        Y &= 0x1;
        X &= 0xF; //ÏÞÖÆX²»ÄÜ´óÓÚ15£¬Y²»ÄÜ´óÓÚ1
        while (DData>0x19) //Èôµ½´ï×Ö´®Î²ÔòÍ˳ö
                {
                        if (X <= 0xF) //X×ø±êӦСÓÚ0xF
                                {
                                        DisplayOneChar(X, Y, DData); //ÏÔʾµ¥¸ö×Ö·û
                                        ListLength++;
                                        X++;
                                }
                }
}


/**********************¼ÆË㺯Êý****************************/
void Conut(void)
        {
       time=TH0*256+TL0;
       TH0=0;
       TL0=0;
       
       S=(time*1.8)/10;   //Ëã³öÀ´ÊÇMM
       if((S>=7000)||flag==1) //³¬³ö²âÁ¿·¶Î§ÏÔʾ¡°-¡±
       {       
          flag=0;
       
          DisplayOneChar(0, 1, ASCII);
          DisplayOneChar(1, 1, ASCII);        //ÏÔʾµã
          DisplayOneChar(2, 1, ASCII);
          DisplayOneChar(3, 1, ASCII);
          DisplayOneChar(4, 1, ASCII);
          DisplayOneChar(5, 1, ASCII);        //ÏÔʾM
       }
       else
       {
          disbuff=S/1000;
          disbuff=S/100%10;
          disbuff=S/10%10;
          disbuff=S%10;
          DisplayOneChar(0, 1, ASCII]);
          DisplayOneChar(1, 1, ASCII);        //ÏÔʾµã
          DisplayOneChar(2, 1, ASCII]);
          DisplayOneChar(3, 1, ASCII]);
          DisplayOneChar(4, 1, ASCII]);
          DisplayOneChar(5, 1, ASCII);        //ÏÔʾM
       }
        }
/********************************************************/
void zd0() interrupt 1                //T0ÖжÏÓÃÀ´¼ÆÊýÆ÷Òç³ö,³¬¹ý²â¾à·¶Î§
{
    flag=1;                                                       //ÖжÏÒç³ö±êÖ¾
                RX=0;
}
/***************************Æô¶¯³¬ÉùÄ£¿é*****************************/
   voidStartModule()                         
{
          TX=1;                                             //Æô¶¯Ò»´ÎÄ£¿é
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX=0;
}
void Timer_Count(void)
{
                                TR0=1;                          //¿ªÆô¼ÆÊý
                                while(RX);                //µ±RXΪ1¼ÆÊý²¢µÈ´ý
                                TR0=0;                                //¹Ø±Õ¼ÆÊý
      Conut();                        //¼ÆËã

}

/*********************ÑÓʱº¯Êý**************************/
void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}


//5msÑÓʱ
void Delay5Ms(void)
{
        unsigned int TempCyc = 5552;
        while(TempCyc--);
}

//400msÑÓʱ
void Delay400Ms(void)
{
        unsigned char TempCycA = 5;
        unsigned int TempCycB;
        while(TempCycA--)
                {
                        TempCycB=7269;
                        while(TempCycB--);
                };
}
/*********************Ö÷º¯Êý****************************/
void ceju(void)
{
    unsigned int valA;
        unsigned char TempCyc;
        Delay400Ms(); //Æô¶¯µÈ´ý£¬µÈLCM½²È빤×÷״̬
        LCMInit(); //LCM³õʼ»¯
        Delay5Ms(); //ÑÓʱƬ¿Ì(¿É²»Òª)
        DisplayListChar(0, 0, mcustudio);
        DisplayListChar(0, 1, email);
        ReadDataLCM();//²âÊÔÓþäÎÞÒâÒå
        for (TempCyc=0; TempCyc<10; TempCyc++)
        Delay400Ms(); //ÑÓʱ
        DisplayListChar(0, 1, Cls);       
       TMOD=0x01;                   //ÉèT0Ϊ·½Ê½1£¬GATE=1£»
       TH0=0;
       TL0=0;         
       ET0=1;             //ÔÊÐíT0ÖжÏ
       EA=1;                           //¿ªÆô×ÜÖжϠ                      
       delayms(60);
       RX=1;
       StartModule();
   for(valA=7510;valA>0;valA--)
          {
                                        if(RX==1)
                                        {
         Timer_Count();
                                        }
            }
}




结果程序在实际运行的时候1602根本不显示,但是1602的程序是没有问题的,单独拿出来是可以执行的,不懂得问题出在哪里,麻烦大家帮我看一看

墨逸、 发表于 2014-5-10 16:10:26

这个是我所有的程序文件

墨逸、 发表于 2014-5-10 17:11:21

求指点啊

maimaige 发表于 2014-5-10 17:25:24

加断点调试吧,S变量在main中估计需要加上exern定义吧

墨逸、 发表于 2014-5-10 17:33:26

maimaige 发表于 2014-5-10 17:25
加断点调试吧,S变量在main中估计需要加上exern定义吧

但是我的S是static的啊

maimaige 发表于 2014-5-10 17:41:35

我只看了一下你贴的代码,
你的那个S在另外一个文件中定义的,而在main函数所在的文件中引用,应该加一个声明,
这个如果编译没有报错的话,lcd显示不正确估计和这个无关。
你多加断点,通过watch看看各个变量的值,和是否已经进入你的显示程序

墨逸、 发表于 2014-5-10 17:50:16

maimaige 发表于 2014-5-10 17:41
我只看了一下你贴的代码,
你的那个S在另外一个文件中定义的,而在main函数所在的文件中引用,应该加一个声 ...

那个static已经被我换成了extern ,我去看看程序会被执行到哪一步

tangjiaqq 发表于 2014-5-10 18:38:09

程序复杂啊

jingzhongyue 发表于 2014-5-13 20:56:45

刚开始上电时,应该有显示,一步步增减主程序中的内容,找到问题点,进而排除

wangpengcheng 发表于 2014-5-13 22:30:40

太长了,看不懂!

fuliqun 发表于 2014-5-14 09:39:50

有待高手点评{:smile:}

unifax001 发表于 2014-5-14 14:13:09

函数是函数 子程序是子程序 不能混淆概念
页: [1]
查看完整版本: 为什么我的子程序不执行呢