1.单片机中的关键字_at_:定义变量的存储地址。
2.这段程序是什么意思?
- #define XBYTE((char*)0x20000L)
- XBYTE[0x8000]=0x41;
define XBYTE ((char*)0x20000L) 定义了XBYTE是个指向地址 0x0000L 的字符型指针(或者数组)变量XBYTE[0x8000]=0x41; 对数组XBYTE的第 0x8000个变量进行赋值,赋值为0x41。即对地址0x8000L的内存单元赋值为0x41。这说明你用的是带外部数据总线的51芯片,外部的存储器多半是RAM,RAM的容量至少有 0x8000(32k)字节-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
- /*--------------------------------------------------------------------------
- ABSACC.H
- Direct access to 8051, extended 8051 and Philips 80C51MX memory areas.
- Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
- All rights reserved.
- --------------------------------------------------------------------------*/
- #ifndef __ABSACC_H__
- #define __ABSACC_H__
- #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)
- #ifdef __CX51__
- #define FVAR(object, addr) (*((object volatile far *) (addr)))
- #define FARRAY(object, base) ((object volatile far *) (base))
- #define FCVAR(object, addr) (*((object const far *) (addr)))
- #define FCARRAY(object, base) ((object const far *) (base))
- #else
- #define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L)))
- #define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L)))
- #define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L))
- #define FCARRAY(object, base) ((object const far *) ((base)+0x810000L))
- #endif
- #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的例程
- /**************************************************************************
- *程序名称: 51单片机片外扩展RAM测试
- *程序功能: 把数据写入片外RAM,再从片外RAM读取数据,点亮P1口的8个LED
- *开发工具:WSF-51DB开发板
- * MCU型号:AT89S52-24PU
- *时钟频率:12MHZ
- *程序作者: 吴师傅
- *版权说明:吴师傅版权所有,转载请注明来源地址和作者。
- **************************************************************************/
- #include
- #include //包含片外存储空间绝对地址访问函数:XBYTE[]
- sbit oe=P2^7;//片外RAM芯片片选和地址锁存器74HC573使能
- unsigned char code ramdata[100]= //定义100个数据
- {
- 0,1,2,3,4,5,6,7,8,9,
- 10,11,12,13,14,15,16,17,18,19,
- 20,21,22,23,24,25,26,27,28,29,
- 30,31,32,33,34,35,36,37,38,39,
- 40,41,42,43,44,45,46,47,48,49,
- 50,51,52,53,54,55,56,57,58,59,
- 60,61,62,63,64,65,66,67,68,69,
- 70,71,72,73,74,75,76,77,78,79,
- 80,81,82,83,84,85,86,87,88,89,
- 90,91,92,93,94,95,96,97,98,99
- };
- //延时ms函数:
- void Delayms(unsigned int t)
- {
- unsigned int i,j;
- for(i=t;i>0;i--)
- for(j=120;j>0;j--);
- }
- //主函数:
- int main(void)
- {
- unsigned char i;
- oe=0;//使能RAM芯片片选和地址锁存器
- for(i=0;i<100;i++)
- XBYTE[300+i]=ramdata[i];
- //将100个数据写入片外RAM,起始地址为:300
- while(1)
- {
- for(i=0;i<100;i++)
- {
- P1=XBYTE[300+i];//从片外RAM读取数据,点亮P1口的8个LED
- Delayms(500);
- }
- }
- return 0;
- }