搜索
bottom↓
回复: 24

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

[复制链接]

出0入0汤圆

发表于 2013-5-22 12:57:41 | 显示全部楼层 |阅读模式
本帖最后由 bbssilverkey 于 2013-5-22 13:01 编辑

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-5-22 13:09:55 | 显示全部楼层
我也遇到过这问题 所以我干脆不用sbit~~~
C51的sbit很多限制,并且不能像char之类的关键字一样自动分配地址,麻烦死了

出0入0汤圆

发表于 2013-5-22 15:59:09 | 显示全部楼层
这个我刚好会。、

a.c
unsigned char  bdata  aaaa;
sbit  a_0 =  aaaa^0;



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

出0入0汤圆

发表于 2013-5-22 17:09:28 | 显示全部楼层
Alimy 发表于 2013-5-22 15:59
这个我刚好会。、

a.c

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

出0入0汤圆

 楼主| 发表于 2013-5-22 18:08:48 | 显示全部楼层
Alimy 发表于 2013-5-22 15:59
这个我刚好会。、

a.c

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

出0入0汤圆

发表于 2013-5-23 13:25:25 | 显示全部楼层
Alimy 发表于 2013-5-22 15:59
这个我刚好会。、

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果然是挫

出0入0汤圆

发表于 2013-5-23 14:43:07 | 显示全部楼层
jswd0810 发表于 2013-5-23 13:43
应该没有问题吧,我的定义
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是错误的基地址

出0入0汤圆

发表于 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 就ok  keil 是有些问题 但这些问题不会弱

出0入0汤圆

发表于 2013-5-24 09:14:16 | 显示全部楼层
pang7 发表于 2013-5-23 19:16
你没仔细看三楼
在HAL_UART.C中,定义了
uint8_t bdata SendFlag = FALSE;

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

出0入0汤圆

发表于 2013-5-27 10:42:28 | 显示全部楼层
chencc8 发表于 2013-5-22 17:09
我记得我是这样
在a.h上声明了extern bit  a_0;结果报错……
明天再试试看

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

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

#endif   // end of FILENAME_H_

出0入0汤圆

发表于 2013-5-27 10:45:45 | 显示全部楼层
sbit sfr,在51里都不算变量,而是一种符号。所以可以定义在头文件里,在要用到的C文件里包含就行,不需要什么extern

出0入0汤圆

发表于 2013-5-27 11:21:16 | 显示全部楼层
Alimy 发表于 2013-5-27 10:42
不会啊。。。我一直就是这样用的。不会报错。。。报错的话就在b.h中用预编译命令。。
#ifdef _FILENAME_H ...

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

出0入0汤圆

 楼主| 发表于 2013-5-28 07:55:40 | 显示全部楼层
jswd0810 发表于 2013-5-23 13:43
应该没有问题吧,我的定义
uchar bdata other_in;//此处other_in必须为bdata类型,否则编译出错
sbit mybit ...

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

出0入0汤圆

发表于 2013-5-28 11:14:31 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-5-28 11:47:00 来自手机 | 显示全部楼层
可以呀一样

出0入0汤圆

发表于 2013-11-6 16:39:49 | 显示全部楼层
学习,打包带走

出0入0汤圆

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

出0入0汤圆

发表于 2014-11-22 15:46:24 | 显示全部楼层
感谢三楼,PICC中也是这样呢。

出0入0汤圆

发表于 2015-9-1 17:20:20 | 显示全部楼层
keil,12楼正解

出0入0汤圆

发表于 2015-10-2 00:29:02 | 显示全部楼层
king123 发表于 2013-12-21 11:20
我这样声明后,怎么出现了很多警告啊
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
全部都是这 ...

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

出0入0汤圆

发表于 2015-10-2 05:58:15 | 显示全部楼层
你该用bit,而不是sbit。

出0入0汤圆

发表于 2015-10-2 20:40:59 来自手机 | 显示全部楼层
昨天才调试好的
如果在c文件定义了sbit,在h文件声明bit,其它c文件调用它Keil会警告,并且程序运行不正常,后来是在需要调用的每个C文件都定义一下sbit就可以了。

出0入8汤圆

发表于 2015-10-3 11:36:14 | 显示全部楼层
申请变量应该用bit,
sbit是GPIO的端口定义

出0入0汤圆

发表于 2015-10-11 08:08:23 | 显示全部楼层
24楼正解,申请定义位变量应该用bit, sbit是定义GPIO的端口。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-23 18:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表