日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机C语言访问外ram,C51中访问外部RAM的方法

發布時間:2024/1/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机C语言访问外ram,C51中访问外部RAM的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C51的P0,P2口做外部擴展時使用,其中XBYTE [0x0002],P2口對應于地址高位,P0口對應于地址低位。一般P2口用于控制信號,P0口作為數據通道。

XBYTE定義的是外部地址,這樣才能和接到你的IO口上的器件通信

在一般的讀寫外部RAM的程序中,經常看到這樣的句子:本文引用地址:http://www.eepw.com.cn/article/201611/322578.htm

XBYTE[address]=data寫數據

data=XBYTE[address]讀數據1

外部總線由3組總線組成,數據 地址 控制,我們常常一般就叫他外部總線,既然是有3組不同的信號,那么他們是怎么協調工作的呢?一般情況CPU有特殊的外部數據

訪問指令如你這里講51的MOVX指令(在C語言中他會編譯成這個指令)在執行這個指令的時候3組線是協調工作

mov dptr,#1000h

mov a,#55h

movx @dptr,a

上面3調語句的C語言可以表示如下

#defineW_DATAXBYTE[0x1000]

W_DATA=0X55;

在使用外部總線的時候,數據 地址和控制信號是直接按照規定的時序輸出高低電平的,所以不用你管,當然你必須要滿足時序工作如何理解#define XBYTE ((unsigned char

volatile xdata * ))

8051 特有的內存型態

code以 MOVC @A+DPTR 讀取的程序內存

data可以直接存取的內部數據存儲器

idata以 Mov @Rn 存取的內部數據存儲器

bdata可以位尋址(Bit Addressable)的內部存儲器

xdata以 MOVX @DPTR 存取的外部數據存儲器

pdata以 MOVX @Rn 存取的外部數據存儲器

特殊資料型態

bit一般位(bit)變量

sbit絕對尋址的位(bit)變量

語法

sbitmy_flag=location;(location 范圍從 0x00 ~ 0x7F)

范例

sbitEA =0xAF;

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

charbdatamy_flags;

sbitflag0 =my_flags ^ 0;

(注意 sbit 前不可以加 static)

sfr特殊功能緩存器(Special Function Register)

語法

sfrmy_sfr=location;(location 范圍從 0x80 ~ 0xFF)

范例

sfrP0=0x80;

指定絕對地址的變量

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

[memory_space]typevariable_name_at_location

范例

pdatacharmy_pdata_at_0x80;

如果該變量必須為多個模塊所使用(Global Variable)則以

抽象指針(Abstract Pointer)的方式在標頭檔(Header File)定義較為方便。

#definevariable_name*((data_type *)location)

范例

#definemy_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了

其中,初始地址就是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_這個關鍵字是絕對定義地址

總結

以上是生活随笔為你收集整理的51单片机C语言访问外ram,C51中访问外部RAM的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。