打印

请教个C51编程技巧的问题,谢谢!

[复制链接]
2189|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
APT|  楼主 | 2012-10-18 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 APT 于 2012-10-19 16:08 编辑

//本楼的例程太长看得眼花,别看了,重新写了段简短的例程在3楼,请指教,谢谢!

//用个例子来表述我的问题,假设现有一个程序,这个程序由一个文件组成:
//文件内容:
#include "reg51.h"
unsigned char bdata bA;//全局的位寻址变量
sbit bA_0=bA^0;//定义特殊功能寄存器
unsigned char cB;//全局变量
sbit OUT1=P3^0;
sbit OUT2=P3^1;
void fun1()//函数fun1
{  cB=P0;
    bA=cB;
    OUT1=bA_0;
}
void fun2()//函数fun2
{  cB=P1
    bA=cB;
    OUT2=bA_0;
}
void main()//主函数
{  P0=P1=0xff;
    fun1();
    fun2();
}
//旧文件完结


//现在,由于版本编译和视觉的原因,我要将上述的文件拆分成多个文件
//初步拆分成如下述的几个文件:
//专门声明变量的文件V.h,文件内容如下:
    unsigned char bdata bA;//全局的位寻址变量
    unsigned char cB;//全局变量

//专门说明外部变量的eV.h,文件内容如下
    extern unsigned char bdata bA;
    extern unsigned char cB;

//专门声明sbit的sb.h,文件内容如下
    #include "reg51.h"
    sbit OUT1=P3^0;
    sbit OUT2=P3^1;

//函数fun1.c,文件内容如下
#include "eV.h"
#include "sb.h"
    void fun1()//函数fun1
    {  cB=P0;
        bA=cB;
        OUT1=bA_0;
    }

//函数fun2.c,文件内容如下
    #include "eV.h"
    #include "sb.h"
    void fun2()//函数fun2
    {  cB=P1
        bA=cB;
        OUT2=bA_0;
    }

//主函数main.c,文件内容如下
#include "reg51.h"
#include "V.h"
#include "sb.h"
void fun1();
void fun2();
main()
{  P0=P1=0xff;
    fun1();
    fun2();
}
//现在拆完了,但是还欠一句"sbit bA_0=bA^0;"不知道该放哪.
//如果放在V.h或main.c里,则编译器在fun1.c和fun2.c里会找不到bA_0;
//如果放在sb.h,或者放在fun1.c或者fun2.c里则编译器会认为bA是不正确的描述;

//请教:该怎么写才正确,且清晰有条理????谢谢!
沙发
kk8346| | 2012-10-18 23:04 | 只看该作者
我自己的写法,供参考。
文件如下:
1、功能1——FUN1.c(定义变量和函数) + FUN1.h(声明变量和函数)
2、功能2——FUN2.c(定义变量和函数) + FUN2.h(声明变量和函数)
3、IO口定义(如:sbit bA_0=bA^0),再另外用一个Config.h。

在c文件中包含h文件。

使用特权

评论回复
板凳
APT|  楼主 | 2012-10-19 16:05 | 只看该作者
回楼上:问题是我在config.h里定义sbit bA_0=bA^0的时候,编译会提示bA是不正确的地址. 一楼的例程长了点,编个简单点的来表述我的问题,现有程序就一个文件,内容如下: #include "reg51.h"
unsigned char bdata bA;//全局的位寻址变量
sbit bA_0=bA^0;//定义特殊功能寄存器
sbit OUT1=P3^0;
void fun1()//函数fun1
{
   OUT1=bA_0;
}
void main()//主函数
{  bA=P0;
    fun1();
}
//旧文件完结

//现在,要将这个程序拆分为2个文件:
//一个文件为fun1()的fun1.c,文件内容如下:
#include "reg51.h"
void fun1()//函数fun1
{
   OUT1=bA_0;
}

//另一个文件为main()的main.c,文件内容如下:
#include "reg51.h"
unsigned char bdata bA;//全局的位寻址变量
extern void fun1();//声明fun1为外部函数
void main()//主函数
{  bA=P0;
    fun1();
}
//拆分完毕,但是程序还欠一句"sbit bA_0=bA^0;"
//现在的情况是: "sbit bA_0=bA^0;"这语句如果我写在main.c里,编译器会认为fun1.c里的bA_0未定义,又如果我写在fun1.c里,编译器会认为fun1.c里的bA未定义.
//请问:该怎么写?

使用特权

评论回复
地板
kk8346| | 2012-10-19 21:21 | 只看该作者
如果两个C文件中都要用到"bA_0",则将"sbit bA_0=bA^0;"这一句写到一个h文件中(假定为config.h),
然后在main.c和fun1.c中都包含这个config.h文件。
关键是:一般情况下,不要包含c文件。

使用特权

评论回复
5
kk8346| | 2012-10-19 21:22 | 只看该作者
问题是我在config.h里定义sbit bA_0=bA^0的时候,编译会提示bA是不正确的地址。
针对这一点,在config.h中应包含reg51.h。

使用特权

评论回复
6
阿南| | 2012-10-20 10:46 | 只看该作者
那你把bA的地址定义到哪里了?看看reg51.h里面的特殊寄存器是怎么定义的

使用特权

评论回复
7
APT|  楼主 | 2012-10-20 13:58 | 只看该作者
回5楼6楼:
bA是在main()里声明的位寻址全局变量,是由编译器分配的,编译前,我并不知道编译器会分配什么地址给它.reg51.h里不会有bA的定义.
现在我有个函数要对bA的某个位进行操作,而且这个函数与main()不在同一个文件里.

使用特权

评论回复
8
tjyanliang| | 2012-10-20 14:34 | 只看该作者
学习了,

使用特权

评论回复
9
kk8346| | 2012-10-20 19:32 | 只看该作者
回7楼:
如果bA是你自己定义的位寻址变量(字节型),则如果需要用到"sbit bA_0=bA^0;"这样的位变量,可用如下方法,举例如下:
1、在FUN.c中定义:
      bdata uint8_t bA;  //bdata表示将变量分配到位寻址空间
         sbit bA_0 = bA^0;
2、在FUN.h中声明:
      extern bdata uint8_t bA;
      extern bit bA_0; //注意:此处不是sbit,而是bit。
3、在需要用到这些变量的c文件中,包含FUN.h即可。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
APT + 1
10
Super_| | 2012-10-20 19:38 | 只看该作者
MARK。

使用特权

评论回复
11
天风立马| | 2012-10-20 23:23 | 只看该作者
写在“reg51.h”里。然后#include“reg51.h”

使用特权

评论回复
12
APT|  楼主 | 2012-10-21 21:00 | 只看该作者
谢谢kk8346 :handshake
按你说的试了,的确可以,谢谢!

使用特权

评论回复
13
kk8346| | 2012-10-22 20:19 | 只看该作者
不客气,有问题多交流。我也喜欢学习。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

APT

23

主题

92

帖子

0

粉丝