历史上的今天
返回首页

历史上的今天

今天是:2025年03月18日(星期二)

正在发生

2019年03月18日 | 51单片机sfr sbit bit学习

2019-03-18 来源:eefocus

  C语言作为一门新型高级编程语言,在计算机软件编程中具有较为广泛的应用和实现。下面小编就跟你们详细介绍下c语言中bit的用法,希望对你们有用。

  c语言中bit的用法如下:

  c语言中bit和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。

  3.sfr特殊功能寄存器
  sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0×90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。

  sfr P1 = 0×90; //定义P1 I/O 口,其地址90H
  sfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表.

  sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,
  如8052 的T2 定时器,可以定义为:
  sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH
  用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物
  理低位地址之上.注意的是不能用于定时器0 和1 的定义.
  sbit 可定义可位寻址对象.如访问特殊功能寄存器中的某位.其实这样应用是经常要
  用的如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义:
  (1) sbit 位变量名=位地址
  sbit P1_1 = Ox91;
  这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于80H-FFH 之间.
  (2) sbit 位变量名=特殊功能寄存器名^位位置
  sft P1 = 0×90;
  sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可
  寻址位位于特殊功能寄存器中时可采用这种方法
  (3) sbit 位变量名=字节地址^位位置
  sbit P1_1 = 0×90 ^ 1;
  这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示. 在C51
  存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单
  片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:
  unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ib
  int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象
  sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位
  sbit ab12=ab[1]^12;
  操作符”^”后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31.
  sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新
  的关键词,其用法是:
  sfrt 变量名=地址值。
  2)符号P1_0 来表示P1.0 引脚。
  在C 语言里,如果直接写P1.0,C 编译器并不能识别,而且P1.0 也不是一个合法的C
  语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0 是不是就是P1.0呢?你这么认为,C 编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字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 一类的名字,只要下面程序中也随之更改就行了。
  *AT89C51的特殊功能寄存器表请看附录二
  4.sfr16 16位特殊功能寄存器
  sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,好定时器T0和T1。
  5.sbit可录址位
  sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了
  sfr P1 = 0×90; //因P1端口的寄存器是可位寻址的,所以我们可以定义
  sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚
  //同样我们可以用P1.1的地址去写,如sbit P1_1 = 0×91;
  这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,我自己是一直用的。当然您也可以自己写自己的定义文件,用您认为好记的名字。

推荐阅读

史海拾趣

Esterline Power Systems公司的发展小趣事

在质量管理方面,Esterline Power Systems始终坚持以客户为中心,追求卓越品质。公司引入了先进的质量管理体系,并通过了ISO 9001等国际标准认证。同时,公司还建立了严格的质量检测机制,确保每一件产品都符合高标准的质量要求。此外,公司还鼓励员工提出改进建议,通过持续改进来不断提升产品质量和客户满意度。

Delphi Connection Systems公司的发展小趣事

随着市场的不断发展,Delphi Connection Systems公司意识到单靠自身的力量难以在激烈的市场竞争中立足。于是,公司积极寻求与其他企业的战略合作,通过资源共享、优势互补,共同开拓市场。公司与一家知名的汽车制造商建立了战略合作关系,为其提供高质量的连接器产品,从而成功进入了汽车电子行业市场。

Anritsu公司的发展小趣事

Delphi Connection Systems公司深知产品质量是企业生存和发展的基石。因此,公司始终坚持严格的质量控制标准,从原材料采购到产品制造、检测等各个环节都进行严格把关。这种对质量的执着追求赢得了客户的信任和口碑,使公司在电子行业中树立了良好的品牌形象。

Eastron Corp公司的发展小趣事

Eastron Corp一直重视人才的培养和引进。公司建立了完善的人才培养和激励机制,鼓励员工不断学习和创新。同时,Eastron还积极引进国内外优秀人才,为公司的发展注入新的活力。正是凭借一支高素质、专业化的团队,Eastron在电子行业中不断取得新的突破。

Greenlee公司的发展小趣事

为了寻求新的增长点,GREEGOO公司开始尝试跨界合作。公司与一家知名汽车制造商达成合作协议,共同研发车载智能娱乐系统。通过整合双方在电子技术和汽车制造领域的优势资源,成功推出了多款具有创新性和竞争力的车载智能产品。这一跨界合作不仅为GREEGOO带来了新的业务增长点,还进一步提升了公司在电子行业中的影响力和地位。同时,也为公司未来的多元化发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,旨在模拟“GREEGOO”公司可能的发展路径和故事。在实际的电子行业中,不同公司的发展经历和故事各不相同。

Cooper Industries公司的发展小趣事

随着市场需求的不断变化,Cooper Industries不断通过收购来扩大其业务范围和提升技术实力。例如,在2008年,公司宣布收购了三家公司:Sure Power Industries、OMNEX Control Systems和Roam Secure。这三家公司在各自的领域都有着丰富的经验和卓越的技术,收购后极大地增强了Cooper在电力系统管理、无线电远程控制以及文字报警、区域警示系统等领域的能力。这些收购不仅使公司的产品线更加丰富,也为其在全球市场的竞争提供了有力武器。

问答坊 | AI 解惑

小弟冒死将老师的课件分给大家,课件分章节,大家按需下载.

小弟冒死将老师的课件分给大家,课件分章节,大家按需下载.…

查看全部问答>

项目团队中个别人员工作积极性不高,怎样解决?

项目成员工作不主动,处于混日子的状态。怎样解决员工工作积极性?…

查看全部问答>

EVC4 网络通信问题--操作超时

我在同时开多线程模拟多用户访问HTTP客户端下载上传数据时,CATCH到很多“操作超时”,但是使用单线程时没有这种错误,请问下这个是什么原因?如何解决。 我测试使用的是同步方式。 全部分数奉上,希望有个解决的办法,急~~~;…

查看全部问答>

为什么build不出sys文件?

有现成的例子,在Windows DDK 2600.1106的Build Environment下用build指令编译,只出来.res, .obj, .sbr文件,没看到.sys文件。 而Build并没有提示错误,最后一行信息是BUILD:Done 这是为什么啊? …

查看全部问答>

想用ST的PWM做DA,滤波怎么选参数好

我对DA的速度要求不高,10Hz以内就够了,但是纹波比较担心现在是PWM后运放怎么做滤波,高手给支个招,参数怎么选。…

查看全部问答>

意法半导体(ST)宣布2011年中国iNEMO™校园创意大赛获胜名单

    中国北京,2011年12月1日 —— 横跨多重电子应用领域、全球领先的半导体供应商及全球最大的消费电子和便携设备MEMS(微机电系统)供应商意法半导体[1](STMicroelectronics,简称ST;纽约证券交易所代码:STM)今天宣布清华大学的天 ...…

查看全部问答>

新手求助

我是新手,各位仁兄可有FPGA的程序编译器?…

查看全部问答>

给力

楼主好样的 加油  祝你顺利…

查看全部问答>

新手来报到。。求解惑,汇编的。。不知道断点是在哪里

ORG                 0000H                        LJMP        MAIN             ...…

查看全部问答>

identifier “ ” is undefined

以下是我整理的程序,想实现的功能是三个按键,一个是按一下增加10,一个是按一下减少10,最后个是复位到0。但是错误报告identifier “ key” is undefined,dentifier “ keys” is undefined. #include #include\"NOKIA_LCD_BSP.H\" #define&nb ...…

查看全部问答>