MCS-51特殊功能暫存器(SPR)的C51定義 .
阿新 • • 發佈:2018-12-31
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”是定義語句的關鍵字
例如:
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 */
特殊功能位代表了一個獨立的定義類,不能與其它位定義和位域互換。