片內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...