新手求助!!keil 51错误:error C129 :missing';'before 'a'

hjying_15 2011-04-14 01:06:52
我想把LED.c中的变量‘a’定义成外部变量,以便被工程中的其他文件共享,但在调试时,出现了如标题所示的报警信息。
我的LED.c文件和LED.h文件分别如下(源程序全部是在英文状态输入的):

LED.C源程序:

#include <reg52.h>
#include <TimerT0.h> //定时器中断程序的头文件
#include <Typedef.h> //类型定义头文件

sbit led_0=P0^0 ;
uint a;

/*LED闪烁函数*/
void led_display()
{
if (sys_flag_500ms == 1) /*500ms时间到。时标sys_flag_500ms 由定时器中断产生*/
{
sys_flag_500ms = 0 ;/*时标清零*/
led_0 = ~led_0 ; /*LED以0.2Hz的频率闪烁 */
a++;
}
}

LED.h文件:

#ifndef _LED_H_
#define _LED_H_

extern void led_display();
extern uint a;

#endif

说明:
1)除了LED.C文件和LED.h文件外,还有另外几个文件,共同组成一个完整的LED闪烁程序,在此篇幅所限没贴出。
2)在没有加入uint a;和ertern uint a;之前,整个程序是正常工作的
3)但是在加入uint a;和ertern uint a;之后,程序就会出现:error C129 :missing';'before 'a' 的报警信息,同时我也详细检查过,绝不是在‘a’的前面缺少了‘;’。

非常感谢有高人指点,不胜感激!
...全文
18488 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxiangliang 2013-07-01
  • 打赏
  • 举报
回复
unit没有定义,加上#define unit unsigned int应该就可以了
i513536373 2013-06-27
  • 打赏
  • 举报
回复
要先定义变量,再外部引用。。。。。。。。。。。
pirate17 2013-06-21
  • 打赏
  • 举报
回复
#include <intrins.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <lcd_160128.h> extern uchar LCD_Initialise(); extern uchar LCD_Write_Command(uchar cmd); extern uchar LCD_Write_Command_P1(uchar cmd,uchar paral); extern uchar LCD_Write_Command_P2(uchar cmd,uchar paral,uchar para2); extern uchar LCD_Write_Data(uchar dat); extern void Set_LCD_POS(uchar row,uchar col) reentrant; extern void Line(uchar x1,uchar y1,uchar x2,uchar y2,uchar Mode) reentrant;//以上在中断中也有用到所以定义为可重入函数 extern void Draw_Image(uchar *G_Buffer,uchar Start_Row,uchar Start_Col)reentrant; extern void Display_Str_at_xy(uchar x,uchar y,char *Buffer,uchar wb) reentrant; extern void cls(); void Show_Score_and_Bullet() reentrant; 总报错:error C 129:missing';'before'LCD_Initialise' 哪位大神给看看
hjying_15 2011-05-03
  • 打赏
  • 举报
回复
更正对15楼的回复,extern uint a;是在TimeT0.h文件中。
hjying_15 2011-05-03
  • 打赏
  • 举报
回复
回14楼,我刚接触编程不久,不太了解编程的一些编写规范,我在分号的前面加了空格号,所以就造成了一些误解。
hjying_15 2011-05-03
  • 打赏
  • 举报
回复
回15楼,我所写的有关a的指令是我为了减少读者的查阅时间和更好地说明问题,而从整个程序中挑选出来的,如果您认真看了我的程序,你就会知道以上这两条语句并不是写在一起的,其中语句uint a;是在LED.c文件中,而语句extern uint a;是在LED.c文件中。
nianhua120 2011-05-02
  • 打赏
  • 举报
回复
是不是用成汉语的分号了》?
schlafenhamster 2011-05-02
  • 打赏
  • 举报
回复
uint a;//定义
extern uint a;//声明
这2个写在一起,说明你还没有真正懂。
hjying_15 2011-04-29
  • 打赏
  • 举报
回复
楼上应该是正解!
Great_Bug 2011-04-16
  • 打赏
  • 举报
回复
头文件的顺序。。。。。如果它们没有依赖性就无所谓,否则被引用的要放在前面。
hello_mcu 2011-04-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hjying_15 的回复:]
楼上是高人啊!!问题解决了,非常感谢!原来只是头文件包含的顺序问题啊!我在main.c和LED.c中把头文件的顺序调换了,问题就解决了。
[/Quote]
头文件包含顺序有什么区别吗。我在每个.C文件里,只要把需要用的头文件包含完全不就可以了。
TallPeaks 2011-04-14
  • 打赏
  • 举报
回复
uint没有定义,楼主再检查一下。
hjying_15 2011-04-14
  • 打赏
  • 举报
回复
说明:
1)我加入变量uint a只是为了练习如何定义一个外部变量,而有关变量a 的所有指令在整个工程中是没有实际意义的。
2)我反复实验过,只有加入了有关a的指令之后,才会出现上述的警告信息,而去掉有关a的指令后,整个程序工作正常。
3)有关a的指令如下:

uint a;
extern uint a;
if(a == 10)
{
a = 0;
}

4)在同一个工程中,如何一个文件中使用其他文件的整形变量?我的程序应该如何修改?非常感谢!!
hjying_15 2011-04-14
  • 打赏
  • 举报
回复
LED.c文件:

#include <reg52.h>
#include <TimerT0.h>
#include <Typedef.h>

sbit led_0=P0^0;
sbit led_1=P0^1;

/*LED闪烁函数*/
void led_display()
{
if(a == 10)
{
a = 0;
}
if (sys_flag_500ms == 1) /*LED0以0.2Hz的频率闪烁*/
{
sys_flag_500ms = 0;
led_0 = ~led_0;
}
if (sys_flag_1s == 1) /*LED1以1Hz的频率闪烁*/
{
sys_flag_1s = 0;
led_1 = ~led_1;
}
}

LED.h文件:

#ifndef _LED_H_
#define _LED_H_

extern void led_display();

#endif

Typedef.h文件

/*类型定义*/
#ifndef _TYPEDEF_H_
#define _TYPEDEF_H_

typedef unsigned int uint ;
typedef unsigned char uchar;

#endif

hjying_15 2011-04-14
  • 打赏
  • 举报
回复
谢谢以上各位大侠,我试过了,当我去掉uint a;和ertern uint a;这两句语句的时候,程序是正常工作的,而数据类型uint也已经在Typedef.h中做了定义。
完整的源程序包含6个文件,它们的功能如下:
1)main.c文件:主程序的入口
2)TimeT0.c文件:用来产生时标和调度时标,定时器初始化函数,定时器中断函数,及时间调度函数
3)TimeT0.h文件:TimeT0.c的接口文件
4)LED.c文件:LED灯闪烁
5)LED.h文件:LED.C的接口文件
6)Typedef.h文件:类型定义头文件

完整的源程序如下:
1.main.c文件:
#include <reg52.h>
#include <led.h>
#include <timerT0.h>
#include <typedef.h>

void main()
{
timer0_init();
EA=1;
while(1)
{
time_control();/*时间调度函数*/
led_display(); /*LED闪烁函数*/

}
}

/*timet0.c文件,包含三个函数:
1)定时器初始化函数:void timer0_init()
2)定时器中断函数:void Timer0() interrupt 1
3)时间调度函数:void time_control()
*/
#include <reg52.h>
#include <typedef.H>
#define count_1ms 10
#define count_500ms 500

bit time_flag_1ms; /* 时标,在本文件中调用 */
bit sys_flag_100us, sys_flag_1ms, sys_flag_500ms; /* 时标,在工程中的其他文件文件调用 */
uint time_1ms = count_1ms, time_500ms = count_500ms; /* 时标计数,在本文件中使用 */
uint a;
/* 定时器初始化函数 */
void timer0_init()
{
TMOD = 0x02; /* 定时器T0,工作方式2 */
TH0 = 156; /* 定时100us */
TL0 = 156;
ET0 = 1;
TR0 = 1;
}

/* 定时器中断函数 */
void Timer0() interrupt 1
{
sys_flag_100us = 1;
time_1ms-- ; /* 响应中断时,减1 */
if (time_1ms == 0)
{
time_1ms = count_1ms;
time_flag_1ms = 1;
}
}

/* 定时控制函数,用以调度工程中的时标,触发不同的响应 */
void time_control()
{
if (time_flag_1ms == 1)
{
time_flag_1ms = 0;
sys_flag_1ms = 1; /* 1ms时标,该时标会在工程中的其他文件中清零 */
time_500ms--;

if (time_500ms == 0)
{
time_500ms = count_500ms;
sys_flag_500ms = 1;
a++;
/* 500ms时标,该时标会在工程中的其他文件中清零 */

}

}
}
}

TimeT0.h文件:

/*文件Timer0_c的头文件*/
#ifndef _TIMERT0_H_
#define _TIMERT0_H_

extern void timer0_init();
extern void time_control();
extern bit sys_flag_100us;
extern bit sys_flag_1ms;
extern bit sys_flag_500ms;
extern bit sys_flag_1s;
extern uint a;

#endif
lbing7 2011-04-14
  • 打赏
  • 举报
回复
sbit led_0=P0^0 ;

感觉你的这个分号像是全角字符

得用英文半角
李迟 2011-04-14
  • 打赏
  • 举报
回复
试一下在LED.h头文件中添加uint的宏定义。
或者如2楼所说添加那个头文件。
zyzhang365 2011-04-14
  • 打赏
  • 举报
回复
uint 没有定义。在LED.h中
#include <Typedef.h> //类型定义头文件
hjying_15 2011-04-14
  • 打赏
  • 举报
回复
楼上是高人啊!!问题解决了,非常感谢!原来只是头文件包含的顺序问题啊!我在main.c和LED.c中把头文件的顺序调换了,问题就解决了。
哈皮歪詩 2011-04-14
  • 打赏
  • 举报
回复
If you don't want to change LED.h, you can try to change the way you include header files in main.c, like the following:

#include <reg52.h>
#include <timerT0.h>
#include <typedef.h>
#include <led.h>

加载更多回复(1)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧