单片机关键字sfr和sbit区别

单片机关键字sfr和sbit区别,第1张

  单片机关键字sfrsbit的理解

  在单片机C语言编程中,扩充了两个关键字sfr和sbit。

  sfr(Special FuncTIon Register特殊功能寄存器的缩写),sbit(特殊功能寄存器位),与定义一般的int、char型变量不同,这两个字定义的并不是变量,而作为特殊功能寄存器的引用,或许可以叫做别名。

  单片机头文件《reg51.h》中定义了21个特殊功能寄存器,并且都是8位寄存器,而部分寄存器的每个位又用sbit进行了定义:

  [cpp] view plain copysfr P0 = 0x80;

  sfr P1 = 0x90;

  sfr P2 = 0xA0;

  sfr P3 = 0xB0;

  sfr PSW = 0xD0;

  sfr ACC = 0xE0;

  sfr B = 0xF0;

  sfr SP = 0x81;

  sfr DPL = 0x82;

  sfr DPH = 0x83;

  sfr PCON = 0x87;

  sfr TCON = 0x88;

  sfr TMOD = 0x89;

  sfr TL0 = 0x8A;

  sfr TL1 = 0x8B;

  sfr TH0 = 0x8C;

  sfr TH1 = 0x8D;

  sfr IE = 0xA8;

  sfr IP = 0xB8;

  sfr SCON = 0x98;

  sfr SBUF = 0x99;

  sfr是定义一个8位的寄存器,sbit是定义位寄存器,个人认为可以把这种定义理解为定义一个常量指针始终指向0x80这个特殊寄存器,即如下定义方法;

  [cpp] view plain copyconst unsigned char *PP = 0x80;

  当然,这种定义方法不完全符合上面的说法,而且*PP被限制了写 *** 作的,即PP所指向的地址被认定为常量,而PP任然是个变量,事实上除了使用sfr和sbit进行定义外,其他定义方式被认为是不安全的而被限制了写入 *** 作。最后发现定义指针的时候只有定义数组时:

  [cpp] view plain copychar a[];

  地址指针a才是一个常量指针,而其他指针都是变量;

  单片机sfr和sbit的区别

  1.bit和sbit都是C51扩展的变量类型。 bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。 sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行 *** 作的。

  2.bit位标量 bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/dianzi/2717408.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-08-17
下一篇2022-08-17

发表评论

登录后才能评论

评论列表(0条)

    保存