天天看點

51單片機資源擴充:擴充片外RAM

    ​​ 51單片機資源擴充:從片内ROM跳轉到片外ROM​​ 一文中擴充了單片機的程式存儲器,4KB存儲空間提升到64KB。其實,4K的代碼空間還湊合,但是51自帶的256B資料存儲空間使用起來還真緊張,其中留給使用者的連128B都不到,是以不得不擴充片外RAM。擴充RAM方法和擴充ROM差不多,都是占用P0/P2口做位址線,同時P0用鎖存器74373分時複用位址和資料信号。

    以前擴充RAM是用彙編語言通路存儲器,好處是定位精準,指哪打哪,壞處就是:程式規模一大就有點難維護了,是以還得改用C實作。

    對應于彙編語言用R1,R0/DPTR通路外部RAM,keil C擴充了存儲類型,增加了如pdata(等同用movx @Rn通路方式)/xdata(等同于movx @DPTR通路方式)存儲類型用于通路片外ram。同時,還提供了絕對位址通路的宏,如PBYTE/XBYTE,檢視定義:

#define PBYTE((unsigned char volatile pdata*)0);
#define XBYTE((unsigned char volatile xdata*)0);      

其實,也還是定義相應存儲類型的指針~。

上仿真圖和代碼前,整理一下keil c提供通路絕對位址的方法:

1._at_定義變量:

變量類型 [存儲類型] 變量名 _at_ 常數,指定變量存放在常數所指定的ram位置,注意bit型變量不能使用_at_指定位置;

2.絕對位址通路:

頭檔案absacc.h提供了絕對位址通路宏,用于位元組/字尋址,如

val=XBYTE[0x0000];讀片外ram 0x00處記憶體值 

XBYTE[0x0200]=val;寫片外ram 0x0200處記憶體值

擴充ram仿真圖:

51單片機資源擴充:擴充片外RAM

上段去年用彙編寫的通路ram的代碼:

ORG  0
SJMP  START
ORG  10H
START:
;1456是要通路的記憶體位址
MOV  DPTR,#1456H;
MOV  A,  #0FFH;
;0xFF移入[1456]
MOVX @DPTR,A;

CLR  A;
MOVX  A, @DPTR; 
;對外部RAM 1456H讀出資料到A
NOP
MOV  A, #0A0H;
INC  DPL
MOVX @DPTR,A; 
;将0xA0寫入外部RAM 1457H
NOP
;從外部RAM [1457]H讀出資料到A
MOVX  A, @DPTR; 
NOP
SJMP START
END      

c語言版本:

#include <reg51.h>
#include <absacc.h>

#define OFFRAMBASE 0x100

unsigned char xdata offRamVal0 _at_ OFFRAMBASE*2;
unsigned char xdata offRamVal1 _at_ 0x00;
int main()
{
  unsigned char idata index = 0;
  offRamVal0 = 0xAA;
  offRamVal1 = 0xCC;
  for(index=0;index<0x10;index++)
  {
    XBYTE[index+OFFRAMBASE] = 0x55; 
  }   
  return 0;
}      

最後看下程式運作後6264内部存儲的資料:

0000: <span style="color:#FF0000;">CC</span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0100:<span style="color:#FF0000;"> 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 | UUUUUUUUUUUUUUUU</span>
0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0120: 00 00 00 00 00 00 00 00 00 00 00
01E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
01F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0200: <span style="color:#FF0000;">AA</span> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................