特殊功能暫存器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++)
; //空操作
}