打印
[应用方案]

c51编程中sbit sfr 用法

[复制链接]
4589|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pentruman|  楼主 | 2024-6-19 06:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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中。

使用特权

评论回复
沙发
chenci2013| | 2024-7-4 19:58 | 只看该作者

在C51单片机编程中,sfr 和 sbit 是两个非常重要的关键字,它们用于直接访问单片机的特殊功能寄存器(SFR)和寄存器中的位。

使用特权

评论回复
板凳
cemaj| | 2024-7-4 21:28 | 只看该作者
使用sbit定义的位只能是对I/O端口的一位进行操作,而sfr定义的是整个特殊功能寄存器。
在使用sbit和sfr时,需要了解单片机的数据手册,以知道每个寄存器的地址和位定义。

使用特权

评论回复
地板
chenci2013| | 2024-7-4 22:12 | 只看该作者
在进行位操作时,使用sbit比直接操作sfr中的位要方便得多,因为它允许你直接通过变量名来访问和操作特定的位。

使用特权

评论回复
5
olivem55arlowe| | 2024-7-7 13:52 | 只看该作者
#include <reg51.h> // 包含预定义的SFR和sbit的头文件

// 自定义sfr和sbit
sfr P1 = 0x90;
sbit P1_0 = P1^0;
sbit P1_7 = P1^7;

void main() {
    // 设置P1.0为高电平,P1.7为低电平
    P1_0 = 1;
    P1_7 = 0;

    while(1) {
        // 主循环中可以添加其他代码
    }
}

使用特权

评论回复
6
juliestephen| | 2024-7-7 14:06 | 只看该作者
只有在需要访问不常用的SFR或特定配置时,才需要自己定义。

使用特权

评论回复
7
sheflynn| | 2024-7-7 14:18 | 只看该作者
实际编程时,通常不需要手动定义SFR和sbit

使用特权

评论回复
8
phoenixwhite| | 2024-7-7 14:30 | 只看该作者
在C51编程中,sbit 和 sfr 是两个关键字,用于定义特殊功能寄存器(Special Function Registers, SFRs)和它们的位。这些关键字是Keil C51编译器的一部分,用于访问8051系列单片机的硬件资源。

使用特权

评论回复
9
vivilyly| | 2024-7-7 14:42 | 只看该作者
sbit和sfr都是C语言的扩展关键字,仅在Keil等特定的编译器中有效。

使用特权

评论回复
10
macpherson| | 2024-7-7 14:56 | 只看该作者
使用sbit定义的位可以直接在程序中作为布尔变量使用,可以对其赋值如P1_0 = 0;或者P1_0 = 1;,也可以使用位运算符对其进行操作,如P1_0 |= 0x01;将P1.0置为高电平。

使用特权

评论回复
11
lzmm| | 2024-7-7 15:10 | 只看该作者
sfr和sbit都是Keil C(或其他针对8051的C编译器)的扩展,它们不是标准C语言的一部分。

使用特权

评论回复
12
pl202| | 2024-7-7 15:23 | 只看该作者
sbit关键字:用于在C语言中指定一个特定的I/O端口或者特定的位。它允许你像访问变量一样访问I/O端口的一位。

使用特权

评论回复
13
mmbs| | 2024-7-7 15:37 | 只看该作者
在C51编程中,sfr和sbit是两个非常重要的关键字,它们专门用于访问和操作单片机的特殊功能寄存器及其位。

使用特权

评论回复
14
chenci2013| | 2024-7-10 01:26 | 只看该作者
sfr 关键字用于定义一个特殊功能寄存器(SFR),允许程序员直接通过变量名访问该寄存器。

使用特权

评论回复
15
juliestephen| | 2024-7-10 01:40 | 只看该作者
使用sfr和sbit可以提高代码的可读性和可维护性,特别是当你需要频繁访问和操作微控制器的硬件时。

使用特权

评论回复
16
saservice| | 2024-7-10 01:53 | 只看该作者
sbit 关键字用于定义一个特殊功能寄存器中的单个位,使得可以直接通过变量名操作该位。

使用特权

评论回复
17
robincotton| | 2024-7-10 02:06 | 只看该作者
使用sfr定义的寄存器可以直接在程序中作为整型变量使用,可以对其赋值和读取。

使用特权

评论回复
18
bestwell| | 2024-7-13 08:59 | 只看该作者
sbit 关键字用于声明一个变量,这个变量直接对应到某个SFR中的某一位。这使得你可以直接通过变量名来访问和操作那个特定的位,而不需要通过整个SFR来进行。这对于控制GPIO口的单个引脚特别有用。

使用特权

评论回复
19
olivem55arlowe| | 2024-7-13 12:13 | 只看该作者
sfr关键字:用于在C语言中直接访问单片机的特殊功能寄存器。它用于访问那些不是I/O端口的寄存器。

使用特权

评论回复
20
claretttt| | 2024-7-13 14:38 | 只看该作者
它们是C51编程中不可或缺的工具,对于高效地编写嵌入式系统代码至关重要。

使用特权

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

本版积分规则

27

主题

1253

帖子

1

粉丝