这些日子做项目,用到外部ram扩展,很是汗颜,很多基本知识点都不会,现在把不会的东西记下来,做个笔记,也和大家共享,学点知识,更好开发产品。

1.单片机中的关键字_at_:定义变量的存储地址。

2.这段程序是什么意思?

 
  
  1. #define XBYTE((char*)0x20000L) 
  2. XBYTE[0x8000]=0x41; 

        define XBYTE ((char*)0x20000L) 定义了XBYTE是个指向地址 0x0000L 的字符型指针(或者数组)变量XBYTE[0x8000]=0x41; 对数组XBYTE的第 0x8000个变量进行赋值,赋值为0x41。即对地址0x8000L的内存单元赋值为0x41。这说明你用的是带外部数据总线的51芯片,外部的存储器多半是RAMRAM的容量至少有 0x800032k)字节-RAM的容量可能是64k字节?L代表 long,这说明 0x20000L 是一个长整数。一般来说,8位单片机如51,整数用16位二进制表示,长整数用32位二进制表示.0x20000L当中的2是存储器类型xdata,而不是地址的一部分.

3.51单片机的存储类型:

    data--->可寻址片内ram
    bdata--->
可位寻址的片内ram
   idata--->
可寻址片内ram,允许访问全部内部ram
   pdata--->
分页寻址片外ram (MOVX @R0) (256 BYTE/)
   xdata--->
可寻址片外ram (64k 地址范围)
   code--->程序存储区 (64k 地址范围),对应MOVC @DPTR 

4.absacc.h

 
  
  1. /*-------------------------------------------------------------------------- 
  2. ABSACC.H 
  3.  
  4. Direct access to 8051, extended 8051 and Philips 80C51MX memory areas. 
  5. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. 
  6. All rights reserved. 
  7. --------------------------------------------------------------------------*/ 
  8.  
  9. #ifndef __ABSACC_H__ 
  10. #define __ABSACC_H__ 
  11.  
  12. #define CBYTE ((unsigned char volatile code  *) 0) 
  13. #define DBYTE ((unsigned char volatile data  *) 0) 
  14. #define PBYTE ((unsigned char volatile pdata *) 0) 
  15. #define XBYTE ((unsigned char volatile xdata *) 0) 
  16.  
  17. #define CWORD ((unsigned int volatile code  *) 0) 
  18. #define DWORD ((unsigned int volatile data  *) 0) 
  19. #define PWORD ((unsigned int volatile pdata *) 0) 
  20. #define XWORD ((unsigned int volatile xdata *) 0) 
  21.  
  22.  
  23. #ifdef __CX51__ 
  24. #define FVAR(object, addr)   (*((object volatile far *) (addr))) 
  25. #define FARRAY(object, base) ((object volatile far *) (base)) 
  26. #define FCVAR(object, addr)   (*((object const far *) (addr))) 
  27. #define FCARRAY(object, base) ((object const far *) (base)) 
  28. #else 
  29. #define FVAR(object, addr)    (*((object volatile far *) ((addr)+0x10000L))) 
  30. #define FCVAR(object, addr)   (*((object const far *) ((addr)+0x810000L))) 
  31. #define FARRAY(object, base)  ((object volatile far *) ((base)+0x10000L)) 
  32. #define FCARRAY(object, base) ((object const far *) ((base)+0x810000L)) 
  33. #endif 
  34.  
  35. #endif 

 

例如:
rval=CBYTE[0x0002];指向程序存贮器的0002h地址
rval=XWORD [0x0002];指向外RAM的0004h地址 //WORD是一个字,两个字节,故为0004h

#define COM8255 XBYTE[0X060FF] //后面若出现COM8255,则单片机端口P0和P2联合输出0X060FF绝对物理地址(地址指向82C55指令寄存器)
#define PA8255 XBYTE[0X000FF] //后面若出现PA8255,则单片机端口P0和P2联合输出0X000FF绝对物理地址(地址指向82C55的A组端口寄存器)
#define PB8255 XBYTE[0X020FF] //后面若出现PB8255,则单片机端口P0和P2联合输出0X020FF绝对物理地址(地址指向82C55的B组端口寄存器)
#define PC8255 XBYTE[0X040FF] //后面若出现PC8255,则单片机端口P0和P2联合输出0X040FF绝对物理地址(地址指向82C55的C组端口寄存器)

4.驱动外部ram的例程

 
  
  1. /************************************************************************** 
  2. *程序名称: 51单片机片外扩展RAM测试 
  3. *程序功能: 把数据写入片外RAM,再从片外RAM读取数据,点亮P1口的8个LED 
  4. *开发工具:WSF-51DB开发板 
  5. * MCU型号:AT89S52-24PU 
  6. *时钟频率:12MHZ 
  7. *程序作者: 吴师傅 
  8. *版权说明:吴师傅版权所有,转载请注明来源地址和作者。 
  9. **************************************************************************/ 
  10. #include<reg52.h> 
  11. #include <ABSACC.h>//包含片外存储空间绝对地址访问函数:XBYTE[] 
  12. sbit oe=P2^7;//片外RAM芯片片选和地址锁存器74HC573使能 
  13. unsigned char code ramdata[100]= //定义100个数据 
  14.      0,1,2,3,4,5,6,7,8,9, 
  15.         10,11,12,13,14,15,16,17,18,19, 
  16.         20,21,22,23,24,25,26,27,28,29, 
  17.         30,31,32,33,34,35,36,37,38,39, 
  18.         40,41,42,43,44,45,46,47,48,49, 
  19.         50,51,52,53,54,55,56,57,58,59, 
  20.         60,61,62,63,64,65,66,67,68,69, 
  21.         70,71,72,73,74,75,76,77,78,79, 
  22.         80,81,82,83,84,85,86,87,88,89, 
  23.         90,91,92,93,94,95,96,97,98,99 
  24. }; 
  25. //延时ms函数: 
  26. void Delayms(unsigned int t) 
  27.           unsigned int i,j; 
  28.           for(i=t;i>0;i--) 
  29.                    for(j=120;j>0;j--); 
  30.   
  31. //主函数: 
  32. int main(void) 
  33.          unsigned char i; 
  34.          oe=0;//使能RAM芯片片选和地址锁存器 
  35.          for(i=0;i<100;i++) 
  36.                      XBYTE[300+i]=ramdata[i]; 
  37. //将100个数据写入片外RAM,起始地址为:300 
  38.          while(1) 
  39.          { 
  40.                 for(i=0;i<100;i++) 
  41.                 { 
  42.                        P1=XBYTE[300+i];//从片外RAM读取数据,点亮P1口的8个LED 
  43.                        Delayms(500); 
  44.                 } 
  45.           } 
  46.           return 0; 
  47.