C51中訪問外部RAM的方法
XBYTE定義的是外部地址,這樣才能和接到你的IO口上的器件通信
在一般的讀寫外部RAM的程序中,經常看到這樣的句子:
訪問指令如你這里講51的MOVX指令(在C語言中他會編譯成這個指令)在執行這個指令的時候3組線是協調工作
mov dptr,#1000h
mov a,#55h
movx @dptr,a
上面3調語句的C語言可以表示如下
#define
W_DATA=0X55;
在使用外部總線的時候,數據 地址和控制信號是直接按照規定的時序輸出高低電平的,所以不用你管,當然你必須要滿足時序工作如何理解#define XBYTE ((unsigned char
volatile xdata * ))
8051 特有的內存型態
code
data
idata
bdata
xdata
pdata
特殊資料型態
bit
sbit
語法
sbit
范例
sbit
或是配合 bdata 宣告的位(bit)變量
char
sbit
(注意 sbit 前不可以加 static)
sfr
語法
sfr
范例
sfr
指定絕對地址的變量
在單一模塊內可以使用下面的語法宣告
[memory_space]
范例
pdata
如果該變量必須為多個模塊所使用(Global Variable)則以
抽象指針(Abstract Pointer)的方式在標頭檔(Header File)定義較為方便。
#define
范例
#define
(注意 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[0xnnnn]或*(XBYTE+0xnnnn)訪問外部RAM了
其中,初始地址就是0x0000;
百度知道:
#define XBYTE((char*)0x20000L)XBYTE[0x8000]=0x41;這段程序是什么意思?#define XBYTE ((char*)0x20000L) 定義了XBYTE是個指向地址 0x20000L 的字符型指針(或者數組)變量XBYTE[0x8000]=0x41; 對數組XBYTE的第 0x8000個變量進行賦值,賦值為0x41。即對地址0x28000L的內存單元賦值為0x41。這說明你用的是帶外部數據總線的51芯片,外部的存儲器多半是RAM,RAM的容量至少有 0x8000(32k)字節-RAM的容量可能是64k字節?如果還有問題,可以發消息聯系補充1:L代表 long,這說明 0x20000L 是一個長整數。一般來說,8位單片機如51,整數用16位二進制表示,長整數用32位二進制表示。
還有這樣用的:
寫這樣的一個頭文件

這樣的格式:
類型 儲存空間 定義別名 關鍵字_at_ 寄存器的地址
_at_這個關鍵字是絕對定義地址
評論