使用C語言訪問51微控制器中儲存器
阿新 • • 發佈:2022-01-16
使用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
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。