3050311118 发表于 2012-9-25 12:53:49

C51里,我sfr alarm=0;这样定义一个特殊功能寄存器可以么?

C51里,我sfr alarm=0;这样定义一个特殊功能寄存器可以么?会不会影响其他功能

zhanliana 发表于 2012-9-25 12:53:50

楼主看来对SFR的理解不正确。
SFR是keil开发环境下自有的关键词。意在告诉编译器一些信息。(其实你写的C语言代码就是为了告诉编译器你想做的事情而已。)
特殊功能寄存器就是一群挂在总线上的可读可写的“变量”。由于这些“变量”上直接连着电路,对应着一些功能,所以被称为特殊功能寄存器。
SFRXXX=0x69   这样的写法就是告诉编译器,以后碰到对XXX的操作就是对地址0x69这个单元的内容做操作。51的特殊功能寄存器就是以reg52.h 文件的内容,SFR关键词来告诉编译器进行编译的。
实际上你直接用指针操作也是可以的。只不过是,51单片机对特殊功能寄存器和RAM、ROM的地址编排比较特殊,所以用SFR更好的告诉编译器:“0x69这个地址是指特殊的地址,与ROM是不一样的“。
如果你的51堂握得很好的话,你通篇用绝对地址访问也不会有问题。

不过貌似楼主定义sfralrm=0的时候,只是想有个变量罢了。那你就写 unsigned char alrm=0就可以了。编译器会把这个变量按排在RAM里。与寄存器无关。

hongshao 发表于 2012-9-25 13:22:46

能否这样定义,跟C51没关系,跟你用的编译器有直接关系。看看你用的编译器的帮助文件吧。

lgg88 发表于 2012-9-25 13:39:19

特殊功能寄存器的地址必须是单片机支持的应该才可以吧 。

zhanan 发表于 2012-9-25 17:02:24

报错。无效的基地址,一个sfr或sbit声明的基地址是错误的,有效的基地址范围在0x80到0xFF之间。

地址0在RAM范围,并且还是用得很频繁的R0,C51中是不需要编程者干预的。
非要干预(只读),用_at_来定位变量地址,或者用指针。

gaoyichuan000 发表于 2012-9-25 23:38:13

SFR怎么可以定义成这样?
地址无效 0x80到FF才可以用SFR定义

gaoyichuan000 发表于 2012-9-26 11:59:21

jswd0810 发表于 2012-9-26 09:23 static/image/common/back.gif
同意楼上,一般这个都是在
#include
里没有包含进去而单片机功能有所扩展时用的,不能随便加的 ...

是啊 SFR通常不要自己定义 要在程序里做一个标志位的话 用一个BYTE的变量就可以了

zhanliana 发表于 2012-9-26 12:31:33

用过一些51单片机的增强版,增加了一些寄存器,由于reg52.h里边没有这些寄存器的描述,所以需要手动添加。无论把SFR指令放在.c里,还是改造reg52.h里,效果是一样的,告诉编译器:”爷要求你把XXX当成0x69这个寄存器构域的地址来用,读他写他都去找0x69这个地址去访问去!“
页: [1]
查看完整版本: C51里,我sfr alarm=0;这样定义一个特殊功能寄存器可以么?