您的位置 首页 分销

C51中拜访外部RAM的办法

C51的P0,P2口做外部扩展时使用,其中XBYTE[0x0002],P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道

C51的P0,P2口做外部扩展时运用,其间XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位。一般P2口用于操控信号,P0口作为数据通道。

XBYTE界说的是外部地址,这样才干和接到你的IO口上的器材通讯
在一般的读写外部RAM的程序中,常常看到这样的句子:

XBYTE[address]=data写数据
data=XBYTE[address]读数据1
外部总线由3组总线组成,数据 地址 操控,咱们常常一般就叫他外部总线,既然是有3组不同的信号,那么他们是怎样和谐作业的呢?一般状况CPU有特别的外部数据

拜访指令如你这儿讲51的MOVX指令(在C言语中他会编译成这个指令)在履行这个指令的时分3组线是和谐作业
mov dptr,#1000h
mov a,#55h
movx @dptr,a
上面3调句子的C言语能够表明如下
#defineW_DATAXBYTE[0x1000]
W_DATA=0X55;
在运用外部总线的时分,数据 地址和操控信号是直接依照规则的时序输出凹凸电平的,所以不必你管,当然你必需要满意时序作业怎么了解#define XBYTE ((unsigned char

volatile xdata * ))
8051 特有的内存型态
code以 MOVC @A+DPTR 读取的程序内存
data能够直接存取的内部数据存储器
idata以 Mov @Rn 存取的内部数据存储器
bdata能够位寻址(Bit Addressable)的内部存储器
xdata以 MOVX @DPTR 存取的外部数据存储器
pdata以 MOVX @Rn 存取的外部数据存储器
特别材料型态
bit一般位(bit)变量
sbit肯定寻址的位(bit)变量
语法
sbitmy_flag=location;(location 规模从 0x00 ~ 0x7F)
典范
sbitEA =0xAF;
或是合作 bdata 宣告的位(bit)变量
charbdatamy_flags;
sbitflag0 =my_flags ^ 0;
(留意 sbit 前不能够加 static)
sfr特别功用缓存器(Special Function Register)
语法
sfrmy_sfr=location;(location 规模从 0x80 ~ 0xFF)
典范
sfrP0=0x80;
指定肯定地址的变量
在单一模块内能够运用下面的语法宣告
[memory_space]typevariable_name_at_location
典范
pdatacharmy_pdata_at_0x80;
假如该变量有必要为多个模块所运用(Global Variable)则以
笼统指针(Abstract Pointer)的方法在标头档(Header File)界说较为便利。
#definevariable_name*((data_type *)location)
典范
#definemy_pdata*((char pdata *)0x80)
(留意 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 为 指向 xdata 地址空间unsigned char 数据类型的指针,指针值为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_这个关键字是肯定界说地址

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/257818.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部