单片机 C语音开发 sbit使用方法··

发布者:RainbowGarden最新更新时间:2024-04-15 来源: elecfans关键字:单片机  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 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。

sfr P1 = 0x90; //定义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 = 0x90;
sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可
寻址位位于特殊功能寄存器中时可采用这种方法
(3) sbit 位变量名=字节地址^位位置
sbit P1_1 = 0x90 ^ 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 = 0x90; //因P1端口的寄存器是可位寻址的,所以我们可以定义
sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚
//同样我们可以用P1.1的地址去写,如sbit P1_1 = 0x91;
这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,我自己是一直用的。当然您也可以自己写自己的定义文件,用您认为好记的名字。


关键字:单片机  sbit 引用地址:单片机 C语音开发 sbit使用方法··

上一篇:C51中interrupt和using的用法——单片机
下一篇:51单片机编程在不同内存空间(data xdata bdata)定义变量的注意事项

推荐阅读最新更新时间:2024-11-01 18:42

第66节:单片机外部中断的基础
开场白: 外部中断是单片机非常重要的内部资源,应用很广,它是单片机的高速开关感应器输入接口,它可以检测脉冲输入,可以接收红外遥控器的输入信号,可以检测高速运转的车轮或者电机圆周运动的反馈信号,可以检测输液器里瞬间即逝的水滴信号,可以接收模拟串口的数据信息,等等。 这一节要教大家两个知识点: 第一个:外部中断的初始化代码和中断函数的基本程序模板。 第二个:当系统存在两种中断以上时,如何设置外部中断0为最高优先级,实现中断嵌套功能。 具体内容,请看源代码讲解。 (1)硬件平台: 基于朱兆祺51单片机学习板。用S1按键作为模拟外部中断0的下降沿脉冲输入。原来S1按键是直接连接到P0^0口的,因此必须通过跳线把P0^0口连接到单
[单片机]
基于数字PID和51单片机的温度控制系统
在工业生产过程中,温度是工业生产过程中常见的工艺参数之一,对温度控制的好坏直接影响产品的质量。及时准确地得到温度信息并对其进行适当的控制,在许多工业场合中都是重要的环节。对于不同生产情况和工艺要求下的温度控制,所采用的加热方式和控制方式均不同。本文介绍了一种基于89C52单片机的温度控制系统,本系统的任务是对温度进行实时监控与控制。它以温度传感器DSl820对温度进行测量、采样与转换,并将测量结果送给单片机;单片机将输人的温度值与内部指定单元的给定温度值进行比较,根据比较结果,通过一个执行机构(可控硅)对加热源(加热炉的温度)的开关状态进行控制。在控制环节中,本系统采用的是数字PID控制算法来实现上述功能。传统的PID控制电路结
[单片机]
基于数字PID和51<font color='red'>单片机</font>的温度控制系统
PIC单片机无符号BCD加法子程序
!--StartFragment-- ;******************* 无符号 BCD 加法 *************** ; ; This routine performs a 2 Digit Unsigned BCD Addition ; It is assumed that the two BCD numbers to be added are in ; locations Num_1 & Num_2. The result is the sum of Num_1+Num_2 ; and is stored in location Num_2 and the overflow carry is returne
[单片机]
基于单片机的线阵CCD实时检测系统的开发
摘要:分析了线阵CCD用于实时检测系统的特点和要求,介绍了一种基于AT89C2051单片机的线阵CCD实时检测系统的设计方案。本方案电路结构简单可靠,信号处理灵活检当,有一定的通用性和启发性。 关键词:CCD 单片机 驱动 检测系统 CCD(Charge Coupled Devices)电荷耦合器件应用系统的关键技术在于CCD驱动时序的产生和输出信号的采集与处理。目前驱动主要有直接数字电路驱动、EPROM驱动、专用IC驱动、复杂的CPLD驱动等常用的驱动方法,但是它们存在着逻辑设计较为复杂、调试困难、柔性较差等缺点。在数据采集和处理方面,大多数都经过差动放大、采样保持、A/D转换,再通过总线或采集卡等接口与PC机相连。这种系
[单片机]
自己用C语言写单片机PIC16 serial bootloader
  为什么自己写bootloader   我的第一款自己的serial bootloader是为Microchip PIC16单片机写的UART bootloader,我命其名为HyperBootloader_PIC16. 为什么取这个名字,下面会讲。很多朋友可能会问为什么要自己写bootloader, 百度上一搜,有不少下载下来直接就可以用。比如ds30_Loader 就很不错,免费,还支持Microchip很多系列的单片机。是没错,但是网上搜到的bootloader用C语言写的少得可怜,或者不能用,或者不是用XC8编译的(Microchip 的C编译器)。它们绝大多数都是用汇编写的,包括ds30_Loader。对于不怎么用汇编
[单片机]
自己用<font color='red'>C</font>语言写<font color='red'>单片机</font>PIC16 serial bootloader
51单片机的中断控制
51系列单片机有5个中断源,2个优先级,可以实现二级中断服务嵌套结构。 现在很多兼容51的单片机已经有4个优先级(或更多)和更多的中断源了。 --------------------- 想要研究中断的嵌套,应该从中断优先级入手。 一些资料中,把有关中断优先级的中断响应原则,写成如下三条: 1、CPU同时接收到几个中断申请时,首先响应优先级级别最高的中断请求; 2、正在进行的中断过程不能被新的同级或低优先级的中断请求所中断; 3、正在进行的低优先级中断过程,能被高优先级中断请求所中断。 中断优先级的设置,是在IP寄存器中进行,IP称为中断优先级控制寄存器。 把IP中的某位置为1,则相应的中断源为高优先级;为0,则为低优先级。 当把5
[单片机]
Proteus单片机仿真LCD1602小示例
原文地址: Proteus单片机仿真LCD1602小示例 作者: 乐 乐 #include reg52.h #define uchar unsigned char #define uint unsigned int uchar code table = CHINA ! ;//第一行显示字符串 uchar code table1 = SHANGHAI yaohua ;//第二行显示字符串 sbit lcden=P3^4; sbit lcdrs=P3^5; uchar num; void delay(uint u) { uint x,y; for(x=u;x 0;x--) for(y=200;
[单片机]
使用MCU GD32替代STM32的体会
GD32作为国产MCU里的佼佼者,产品线也比较丰富,是替代STM32的一个很好的选择。前段时间有个项目用到GD32的单片机,今天来说说使用的一些体会。 1.硬件我用的单片机型号为GD32F405RGT6,对应STM32F405RGT6。首先,硬件上基本兼容,有一点不同的是GD32的31和47脚为NC,STM32的为VCAP。STM32这两个引脚需要分别连接一个电容到GND,而GD32则不需要。当然,有这两个电容也无所谓,所以,硬件上GD32可以直接替换STM32。 仿真器可以使用Jlink,也可以使用STLink,但是下载程序时会弹框提示,非ST芯片。 2.软件软件上,前期
[单片机]
使用<font color='red'>MCU</font> GD32替代STM32的体会
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved