1. 程式人生 > >特殊功能暫存器SFR

特殊功能暫存器SFR

                                                                特殊功能暫存器sfr

      sfr也是一種擴充資料型別,點用一個記憶體單元,值域為0~255。 

     利用它可以訪問51微控制器內部的所有特殊功能暫存器。(sfr 是定義8 位的特殊功能暫存器而sfr16 則是用來定義16 位特殊功能暫存器)

(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
sbit ib7=ib^7 //用關鍵字sbit 定義位變數來獨立訪問可定址位物件的其中一位
int bdata ab[2]; //在可位定址區定義陣列ab[2],這些也稱為可定址位物件
sbit ab12=ab[1]^12;

操作符"^"後面的位位置的最大值取決於指定的基址型別,char0-7,int0-15,long0-31.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

sfr 並標準C 語言的關鍵字,而是Keil 為能直接訪問80C51 中的SFR 而提供了一個新的關鍵詞,其用法是:

   sfrt 變數名=地址值。 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

二.符號P1_0 來表示P1.0 引腳。

在C 語言裡,如果直接寫P1.0,C 編譯器並不能識別,而且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 引腳.

 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

3).sbit可錄址位

sbit同位是C51中的一種擴充資料型別,利用它可以訪問晶片內部的RAM中的可定址位或特殊功能暫存器中的可定址位。如先前我們定義了

sfr P1 = 0x90; //因P1埠的暫存器是可位定址的,所以我們可以定義

sbit P1_1 = P1^1; //P1_1為P1中的P1.1引腳

//同樣我們可以用P1.1的地址去寫,如sbit P1_1 = 0x91;

MCS-51微控制器的特殊功能暫存器
符號 地址 功能介紹
B F0H B暫存器
ACC E0H 累加器
PSW D0H 程式狀態字
TH2* CDH 定時器/計數器2(高8位)
TL2* CCH 定時器/計數器2(低8位)
RLDH* CBH 外部輸入(P1.1)計數器/自動再裝入模式時初值暫存器高八位
RLDL* CAH 外部輸入(P1.1)計數器/自動再裝入模式時初值暫存器低八位
T2CON* C8H T2定時器/計數器控制暫存器
IP B8H 中斷優先順序控制暫存器
P3 B0H P3口鎖存器
IE A8H 中斷允許控制暫存器
P2 A0H P2口鎖存器
SBUF 99H 序列口鎖存器
SCON 98H 序列口控制暫存器
P1 90H P1口鎖存器
TH1 8DH 定時器/計數器1(高8位)
TH0 8CH 定時器/計數器0(高8位)
TL1 8BH 定時器/計數器1(低8位)
TL0 8AH 定時器/計數器0(低8位)
TMOD 89H T0、T1定時器/計數器方式控制暫存器
TCON 88H T0、T1定時器/計數器控制暫存器
DPH 83H 資料地址指標(高8位)
DPL 82H 資料地址指標(低8位)
SP 81H 堆疊指標
P0 80H P0口鎖存器
PCON 87H 電源控制暫存器


#include<reg51.h>  //包含51微控制器暫存器定義的標頭檔案
void main(void)
{
    P0=0xfe; //P0=1111 1110B,即P1.0輸出低電平  直接賦初值
	P0=0xfd;
	P0=0xff;
	P0=0x00;

}
 //51微控制器低電平有效
/////////////////////////////////////////////////////////////////////////////////////////////////

#include<reg51.h> //控制p0連續閃爍
void delay()   //延時
{
   unsigned int i;
   for(i=0;i<20000;i++);
}
void main()
{	  
   while(1)
   {
      P0=0xfe;
	  delay();
	  P0=0xff;
	  delay(); 
   }
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED=P0^0;
void DelayMS(uint x)
{
	uchar i;
	while(x--)
	{			 	
		for(i=0;i<120;i++);
	}			  
}
void main()
{	while(1)
	{
	 LED=~LED;
	DelayMS(150);  
	
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

#include<reg51.h>   //包含微控制器暫存器的標頭檔案
sfr x=0x80;   //P0口在儲存器中的地址是b0H, 通過sfr可定義8051核心微控制器
              //的所有內部8位特殊功能暫存器,對地址x的操作也就是對P1口的操作
			  //p1:90H
			  //p2:A0H
			  //P3:B0H
/****************************************
函式功能:延時一段時間
*****************************************/
void delay(void)
   {
	  unsigned char i,j;
	   for(i=0;i<250;i++)
		 for(j=0;j<250;j++)		 
		   ;   //利用迴圈等待若干機器週期,從而延時一段時間
	  }
/*****************************************
函式功能:主函式 
******************************************/
void main(void)
{
    while(1)
	  {

	  /////////////////////////////////
		    x=0xfe;   //第一個燈亮
		 	delay();  //呼叫延時函式
		 	 x=0xfd;  //第二個燈亮
		 	delay();  //呼叫延時函式
			 x=0xfb;  //第三個燈亮
		 	delay();  //呼叫延時函式
			 x=0xf7;  //第四個燈亮
		 	delay();  //呼叫延時函式

		  ////////////////////////////////////


			P0=0xef;   //第五個燈亮
	     	delay();  //呼叫延時函式
	     	P0=0xdf;   //第六個燈亮
	 	    delay();  //呼叫延時函式
			P0=0xbf;   //第七個燈亮
	     	delay();  //呼叫延時函式
			P0=0x7f;   //第八個燈亮
	     	delay();  //呼叫延時函式    
	}

 }
///////////////////////////////////////////////////////////////////////////////////////

函式功能:用整形資料延時一段時間
******************************************************/
void int_delay(void) //延時一段較長的時間
{
  unsigned int m;    //定義無符號整形變數,雙位元組資料,值域為0~65535
  for(m=0;m<36000;m++)
			 ;          //空操作      
}
/******************************************************
函式功能:用字元型資料延時一段時間
******************************************************/
void char_delay(void) //延時一段較短的時間
{
   unsigned char i,j;   //定義無符號字元型變數,單位元組資料,值域0~255
	for(i=0;i<200;i++)
	  for(j=0;j<180;j++)
			   ;        //空操作
}