8051記憶體型別

2021-04-21 02:45:35 字數 2808 閱讀 4510

片內ram分布:

00h~1fh:4組通用暫存器區,每組8個通用暫存器。00h~07h,08h~0fh,10h~17h,18h~1fh

可位定址區:20h~2fh的16位元組單元,共128位

使用者ram區:30h~7fh

儲存模式:

small:所有預設變數引數均裝入內部ram,與data指定儲存型別方式一樣

compact:所有預設變數均位於外部ram區的一頁(256b)內,與pdata指定儲存方式一樣

large:所有預設變數可放在64kb的外部ram區,與xdata指定的儲存方式一樣

8051 特有的記憶體型態

data    可以直接訪問的片內資料儲存區(128位元組)

bdata    可以位定址(bit addressable)的片內儲存區,允許位與位元組混合訪問(16位元組)

idata    以 mov @rn 訪問的片內資料儲存區(256位元組)

pdata    以 movx @rn 訪問的外部資料儲存區,分頁定址,(256位元組)

xdata    以 movx @dptr 訪問的外部資料儲存區(64kb)

code    以 movc @a+dptr 讀取的程式記憶體,程式**儲存區(64kb)

特殊資料型態

bit    一般位(bit)變數,不能定義位指標和位陣列,處理1位資料並分配在saddr儲存區

sbit    絕對定址的位(bit)變數,可用於訪問晶元內部的ram中的可定址位或特殊功能暫存器中的可定址位

語法sbit    my_flag    =    location;    (location 範圍從 0x00 ~ 0x7f)

範例sbit    ea =         0xaf;

或是配合 bdata 宣告的位(bit)變數

char    bdata        my_flags;

sbit    flag0 =              my_flags ^ 0;

(注意 sbit 前不可以加 static)

sfr    特殊功能暫存器(special function register),占用乙個記憶體單元,值域0~255。位址範圍:80h~0ffh

語法sfr    my_sfr    =    location;    (location 範圍從 0x80 ~ 0xff)

範例sfr    p0    =    0x80;

sfr16 位特殊功能暫存器,占用二個記憶體單元,值域0~65535,用於操作佔兩個位元組的暫存器,如t0和t1

指定絕對位址的變數

在單一模組內可以使用下面的語法宣告

[memory_space]    type    variable_name    _at_    location

範例pdata        char    my_pdata    _at_    0x80;

如果該變數必須為多個模組所使用(global variable)則以

抽象指標(abstract pointer)的方式在標頭檔(header file)定義較為方便。

#define    variable_name    *((data_type *)        location)

範例#define    my_pdata    *((char pdata *)    0x80)

(注意 char 與 pdata 的順序)

absacc.h 提供了下列方便的巨集(macro)定義。

#define cbyte ((unsigned char volatile code *) 0)

#define dbyte ((unsigned char volatile data *) 0)

#define pbyte ((unsigned char volatile pdata *) 0)

#define xbyte ((unsigned char volatile xdata *) 0)

#define cword ((unsigned int volatile code *) 0)

#define dword ((unsigned int volatile data *) 0)

#define pword ((unsigned int volatile pdata *) 0)

#define xword ((unsigned int volatile xdata *) 0)

隱藏的初始化程式

80c51 在電源重置後(power on reset)所執行的第乙個程式模組並不是使用者的主程式

main(),而是乙個隱藏在 keil-c51 標準鏈結庫中稱為 startup.a51 的程式模組。

startup.a51 的主要工作是把包含 idata、xdata、pdata 在內的記憶體區塊清除為 0,並

且初始化遞迴指標。接著 startup.a51 被執行的仍然是乙個隱藏在 keil-c51 標準鏈結庫

中稱為 init.a51 的程式模組。而 init.a51 的主要工作則是初始化具有非零初始值設定的

變數。

在完成上述的初始化程式之後,80c51 的控制權才會交給 main() 開始執行使用者的程式。

#define xbyte ((unsigned char volatile xdata *) 0)

定義    xbyte 為 指向 xdata 位址空間unsigned char 資料型別的指標,指標值為0

這樣,可以直接用xbyte[0xnnnn]或*(xbyte+0xnnnn)訪問外部ram了

如 xbyte[0x1234] = 0x56; 

則等價於 

mov dptr,#1234h 

mov @dptr,#56h

8051硬體結構

8051的片內主要包含以下的資源 1個8位的cpu 8位是指它一次性可進行8位資料的操作 4kb的內部rom 在8051中,程式和一些 資料是存放在rom之中的,我們又把rom稱為程式儲存器 128b的內部ram 在8051中,資料是存放在ram之中的,我們又把ram稱為資料儲存器 4個8位的i o...

8051定時器應用

8051系列微控制器中的定時器如何用來測量外部脈衝的週期。有看到過相關資料談及使用定時器來測量外部脈衝的週期,但不夠詳細,這次在試驗的過程中遇到乙個類似的問題,在教科書上只是簡單提及,究竟怎麼樣使用,沒有詳細說明,使用方法也不難,要使用定時器來測量外部脈衝的週期,首先對定時器初始化,方式選擇依據你的...

8051引腳說明

一 i o埠 8051共有4 i o埠,為p0,p1,p2,p3 4個i o口都是雙向的,且每個口都具有鎖存器。每個埠有8條線,共計32條i o線。p0.0 p0.7 p1.0 p1.7 p2.0 p2.7 p3.0 p3.7 1.p0 有三個功能 1 外部擴充儲存器時,作資料匯流排 d0 d7 2...