1. 程式人生 > >MCS-51特殊功能暫存器(SPR)的C51定義 .

MCS-51特殊功能暫存器(SPR)的C51定義 .

   MCS - 51微控制器中,除了程式計數器PC和4組工作暫存器組外,其它所有的暫存器均為特殊功能暫存器(SPR),分散在片內RAM區的高128位元組中,地址範圍為80H~0FFH。SFR中有11個暫存器具有位定址能力,它們的位元組地址都能被8整除,即位元組地址是以8或0為尾數的。
        為了能直接訪問這些SPR,Franklin C51提供了一種自主形式的定義方法,這種定義方法與標準C語言不相容,只適合與對MCS-51系列微控制器進行C語言程式設計,特殊的能暫存器C51定義的一般語法格式如下:
        sfr  sfr-name =  int  constant;
        “sfr”是定義語句的關鍵字

,其後必須跟一個MSC - 51微控制器真實存在的特殊功能暫存器名,“=”後面必須是一個整型常數,不允許帶有運算子的表示式,是特殊功能暫存器“sfr-name”的位元組地址,這個常數值的範圍必須在SFR 地址範圍內,位於0x80~0x FF。
例如:
        sfr  SCON=0x98;    /* 串列埠控制寄存在器地址98H       */
        sfr  TMOD=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”的定義地址。例如:
        sfr16  T2=0xCC           /*   定時器/計數器2;T2低8位地址為0CC H,T2高8位地址為0CDH    */
         這種定義適用於所有的新的16位SFR,但不能用於定時器/計數器0和1。
        對於位定址的SFR中的位,C51的擴充功能支援特殊位的定義,像SFR一樣不與標準C相容,使用“ sbit” 來定義位定址單元。
        定義語句的一般語法格式有如下三種:
        第一種格式:sbit  bit-name=sfr-name^int constant ;

        “sbit”是定義語句的關鍵字,後跟一個定址位符號名(該位符號名必須是MCS-51微控制器中規定的位名稱),“=”後的“sfr=name”中的位號,必須是0~7範圍中的數。例如:
        sfr  PSW=0Xd0;   /*定義PSW予暫存器地址為D0H*/
        sfr  OV=PSW^2;   /*定義OV位為PSW.2,地址為D2H/ *
        sfr  CY=PSW^7;   /*定義CY位為PSW.7 地址為D7H^*/
        第二種格式:sbit  bit-name=int constant^int constant;
“=”後的 int constant為定址地址們所在的特殊功能暫存器的位元組地址,“^” 符號後的int constant為定址位在 特殊功能暫存器中的位號。例如:
        sbit  OV=0Xd0 ^2;    /*  定義OV位地址是D0 H位元組中的第2位  */
        sbit  CY=0XD0^7;    /*  定義C Y位地址是D0H位元組中的第7位  */
        第三種格式:sbit  bit-name=int constant;
“=”後的int constant為定址位的絕對地址。例如:
        sbit  OV=0XD2;    /*  定義OV位地址為D2H  */
        sbit  OY=0XD7;    /*  定義CY位地址為D7H  */
特殊功能位代表了一個獨立的定義類,不能與其它位定義和位域互換。