在开端讲对C51单片机中特别寄存器(SPR)的界说前,先简略介绍下咱们在进行51单片机开发时常常看到的两个关键字”sbit”和”sfr“:
sfr用于将一个单片机的特别功用寄存器(specialfunctionregister)赋值给一个变量,这样在后边的程序中就可以中这个变量指引(referto)该寄存器
sbit与sfr用法相似,仅仅sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后边程序就可用经过该变量为该位清0或置1。
接着咱们以STC系列的51单片机为例简略的了解下单片机的特别功用寄存器布局,如下:
MCS-51单片机中,除了程序计数器PC和4组作业寄存器组外,其它一切的寄存器均为特别功用寄存器(SPR),涣散在片内RAM区的高128字节中,地址规模为80H~0FFH。SFR中有11个寄存器具有位寻址才能,它们的字节地址都能被8整除,即字节地址是以8或0为尾数的。
为了能直接拜访这些SPR,FranklinC51供给了一种自主方法的界说办法,这种界说办法与规范C言语不兼容,只合适与对MCS-51系列单片机进行C言语编程,特别的能寄存器C51界说的一般语法格局如下:
sfrsfr-name=intconstant;
“sfr”是界说查办的关键字,这以后有必要跟一个MSC-51单片机实在存在的特别功用寄存器名,“=”后边有必要是一个整型常数,不允许带有运算符的表达式,是特别功用寄存器“sfr-name”的字节地址,这个常数值的规模有必要在SFR地址规模内,坐落0x80~0xFF。
例如:
sfrSCON=0x98; /* 串口操控寄存在器地址98H*/
sfrTMOD=0x89; /*定时器/计数器方法操控寄存器地址89H*/
MCS-51系列单片机的特别功用寄存器的数量与类型不尽相同,因而主张将一切特别的“sfr”界说放入一个头文件中,该文件应包含MCS-51单片机系列机型中的SFR界说。C51编译器的“reg51.h”头文件是这样一个文件。
在新的MCS-51系列产品中,SFR在功用上常常组合为16位值,当SFR的高字节地址直接坐落低字节之后时,对16位SFR的值可以直接进行拜访。例如52子系列的定时器/计数器2便是这种状况。为了有效地拜访这类SFR,可运用关键字“sfr16”来界说,其界说查办的语法格局与8位SFR相同,仅仅“=”后边的地址有必要用16坐落的SFR的低字节地址,即低字节地址作为“sfr16”的界说地址。例如:
sfr16T2=0xCC/*定时器/计数器2;T2低8位地址为0CCH,T2高8位地址为0CDH*/
这种界说适用于一切的新的16位SFR,但不能用于定时器/计数器0和1。
关于位寻址的SFR中的位,C51的扩大功用支撑特别位的界说,像SFR相同不与规范C兼容,运用“sbit” 来界说位寻址单元。
界说查办的一般语法格局有如下三种:
第一种格局:sbitbit-name=sfr-name^intconstant ;
“sbit”是界说查办的关键字,后跟一个寻址位符号名(该位符号名有必要是MCS-51单片机中规则的位称号),“=”后的“sfr=name”中的位号,有必要是0~7规模中的数。例如:
sfrPSW=0Xd0; /*界说PSW予寄存器地址为D0H*/
sfrOV=PSW^2; /*界说OV位为PSW.2,地址为D2H/*
sfrCY=PSW^7; /*界说CY位为PSW.7 地址为D7H^*/
第二种格局:sbitbit-name=intconstant^intconstant;
“=”后的intconstant为寻址地址们地点的特别功用寄存器的字节地址,“^” 符号后的intconstant为寻址位在特别功用寄存器中的位号。例如:
sbitOV=0Xd0^2; /*界说OV位地址是D0H字节中的第2位*/
sbitCY=0XD0^7; /*界说CY位地址是D0H字节中的第7位*/
第三种格局:sbitbit-name=intconstant;
“=”后的intconstant为寻址位的肯定地址。例如:
sbitOV=0XD2; /*界说OV位地址为D2H*/
sbitOY=0XD7; /*界说CY位地址为D7H*/
特别功用位代表了一个独立的界说类,不能与其它位界说和位域交换。
了解完了关于特别功用寄存器的界说,有人又会发生疑问:
咱们用sfrP0=0×80一共P0,用sfrSP=0×81一共SP,这个没有歧义。但有疑问的是:假如用sbitP0_1=0×81一共P0口的第一位,那么我想一共SP寄存器的第0位怎么办呢?假如也是界说成sbitSP_0=0×81那么显着会有二义性,编译器了解不了。其实这个问题是不存在的,从图1中可以看出,SPR又可以分为两个区域:可位寻址区和不行位寻址区。可位寻址区的寄存器地址可以被8整除,而不行位寻址区的寄存器地址不满足这一要求。因而比如中的sbitSP_0=0×81关于SP寄存器这是无效的应该写成sfrSP=0x81。