KeilC特殊功能寄存器和位定义.ppt
使用关键字sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,格式如下:sfr 定义的名字=特殊功能寄存器地址;Sfr16 定义的名字=特殊功能寄存器地址;例如:sfr P1=0 x90;/定义P1 I/O口,其地址90Hsfr关键字后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则。等号后面必须是地址常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80HFFH)。,一、sfr和sfr16的使用,在单片机的C语言程序设计中,可以通过关键字sfr来定义所有特殊功能寄存器,从而在程序中直接访问它们,例如:sfr P1=0 x90;/特殊功能寄存器P1的地址是90H对应P1口的8个I/O引脚在程序中就可以直接使用P1这个特殊功能寄存器了,如:P1=0 x00;/将P1口的8位I/O口全部清0C语言中,还可以通过关键字sbit来定义特殊功能寄存器中的可寻址位,如:sbit P1_0=P10;通常情况下,这些特殊功能寄存器已经在头文件reg51.h中定义了,只要在程序中包含了该头文件,就可以直接使用已定义的特殊功能寄存器。如果没有头文件reg51.h,或者该文件中只定义了部分特殊功能寄存器和位,用户也可以在程序中自行定义。,sfr16用来定义16位特殊功能寄存器,如8052的T2定时器,可以定义为:sfr16 T2=0 xCC;/这里定义8052定时器2,地址为T2L=CCH,T2H=CDH用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。?sfr16 占用两个内存单元,值域为 065535。sfr16 和 sfr 一样用于操作特殊功能寄存 器,所不一样的是它用于操作占两个字节的寄存器,如定时器 T0 和 T1。,二、sbit和bit的使用,51单片机的内部RAM中,20H2FH为位操作区域,20H的最低位为00H,2FH的最高位为7FH,位地址的范围是00H07FH,共16*8=128位,可以对每一位进行独立操作。特殊功能寄存器中,对于字节地址能被8整除的寄存器,也可进行位寻址的地址,其位地址从80H开始。特殊功能寄存器的地址和最低位的位地址相同,比如P0口的地址是80H,那么P0口的最低位的位地址也是80H,次低位是81H,最高位的地址是87H,所以P0口的口地址80H与最低位的位地址80H,在物理结构上是完全不同的。,1、bit和int char差不多,只不过char=8位,bit=1位。都是变量,编译器在编译过程中自动分配地址。除非你指定,否则这个地址是随机的。这个地址是位寻址区。bit只有0和1两种值2、sbit(静态地址位定义)是单片机c语言 中的一种扩充数据类型,利用它能访问芯片内部的 RAM 中的可寻址位(20H2FH)或特殊功能寄存器中的可寻址位。一旦用了sbit xxx=REGE6这样的定义,这个sbit变量就确定地址了。sbit大部分是用在专用寄存器中的,方便对寄存器的某位进行操作。3、bit位标量bit位标量同样是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。,sbit可定义位寻址对象,用sbit定义的位地址必须是专用寄存器,字节地址必须位于80H-FFH之间,方法如下:(1)sbit 位变量名位地址sbit P1_1=0 x91;是把位的绝对地址赋给位变量(2)sbit 位变量名特殊功能寄存器名位位置sft P1=0 x90;先定义一个特殊功能寄存器名sbit P1_1=P1 1;再指定位变量名所在的位置(3)sbit 位变量名字节地址位位置如:sbit P1_1=0 x90 1;(3)和(2)其实是一样的,只是把特殊功能寄存器的位址直接用常数表示。,在C51存储器类型中提供一个bdata的存储器类型,是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位寻址的数据定义为bdata,如:uchar bdata ib;/在位寻址区定义无符号字符变量ibsbit ib7=ib7/用关键字sbit定义位变量ib7Int bdata ab2;/在可位寻址区定义数组ab2 sbit ab12=ab112;/定义ab12为数组ab1中的第12位 操作符“”后面的位位置的最大值取决于指定的基址类型,char 0-7,int 0-15,long 0-31。,sfr P1=0 x90;/这里没有使用预定义文件,而是自己定义特殊寄存器。sbit P1_0=P1 0;sbit P1_1=0 x91;sbit P1_7=0 x90 7;/这里分别定义P1端口和P10,P11,P17引脚,之前我们使用的预定义文件其实就是这个作用。,