C51的P0,P2口做外部扩展时运用,其间XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位。一般P2口用于操控信号,P0口作为数据通道。
XBYTE界说的是外部地址,这样才干和接到你的IO口上的器材通讯
在一般的读写外部RAM的程序中,常常看到这样的句子:
拜访指令如你这儿讲51的MOVX指令(在C言语中他会编译成这个指令)在履行这个指令的时分3组线是和谐作业
mov dptr,#1000h
mov a,#55h
movx @dptr,a
上面3调句子的C言语能够表明如下
#define
W_DATA=0X55;
在运用外部总线的时分,数据 地址和操控信号是直接依照规则的时序输出凹凸电平的,所以不必你管,当然你必需要满意时序作业怎么了解#define XBYTE ((unsigned char
volatile xdata * ))
8051 特有的内存型态
code
data
idata
bdata
xdata
pdata
特别材料型态
bit
sbit
语法
sbit
典范
sbit
或是合作 bdata 宣告的位(bit)变量
char
sbit
(留意 sbit 前不能够加 static)
sfr
语法
sfr
典范
sfr
指定肯定地址的变量
在单一模块内能够运用下面的语法宣告
[memory_space]
典范
pdata
假如该变量有必要为多个模块所运用(Global Variable)则以
笼统指针(Abstract Pointer)的方法在标头档(Header File)界说较为便利。
#define
典范
#define
(留意 char 与 pdata 的次序)
ABSACC.H 供给了下列便利的宏(Macro)界说。
#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)
躲藏的初始化程序
80C51 在电源重置后(Power On Reset)所履行的第一个程序模块并不是运用者的主程序
main(),而是一个躲藏在 KEIL-C51 规范链接库中称为 startup.a51 的程序模块。
startup.a51 的首要作业是把包括 idata、xdata、pdata 在内的内存区块铲除为 0,并
且初始化递归指针。接着 startup.a51 被履行的仍然是一个躲藏在 KEIL-C51 规范链接库
中称为 init.a51 的程序模块。而 init.a51 的首要作业则是初始化具有非零初始值设定的
变量。
在完结上述的初始化程序之后,80C51 的操控权才会交给 main() 开端履行运用者的程序。
#define XBYTE ((unsigned char volatile xdata *) 0)
界说
这样,能够直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)拜访外部RAM了
其间,初始地址便是0x0000;
百度知道:
#define XBYTE((char*)0x20000L)XBYTE[0x8000]=0x41;这段程序是什么意思?#define XBYTE ((char*)0x20000L) 界说了XBYTE是个指向地址 0x20000L 的字符型指针(或许数组)变量XBYTE[0x8000]=0x41; 对数组XBYTE的第 0x8000个变量进行赋值,赋值为0x41。即对地址0x28000L的内存单元赋值为0x41。这说明你用的是带外部数据总线的51芯片,外部的存储器多半是RAM,RAM的容量至少有 0x8000(32k)字节-RAM的容量可能是64k字节?假如还有问题,能够发消息联络弥补1:L代表 long,这说明 0x20000L 是一个长整数。一般来说,8位单片机如51,整数用16位二进制表明,长整数用32位二进制表明。
还有这样用的:
写这样的一个头文件
这样的格局:
类型 贮存空间 界说别号 关键字_at_ 寄存器的地址
_at_这个关键字是肯定界说地址