使用C語言訪問51單片機中存儲器


使用C語言訪問51單片機中存儲器

1.頭文件

在Keil C51工程中 #include <absacc.h> ,可以直接使用CBYTE, XBYTE, DBYTE, PBYTE

absacc.h 的部分內容如下:

#ifndef __ABSACC_H__
#define __ABSACC_H__

#define CBYTE ((unsigned char volatile code  *) 0)
#define DBYTE ((unsigned char volatile data  *) 0)
#if !defined (__CX2__)
#define PBYTE ((unsigned char volatile pdata *) 0)
#endif
#define XBYTE ((unsigned char volatile xdata *) 0)

#define CWORD ((unsigned int volatile code  *) 0)
#define DWORD ((unsigned int volatile data  *) 0)
#if !defined (__CX2__)
#define PWORD ((unsigned int volatile pdata *) 0)
#endif
#define XWORD ((unsigned int volatile xdata *) 0)

code data pdata xdata 均為存儲器類型,下節將詳敘,此處用T替代:

unsigned char volatile T * 為指向存儲器T中無符號整型數的指針類型
((unsigned char volatile T * ) 0) 對0做強制類型轉換

2.code data pdata xdata

code data pdata xdata均為存儲器類型

  • code:用於存儲常數和函數,使用16位地址訪問,可位於片內或片外ROM
  • data:用於存儲變量,使用8位地址,位於片內RAM
  • pdata:用於存儲變量,使用8位地址,位於片外RAM
  • xdata:用於存儲變量,使用16位地址,位於片外RAM

3.CBYTE、DBYTE、PBYTE和XBYTE的區別

注意:以下存儲地址范圍均指理論上可訪問的最大范圍,具體操作時需根據存儲器大小調整
從存儲器類型的區別中可以得出本節四者的區別:

CBYTE

CBYTE 是用於訪問代碼存儲器的,即ROM部分。

rval = CBYTE[adress];    //訪問到代碼存儲器中的內容

其中代碼存儲器地址(adress)范圍是 0X0000--0xFFFF ,大小為16K。

DBYTE

DBYTE 是用於訪問片內數據存儲器的,即片內RAM部分,

DBYTE[adress] = 0XFB;   //寫數據
rval = DBYTE[adress];   //讀數據

其中片內存儲器地址(adress)范圍是 0x00--0xFF ,大小為256byte。

XBYTE

XBYTE 是用於訪問片外數據存儲器的,即片外RAM部分,但是XBYTE只能讀數據不能寫數據到片外RAM。

rval =XBYTE[adress]; //讀數據

片外數據存儲器的寫可以使用下面這條語句:

char  xdata  x1  _at_ 0x30 ;  //x1為char型全局變量,地址位於xdata區地址0x30 
x1  =  0x01; //給片外存儲器地址賦值

地址范圍為 0x0000--0xFFFF,大小為16K。

PBYTE

PBYTE也用來訪問擴展ram,但只能訪問開始的256字節。

4.CWORD、XWORD、DWORD和PWORD

上節所述四者為單字節訪問,對應雙字節訪問使用CWORD、DWORD、XWORD和PWORD。

5.參考

https://wenku.baidu.com/view/fe5a4b09f61fb7360a4c659c.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM