单片机C51程序中#define acc unsigned char 宏定义能否做成一个像<AT89X51.h>头文件,请告诉我怎么做,

如题所述

在记事本或编辑器中编辑保存以下文本到 你定义的文件名.h,如Global.h
//================================
#ifndef GLOBAL
#define GLOBAL
#define acc unsigned char
#endif
//================================
在需要用到acc的c程序或h程序文件中,添加 #include "Global.h" 即可。追问

谢谢

追答

#ifndef是编译预处理命令,有了这句话,你可以任意包含在所需的所有文件中了。不客气。

追问

能拜你为师吗?,我自学单片机,谢谢

追答

……相信大家的智慧才是真智慧。多听听大家的意见,我们共同进步!我也是个单片机爱好者。有问题多请问自己,这是提高的最佳途径!偶尔来百度告诉大家你的进展倒是可以的。有机会我们再讨论。呵呵。

追问

请问
sbit K1=P1^0可不可以用unsigned char K1=P1^0代替

追答

说明你没有看书,要挨批的。
sbit表示位特殊功能寄存的定义。^除了按位异或功能(C)外,还有就是这里(C51)对sfr中特定的位的说明。K1将等效于P1端口的0位在内部的可位寻址的位变量地址。
unsigned char K1=P1^0;这里的K1表示内存中的通用变量。这里将会做P1的读入操作。并把结果与0按位异或操作。结果是:声明了K1变量为内存变量,并做了一次赋值,把P1读入的值。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-11
一个比较直观的表示方式是一个类似于0x1234这样的数字!

上述例子是个比较常见的宏定义,宏定义的本质只是简单的文本代换,套用你给出的例子,在这句代码以后所有出现了“TWBR ”的地方都用(*(volatile unsigned char *)0x20)代替,所谓宏就是这样。

我再解释一下后面一串东西:0x20是个整数,这里用(volatile unsigned char *)表示对它进行强制类型转化,这样转化后表示0x20是个内存地址,或者是某个寄存器的地址,CPU可以寻址得到,(/*即是个指针,这个指针指向一个char型的变量,前面所述是错误的,它不是一个指针了,而是一个(volatile unsigned char *)类型的指针所指向的地址了*/)最前面的*表示对这个地址取值,也就是对0x20处的内存地址取一个char(一个字节)的内容出来。

另外如果你不知道volatile 关键字的作用的话,着实应该认真看看,在这里挺关键的。volatile 在这里主要作用是防止编译器“自作主张”对其优化从而导致不是每次都从0x20这个地址处取值(它很可能在第二次运行到这句代码的时候用上次运行的结果了)。

另外,可以直接给一个指针变量直接赋值,但是你要注意他的合法性(包括数据类型以及这个数据是否可读可写等,在有OS的环境下更为严格)。

我自己对某些概念理解不够准确,给你造成迷惑,实在抱歉!
相似回答
大家正在搜