请单片机C51高手帮忙分析一下编译错误

simon_eun   2008-5-27 17:18 楼主
#include "atmel\at89x51.h"
#include "intrins.h"

#define HI             ((65536 - 50000) / 256)
#define LO             ((65536 - 50000) % 256)
#define _TH0_TL0_             (65536 - 50000)
#define M             20            //(1000/25)
bit km;                              //按键已去抖动标志
bit kp;                   //按键已处理标志
bit led_on;
bit flash;
bit new_time_info;
unsigned char show_status;
unsigned char display[6];
unsigned char hou,min,sec;
unsigned char cur_time_set;
unsigned char attr;
unsigned int  count_down;

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

unsigned char SEG_TAB_B[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9数字
unsigned char SEG_TAB_A[ ] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0.-9.数字
/*********************************************************************************************/
void Delay(unsigned char a)//延时程序a*1MS
{
    unsigned char j;
    while(a-- != 0)
    {
        for (j = 0; j < 125; j++);
    }
}
/*********************************************************************************************/
void Disp(void)//数码管显示
{
        P2_0 = 1;
        P1 = SEG_TAB_B[ hou / 10 ];   
        Delay(5);
        P2_0 = 0;
        P2_1 = 1;
        P1 = SEG_TAB_A[ hou % 10 ];
        Delay(5);
        P2_1 = 0;
        P2_2 = 1;
        P1 = SEG_TAB_B[ min / 10 ];   
        Delay(5);   
        P2_2 = 0;
        P2_3 = 1;
        P1 =SEG_TAB_A[ min % 10 ];        
        Delay(5);
        P2_3 = 0;
        P2_4 = 1;
        P1 = SEG_TAB_B[ sec / 10 ];   
        Delay(5);   
        P2_4 = 0;
        P2_5 = 1;
        P1 = SEG_TAB_B[ sec % 10 ];   
        Delay(5);   
        P2_5 = 0;
}
            
/********************************************************************************************/
void IsrTimer0(void) interrupt 1 using 1    //定时50ms
{
    static unsigned char count = 0;    //定义静态变量count
    count++;
    if(count == M)
    {
        count = 0;   
        sec++;        
        if(sec == 60)
        {
            min++;
            sec = 0;
            if(min == 60)
            {
                hou++;
                min = 0;
                if(hou == 24)
                {
                    hou = 0;
                }
            }
        }
    }
}
/******************************************************************************************/
void Timer0Init(void)  //定时器0
{
    TMOD = 0x01;
    TH0 = HI;
    TL0 = LO;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
   
}

**************************************************************************************************
void Timer1ISR (void ) interrupt 3 using 2                //定时器2中断,用于按键扫描{unsigned char keytmp;
char tmp;

  TH1=0x15; TL1=0xa0;     // 每30ms中断一次
  if((show_status==1 )||(show_status==2))         //当前显示或设置时间
    { display[0]=hou/10;          display[1]=hou%10;          display[2]=min/10;
          display[3]=min%10;          display[4]=sec/10;          display[5]=sec%10;

          
         }

keytmp=~(P1) & 0x0f;
  if(keytmp==0)  { km=0;  kp=0; }   
  else
   { if(km==0)   km=1;   
         else
     { if(kp==0)
        { kp=1;
                  if(keytmp==1)                        //第一个按钮
                 
                      if((show_status==1) && led_on)  //正显示时间
                     { show_status=2;  cur_time_set=0;  attr=0x3f; }  //进入时间设置
                         else if(show_status==2)                //如正在设置时间项
                         { show_status=1;  new_time_info=1; attr=0xff; }  //返回当前时间显示
                         return;
                        }
                     
                  if(keytmp==2 && led_on)    //第二个按钮,仅当数码管打开时有效
                   { switch(attr)
                     {  
                           case 0x3f: if(show_status==2)
                         hou=(hou+1)%24;       //当前时间的"时"加1
                              break;   
         
                case 0xcf:
                           if(show_status==2)
                            min=(min+1)%60;         //当前时间的“分”加1
                                    break;  
                case 0xf3:  if(show_status==2)
                           {count_down=8000;
                            sec=(sec+1)%60; }        //当前时间的“秒”加1
                                break;                 
                          }       //end of switch(attr)
                         return;
                        }         //end of if(keytmp==1)

                  if(keytmp==3)                //第三个按钮
                   { switch(attr)
                     { case 0xff: if((show_status==1 )|| (show_status==2))
                                      led_on=~led_on;        //打开或关闭数码管显示
                                                  break;
                           case 0x3f: if(show_status==2)         //如果正在设置时间
                                                   { if(cur_time_set==2)  
                        
                                        //当前时间的“时”减
                                                   { tmp=hou-1;  if(tmp<0) hou=23;  else  hou=tmp;  }
                                          break;
                          
                                 
                                     }
                                                  else if(show_status==2)         
                           { tmp=min-1;           //当前时间的“分”减1
                            if(tmp<0) min=59;   else  min=tmp;   }
                                                     break;
                          
                        
                                                  else if(show_status==2)         
                           { tmp=sec-1;             //当前时间的“秒”减1
                             count_down=8000;
                             if(tmp<0) sec=59;   else  sec=tmp; }
                                                  break;
                                                  }
                                }
         }
                        }
                        }  

/******************************************************************************************/
void main()
{unsigned char i;

  hou=00;  min=00;  sec=00;  
  count_down=8000;

  flash=0;    attr=0xff;      led_on=1;
  km=0;     kp=0;          show_status=2;     //加电后显示当前时间

   
  while(1)
  { if (hou==00&&min==00&&sec==00 )
       P1_5=0 ;
else if (hou==00&&min==05&&sec==00)
P1_5=1;

   
  }
   

  IE=0;  IP=0;             //打开所有中断和低优先
  TMOD=0x12;             //timer 0 is set to mode 2,auto_reloading,timer1,mode 1定时器0设成模式2,自动重装,定时器1模式1.
  TH0=6;    TL0=6;        //timer0 parameters for 0.125ms
  TH1=0x15; TL1=0xa0;      //timer1 parameters for 30ms
  TR0=1;    TR1=1;        //timer0 interrupt most important
  ET0=1;    ET1=1;    EA=1;     //enable interrupt function

   
  }


错误提示left side of asn-op not an lvalue,是          display[3]=min%10;          display[4]=sec/10;          display[5]=sec%10;这行出的错。还有这行 else if(show_status==2)   出错:syntax error near 'else';另外还有void Timer1ISR (void ) interrupt 3 using 2        这行出错:syntax error near 'void'
          

回复评论 (18)

敬请高手帮忙指点,小弟不胜感激!!!
点赞  2008-5-27 17:19
void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;
是你的程序如此,还是粘贴有误?

我在你的程序中没有看到display[]的定义
点赞  2008-5-27 19:15
引用: 引用 2 楼 btiger2000 的回复:
void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;
是你的程序如此,还是粘贴有误?

我在你的程序中没有看到display[]的定义


void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描
{unsigned char keytmp;
点赞  2008-5-28 00:10
引用: 引用 2 楼 btiger2000 的回复:
void Timer1ISR (void ) interrupt 3 using 2 //定时器2中断,用于按键扫描{unsigned char keytmp;
是你的程序如此,还是粘贴有误?

我在你的程序中没有看到display[]的定义

那个是粘贴的问题,原程序里是换行了的。unsigned char display[6];不是对display[]的定义吗?好像就是这个定义出了什么问题哈?该怎么改呢?麻烦老师指点指点呗!谢谢了!
点赞  2008-5-28 07:52
从程序上无法看出直接的错误。
你用的是Keil吧?建议你做如下工作:
重新新建一个project,重建一个main.c文件,然后,从main()开始,一点一点重新拷贝过去,其实最好是重新敲代码,但是估计你没这个耐心了。
每次复制过去,就编译一次。看看到底哪里会出问题。
像中断函数的定义,绝对是最标准最通用的,竟然也出错,显然不是函数体本身的问题了。

说个以前碰到过的问题:Keil不支持中文,强行写中文进去也能显示,但是删除的时候,就会将中文截成2个字节,一不小心,就会删一半剩一半。如果剩下的一半正好是非显示字符,那么编译时必然报错,偏偏你还看不到。
点赞  2008-5-28 11:10
引用: 引用 5 楼 shuiyan 的回复:
从程序上无法看出直接的错误。
你用的是Keil吧?建议你做如下工作:
重新新建一个project,重建一个main.c文件,然后,从main()开始,一点一点重新拷贝过去,其实最好是重新敲代码,但是估计你没这个耐心了。
每次复制过去,就编译一次。看看到底哪里会出问题。
像中断函数的定义,绝对是最标准最通用的,竟然也出错,显然不是函数体本身的问题了。

说个以前碰到过的问题:Keil不支持中文,强行写中文进去也能显示,…

果然是高手,你说的这个问题我以前也遇到过!可能这次还是这问题。不过第二处错误那里display[]的定义好像也有问题,可我不知道该怎么改,你觉得会是什么问题啊?
点赞  2008-5-28 16:35
你最好把整个工程传上来,这样看,很难看出问题!
点赞  2008-5-28 19:37
经历了注册,不停的完善信息,我已经不想帮你解决问题了。自己努力吧!兄弟
下次把程序拷贝的整齐点,方便大家分析,好吗?
点赞  2008-5-28 23:06
这个网页还不让拷贝粘贴,兄弟。
我问一下,你定义的DISPLAY是char型的,但是你除法得到的结果应该是什么类型的呀?
改一下试试看吧,希望能正确
点赞  2008-5-28 23:09
引用: 引用 9 楼 dowegood 的回复:
这个网页还不让拷贝粘贴,兄弟。
我问一下,你定义的DISPLAY是char型的,但是你除法得到的结果应该是什么类型的呀?
改一下试试看吧,希望能正确


hou/10这个是个位求整,hou%10是十位求整,字符型和整型是可以相互赋值的不是吗?而且我试过了改了也不对的。我实在想不到该怎么改了才来论坛求助的啊!谢谢个位老师的指点,学习了很多!虽然问题还是没解决。。。。。。。。
点赞  2008-5-29 08:16
现在感觉应该不是display的问题,而是hou,min,sec的问题。
点赞  2008-5-29 08:27
问题解决了!感谢各位老师的无私帮助!越来越喜欢这个论坛了!
点赞  2008-5-29 08:41
奇怪,display部分看不出什么问题。你解决了?是什么地方出的毛病?
点赞  2008-5-29 13:40
直接删了。把那断程序改了一下换了个位置。然后整个程序重新手动输入了一遍。
点赞  2008-5-29 16:33
也许就是5楼说的问题! 有看不到的文字
点赞  2008-5-29 18:18
引用: 引用 14 楼 nianchao 的回复:
直接删了。把那断程序改了一下换了个位置。然后整个程序重新手动输入了一遍。


晕倒……估计之前你已经花了很长很长的时间来找问题了吧。痛苦吧。。。曾经我也是经历过的,所以,后来我用keil,一是尽量不用中文,二是用中文的,全部在Ultraedit里面输入,三是原来ok的程序,一旦加新功能出现莫名其妙的问题,立即新建工程,新建文件,从原来好的程序开始,一点一点的加,一点一点的剥
点赞  2008-5-29 22:52
真的好痛苦啊!我最大的梦想就是以后中国强大了全世界都用中国产的CPU,MCU,编程全用汉语,所有IC的说明书都是汉语的,而且不能用翻译软件翻译,痛苦死那些老外!!!
点赞  2008-5-30 08:07
引用: 引用 17 楼 nianchao 的回复:
真的好痛苦啊!我最大的梦想就是以后中国强大了全世界都用中国产的CPU,MCU,编程全用汉语,所有IC的说明书都是汉语的,而且不能用翻译软件翻译,痛苦死那些老外!!!


太极端,没必要这样,只要到时所有的最新技术论文都是中文发表的,那么那些老外就值得头疼了。计算机嘛,用中文的可能性不大,真的。
点赞  2008-5-30 11:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复