sfr用于将一个单片机的特殊功能寄存器(special funcTIon register)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(refer to)该寄存器。

sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。

STC该系列单片机的特殊功能寄存器布局如下:

单片机sfr和sbit的用法

看过图1这么多特殊功能寄存器之后可能会产生一些困扰,我们用sfr P0 = 0×80表示P0,用sfr SP = 0×81表示SP,这个没有歧义。有困扰的是:假如用sbit P0_1 = 0×81表示P0口的第一位,那么我想表示SP寄存器的第0位怎么办呢?如果也是定义成sbit SP_0 = 0×81那么明显会有二义性,编译器理解不了。其实这个问题是不存在的,从图1中可以看出,SFR又可以分为两个区域:可位寻址区和不可位寻址区。可位寻址区的寄存器地址能够被8整除,而不可位寻址区的寄存器地址不满足这一要求。因此例子中的sbit SP_0 = 0×81对于SP寄存器这是无效的应该写成sfr SP=0x81。

例如:sbit P1^1=0x81;sfr SP=0x81;

它们虽然都引用了同一个地址0×81,但是对于编译器来说,这两者的含义完全不同,前者因为有sfr关键字,所以是字节地址。后者因为是sbit关键字,所以是位寻址,表示的是一个bit。

在单片机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才是一个常量指针,而其他指针都是变量;

1 首先区分bit 和sbit

bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。

sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。

sbit的用法有三种:

第一种方法:sbit 位变量名=地址值

第二种方法:sbit 位变量名=SFR名称^变量位地址值

第三种方法:sbit 位变量名=SFR地址值^变量位地址值

如定义PSW中的OV可以用以下三种方法:

sbit OV=0xd2 (1)说明:0xd2是OV的位地址值

sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好

sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值

因此这里用sfr P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了。

注意:"^"实质代表的是异或运算,可以算一下,恰好符合。

2.Sfr用法

sfr 似乎不是标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。

例:sfr P1 = 0x90;

这样的一行即定义P1 与地址0x90 对应,P1 口的地址就是0x90.

SFR的定义在头文件reg51.h或reg52.h中。

[Keil 帮助]

sfr Types
SFRs are declared in the same fashion as other C variables. The ONLY difference is that the data type specified is sfr rather than CHAR or int. For example:

sfr P0 = 0x80; /* Port-0, address 80h /
sfr P1 = 0x90; /
Port-1, address 90h /
sfr P2 = 0xA0; /
Port-2, address 0A0h /
sfr P3 = 0xB0; /
Port-3, address 0B0h */

P0, P1, P2, and P3 are the SFR NAME declarations. Names for sfr variables are defined just like other C variable declarations. Any symbolic NAMEmay be used in an sfr declaration.

The address specification after the equal sign (’=’) must be a numeric constant. Expressions with operators are not allowed. Classic 8051 devicesSUPPORT the SFR address range 0x80 to 0xFF. The PHILIPS 80C51MX provides an additional extended SFR space with the address range 0x180 to 0x1FF.

Note

sfr variables may not be declared inside a function. They must be declared outside of the function body.
COPYRIGHT © Keil SOFTWARE, Inc. and Keil Elektronik GmbH. All rights reserved.

sbit Types
With typical 8051 applications, it is often necessary to access individual bits within an SFR. The Cx51 Compiler makes this possible with the sbit data type which provides access to bit-addressable SFRs and other bit-addressable objects. For example:

sbit EA = 0xAF;

This declaration defines EA to be the SFR bit at address 0xAF. On the 8051, this is the enable all bit in the interrupt enable register.

Any symbolic NAME can be used in an sbit declaration. The expression to the right of the equal sign (’=’) specifies an absolute bit address for the symbolic NAME. There are three variants for specifying the address:

Variant 1
sbit NAME = sfr-NAME ^ bit-position;

The previously declared SFR (sfr-NAME) is the base address for the sbit. It must be evenly divisible by 8. The bit-position (which must be aNUMBER from 0-7) follows the carat symbol (’^’) and specifies the bit position to access. For example:

sfr PSW = 0xD0;
sfr IE = 0xA8;

sbit OV = PSW^2;
sbit CY = PSW^7;
sbit EA = IE^7;

Variant 2
sbit NAME = sfr-address ^ bit-position;

A CHARacter constant (sfr-address) specifies the base address for the sbit. It must be evenly divisible by 8. The bit-position (which must be aNUMBER from 0-7) follows the carat symbol (’^’) and specifies the bit position to access. For example:

sbit OV = 0xD0^2;
sbit CY = 0xD0^7;
sbit EA = 0xA8^7;

Variant 3
sbit NAME = sbit-address;

A CHARacter constant (sbit-address) specifies the address of the sbit. It must be a VALUE from 0x80-0xFF. For example:

sbit OV = 0xD2;
sbit CY = 0xD7;
sbit EA = 0xAF;

Note

Not all SFRs are bit-addressable. ONLY those SFRs whose address is evenly divisible by 8 are bit-addressable. The lower nibble of the SFR’s address must be 0 or 8. For example, SFRs at 0xA8 and 0xD0 are bit-addressable, whereas SFRs at 0xC7 and 0xEB are not. To calculate an SFR bit address, add the bit position to the SFR byte address. So, to access bit 6 in the SFR at 0xC8, the SFR bit address would be 0xCE (0xC8 + 6).
Special function bits represent an independent declaration class that may not be interchangeable with other bit declarations or bit fields.
The sbit data type declaration may be used to access individual bits of variables declared with the bdata MEMORY type specifier. REFER to Bit-addressable Objects for more information.
sbit variables may not be declared inside a function. They must be declared outside of the function body.
COPYRIGHT © Keil SOFTWARE, Inc. and Keil Elektronik GmbH. All rights reserved.
————————————————
版权声明:本文为CSDN博主「guzicheng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guzicheng/article/details/7242981

c51中sbit/sfr 用法相关推荐

  1. c语言编程单片机中的sbit,单片机sfr和sbit的用法

    描述 单片机sfr和sbit详解 sfr用于将一个单片机的特殊功能寄存器(special function register)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(refer to) ...

  2. 请写出sfr和sbit的语句格式_KEIL中的SFR和SBIT用法

    sfr 似乎不是标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值. 例:sfr P1 = 0x90; 这样的一行即定义 ...

  3. 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?

    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1  使用定时器/计数器实现精确延时 ...

  4. keil C51 中使用虚拟串口调试串口

    功能介绍: 在不使用51开发板下,使用keil C51中的软件仿真 和虚拟串口软件VSPD完成串口通信的过程. 类似的还有一篇关于STM32调试串口的 keil MDK 中使用虚拟串口调试串口 操作步 ...

  5. mysql中change用法,mysql 中alter的用法以及一些步骤

    mysql 中alter的用法以及一些方法 在用到alter的时间,查到了这个文章,就copy下来了,详细进入下面链接: MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名 ...

  6. mysql中正则表达式的用法_Mysql中正则表达式Regexp常见用法

    Mysql中Regexp常见用法 模糊匹配,包含特定字符串 # 查找content字段中包含"车友俱乐部"的记录 select * from club_content where ...

  7. 【C++】C/C++ 中 static 的用法全局变量与局部变量

    C/C++ 中 static 的用法全局变量与局部变量 目录 1. 什么是static? 1.1 static 的引入 1.2 静态数据的存储 2. 在 C/C++ 中static的作用 2.1 总的 ...

  8. php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?

    foreach的使用方法小编不是很明确,分享达人指教一下.foreach (array_expressforeach($array as $key) { if(xxxx) { break; //bre ...

  9. python中str的index什么意思_python中index的用法是什么

    index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如:>>> t=tuple('Allen') >>> t ('A', 'l', ...

最新文章

  1. textarea输入框限制字数(JS)
  2. Decorator 装饰器模式 -动态组合
  3. php 策略模式实现原理,php 策略模式原理与应用深入理解
  4. mkswap,swapon, swapoff命令:创建交换分区
  5. 计算机硬件系统的安全,维护硬件系统的计算机安全论文
  6. 华为Mate8刷低Android版本,华为mate8怎么刷机 华为mate8刷机方法【图文教程】
  7. 一加Ace外观设计理念揭晓:主推硬朗直线条力量感/速度感十足
  8. C语言输出百分号%的方法和示例
  9. mysql冷区域热区域_mysql的数据备份方式,及热备与冷备的优缺点对比
  10. php 0 n随机数,PHP n个不重复的随机数生成代码
  11. 关于typedef的使用
  12. 代数——近世代数知识点思维导图(附Visio原文件)
  13. word批量调整图片大小--宏
  14. Arduino使用433MHz RF射频发射器和接收器的方法
  15. 《禅者的初心》读书笔记(1)
  16. 【Java 8 新特性】Java Stream 通过min()和max()获取列表最小值和最大值
  17. 自著——30天自制计算机语言解释器 目录
  18. 8bit音乐的一些相关知识
  19. 杀戮尖塔用java也打不开_游戏进不去 打不开 求救
  20. 怎么裁剪视频?手把手教你裁剪

热门文章

  1. 蒙特卡洛-马尔科夫链(MCMC)初步
  2. c语言建立线性表输入,c语言 建立线性表 链式
  3. 设计一个Shape及其子类Oval
  4. 京东CPS商品推广接入流程
  5. 自监督的暗光图像增强
  6. 中国网络视频行业发展战略预测及未来发展趋势展望报告2021-2027年
  7. 签名不对,请检查签名是否与开放平台上填写的一致。
  8. == 和 ===区别
  9. 【iOS-cocos2d-X 游戏开发之二】【必看篇】总结阐述Cocos2d-X与Cocos2d-iphone区别;
  10. Hudson集成工具