bbssilverkey 发表于 2013-5-22 12:57:41

单片机及C51的sbit变量,如何实现外部文件引用,extern声明不行

本帖最后由 bbssilverkey 于 2013-5-22 13:01 编辑

文件3个:
a.c- 用sbit声明老了一个变量 key
a.h
_main.c - #include "a.h"主函数调用 key这个变量,编译{:lol:} 显示未定义

问题:我不把sbit丢a.h不行么?当然丢a.h肯定能过编译.
请教解决方法{:lol:}

chencc8 发表于 2013-5-22 13:09:55

我也遇到过这问题 所以我干脆不用sbit~~~
C51的sbit很多限制,并且不能像char之类的关键字一样自动分配地址,麻烦死了

Alimy 发表于 2013-5-22 15:59:09

这个我刚好会。、

a.c
unsigned charbdataaaaa;
sbita_0 =aaaa^0;



在b.h中这样声明就可以了
extern bita_0;

chencc8 发表于 2013-5-22 17:09:28

Alimy 发表于 2013-5-22 15:59 static/image/common/back.gif
这个我刚好会。、

a.c


我记得我是这样
在a.h上声明了extern bita_0;结果报错……
明天再试试看

bbssilverkey 发表于 2013-5-22 18:08:48

Alimy 发表于 2013-5-22 15:59 static/image/common/back.gif
这个我刚好会。、

a.c


兄弟,你那个我刚拿keil4敲进去,不行的,编译器会报 redefinition,难道只能写入 .h文件么?

chencc8 发表于 2013-5-23 13:25:25

Alimy 发表于 2013-5-22 15:59 static/image/common/back.gif
这个我刚好会。、

a.c


还是不行呢,这两种方法都是错误的。
在HAL_UART.C中,定义了
uint8_t bdata SendFlag = FALSE;
sbit bSendFlag = SendFlag^0;
在HAL_UART.H中声明了
extern uint8_t bdata SendFlag ;
extern sbit bSendFlag;
结果在每个调用HAL_UART.H的C文件下都有一个中文意思大概是:在sbit附近有错误。

HAL_UART.H改成这样的话:
extern uint8_t bdata SendFlag ;
extern sbit bSendFlag = SendFlag^0;
还会增加一个错误:SendFlag不是有效的基地址

C51果然是挫

chencc8 发表于 2013-5-23 14:43:07

jswd0810 发表于 2013-5-23 13:43 static/image/common/back.gif
应该没有问题吧,我的定义
uchar bdata other_in;//此处other_in必须为bdata类型,否则编译出错
sbit mybit ...

我是说在多文件的工程中如何使用sbit。
比如A模块的源文件中定义了:
uchar bdata other_in;
sbit mybit0=other_in^0;
sbit mybit1=other_in^1;
sbit mybit2=other_in^2;
sbit mybit3=other_in^3;
sbit mybit4=other_in^4;
sbit mybit5=other_in^5;
sbit mybit6=other_in^6;
sbit mybit7=other_in^7;

那么我在B模块的源文件中如何使用mybit0~7呢,
现在就算是在A模块的头文件中增加声明:extern uchar bdata other_in;
或者在B模块的源文件中声明:extern uchar bdata other_in;
然后再在B模块的源文件中声明:
sbit mybit0=other_in^0;
sbit mybit1=other_in^1;
sbit mybit2=other_in^2;
sbit mybit3=other_in^3;
sbit mybit4=other_in^4;
sbit mybit5=other_in^5;
sbit mybit6=other_in^6;
sbit mybit7=other_in^7;
都会在B.c下报错:other_in是错误的基地址

pang7 发表于 2013-5-23 19:16:49

你没仔细看三楼
在HAL_UART.C中,定义了
uint8_t bdata SendFlag = FALSE;
sbit bSendFlag = SendFlag^0;
在HAL_UART.H中声明了
extern uint8_t bdata SendFlag ;
extern bit bSendFlag; 这里不能是sbit 了 要是bit 就okkeil 是有些问题 但这些问题不会弱

chencc8 发表于 2013-5-24 09:14:16

pang7 发表于 2013-5-23 19:16 static/image/common/back.gif
你没仔细看三楼
在HAL_UART.C中,定义了
uint8_t bdata SendFlag = FALSE;


哦,的确如你所说的!声明改成bit就OK了
以后还有机会用51的话,可以试下sbit~~

Alimy 发表于 2013-5-27 10:42:28

chencc8 发表于 2013-5-22 17:09 static/image/common/back.gif
我记得我是这样
在a.h上声明了extern bita_0;结果报错……
明天再试试看

不会啊。。。我一直就是这样用的。不会报错。。。报错的话就在b.h中用预编译命令。。
#ifdef _FILENAME_H_
#define _FILENAME_H_

//写其他要写在b.h中的
extern bit a_0;
//写其他要写在b.h中的

#endif   // end of FILENAME_H_

qllaoda1 发表于 2013-5-27 10:45:45

sbit sfr,在51里都不算变量,而是一种符号。所以可以定义在头文件里,在要用到的C文件里包含就行,不需要什么extern

chencc8 发表于 2013-5-27 11:21:16

Alimy 发表于 2013-5-27 10:42 static/image/common/back.gif
不会啊。。。我一直就是这样用的。不会报错。。。报错的话就在b.h中用预编译命令。。
#ifdef _FILENAME_H ...

恩,我以前是直接从培训的51汇编跳到了工作环境中AVR的C。没有系统学习C51。
不清楚原来sbit定义的位变量,在声明的时候要用bit声明

bbssilverkey 发表于 2013-5-28 07:55:40

jswd0810 发表于 2013-5-23 13:43 static/image/common/back.gif
应该没有问题吧,我的定义
uchar bdata other_in;//此处other_in必须为bdata类型,否则编译出错
sbit mybit ...

结贴了,H 用extern bit就可以了,完美解答,谢谢

jz701209李 发表于 2013-5-28 11:14:31

学习一下....

benqme 发表于 2013-5-28 11:47:00

可以呀一样

sywh 发表于 2013-11-6 16:39:49

学习,打包带走

king123 发表于 2013-12-21 11:20:17

我这样声明后,怎么出现了很多警告啊
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
全部都是这种警告

zw_7627 发表于 2014-11-22 15:46:24

感谢三楼,PICC中也是这样呢。

bbglx 发表于 2015-9-1 17:20:20

keil,12楼正解

oldmen 发表于 2015-10-2 00:29:02

king123 发表于 2013-12-21 11:20
我这样声明后,怎么出现了很多警告啊
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
全部都是这 ...

我的也是一样哦。
而且程序也不正常。

rain73 发表于 2015-10-2 05:58:15

你该用bit,而不是sbit。

oldmen 发表于 2015-10-2 20:40:59

昨天才调试好的
如果在c文件定义了sbit,在h文件声明bit,其它c文件调用它Keil会警告,并且程序运行不正常,后来是在需要调用的每个C文件都定义一下sbit就可以了。

liaihua1997 发表于 2015-10-3 11:36:14

申请变量应该用bit,
sbit是GPIO的端口定义

MCUStudent 发表于 2015-10-11 08:08:23

24楼正解,申请定义位变量应该用bit, sbit是定义GPIO的端口。
页: [1]
查看完整版本: 单片机及C51的sbit变量,如何实现外部文件引用,extern声明不行