打印
[应用方案]

C51 xdata基址偏址寻址

[复制链接]
2434|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linfelix|  楼主 | 2024-6-21 20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、    第一种方式是定义外部对址常量,程序如下:

#define XRAM        0x0000
#define CYDRAM      0x1000
#define EPM244H     0x4000
#define EPM244L     0x5000

void readdata(unint add)

{

   volatile unchar xdata *xramadd;
   xramadd=CYDRAM+add; //just produce the CS signal of the CY7C024.
   rdata=*xramadd;
   _nop_();
   xramadd=EPM244H;
   rdatah=*xramadd;
   xramadd=EPM244L;
   rdatal=*xramadd;

}

void main()

{

        readdata(0x0002);

}

上面程序可以比较灵活的读出自0x1000以后的地址,直要在后面加上所要读出的偏址add就可,主程序中的调用,则此时返回0x1002的数据。在子程序中要定义一个xramadd的指针,让要求的地址指向它。注意要加volatile,这样在你连读的情况下,不被编程器优化。

二、另外一个情况就是使用_at_指令,这种方式我认为不够灵活,要是连续读写多个数据,就要定义一个数组,势必没有指针灵活,程序如下:

volatile unchar xdata SCYDRAM   _at_ 0x1000;
volatile unchar xdata SEPM244H   _at_ 0x4000;
volatile unchar xdata SEPM244L   _at_ 0x5000;

void readdata(unint add)

{

   rdata=SCYDRAM+add;   //just produce the CS signal of the CY7C024.
   rdatah=SEPM244H;
   rdatal=SEPM244L;

}

void main()

{

        readdata(0x0002);

}

这样得到的结果是不正确的,编译器并没有按要求在0x1002的地方寻址,而是在0x1000的地方寻址,怎么解决这个问题呢?那就是定义一个数组,volatile unchar xdata SCYDRAM[256]   _at_ 0x1000;只有这样,通过数组来调用,才能够得到相应的结果。程序如下:

void readdata(unchar add)

{

   rdata=SCYDRAM[add];   //just make the CS signal of the CY7C024.
   rdatah=SEPM244H;
   rdatal=SEPM244L;

}

void main()

{

        readdata(0x02);

}

这样读出的数据是正确的。

三、可以使用XBYTE来定义,但是要包括#include 此文件。如下。

#include

#define  SCYDRAM   XBYTE[0x1000];
#define SEPM244H   XBYTE[0x4000];
#define SEPM244L   XBYTE[0x5000];

使用特权

评论回复
沙发
uytyu| | 2024-7-10 22:13 | 只看该作者
外部数据存储器通常指的是外部RAM,其地址空间可达64KB,地址范围从0x0000到0xFFFF。

使用特权

评论回复
板凳
everyrobin| | 2024-7-12 19:57 | 只看该作者
可以定义一个指向 xdata 类型的指针,并通过这个指针加上偏移量来访问外部存储器的特定位置。

使用特权

评论回复
地板
rosemoore| | 2024-7-12 22:19 | 只看该作者
“基址偏址寻址”(Base-Indexed Addressing)是访问外部数据存储器的一种方法,它使用基址寄存器加上一个偏移量(index)形成最终的地址

使用特权

评论回复
5
ccook11| | 2024-7-13 12:25 | 只看该作者
在C51中,基址偏址寻址通常涉及数据指针DPTR(Data Pointer Register)作为基址寄存器,而累加器A作为偏移量。

使用特权

评论回复
6
sesefadou| | 2024-7-13 18:14 | 只看该作者
外部数据存储器是指8051微控制器外的RAM,通常是通过外部扩展的存储器。xdata变量的寻址方式与内部数据存储器(IDATA)不同,因为它使用的是间接寻址。

使用特权

评论回复
7
uptown| | 2024-7-13 20:13 | 只看该作者
要进行基址偏址寻址,你需要使用MOVX指令,该指令用于从外部RAM中读取或写入数据。

使用特权

评论回复
8
qiufengsd| | 2024-7-15 15:57 | 只看该作者
在Keil C51编程环境中,xdata是用于访问外部数据存储器的一种存储类型。C51单片机的xdata空间通常指的是位于0x0000至0xffff范围内的外部RAM

使用特权

评论回复
9
jimmhu| | 2024-7-16 20:01 | 只看该作者
#include <reg51.h>

#define TABLE_SIZE 256 // 假设数据表大小为256字节

unsigned char xdata table[TABLE_SIZE]; // 定义一个位于外部RAM的数据表

void main(void)
{
    unsigned char index = 10; // 假设我们要访问table中的第10个元素
    unsigned int addr;

    addr = (unsigned int)&table[0]; // 获取table的起始地址
    DPTR = (unsigned int)addr; // 设置DPTR为table的起始地址

    // 使用基址偏址寻址方式读取外部RAM中的数据
    // 注意:这里的语法取决于C51编译器的具体实现
    unsigned char data = *(unsigned char *)(DPTR + index);

    // 或者使用C51特有的寻址方式
    unsigned char data = xdata[*(_DPTR + index)];

    while(1);
}

使用特权

评论回复
10
lihuami| | 2024-7-17 14:37 | 只看该作者
外部数据存储器通常具有较大的地址空间,从 0x0000 到 0xFFFF(即 64KB)。xdata 的基址偏址寻址是一种在编程中灵活访问这些外部存储器地址的方法。

使用特权

评论回复
11
jackcat| | 2024-7-17 18:32 | 只看该作者
在C51程序中,可以通过宏定义(#define)来指定一个基地址。例如,#define BASE_ADDR 0x1000 定义了一个基地址为 0x1000 的宏。

使用特权

评论回复
12
wilhelmina2| | 2024-7-18 20:36 | 只看该作者
在使用 xdata 指针时,必须确保指针的声明中包含了 xdata 关键字,以指示该指针指向的是外部数据存储器。

使用特权

评论回复
13
iyoum| | 2024-7-18 22:25 | 只看该作者
在MCS-51系列单片机中,最典型的基址偏址寻址指令是MOVC(Move Code)指令,但它用于访问程序存储器中的常量数据。不过,在C51编程环境中,类似的概念被用于访问外部数据存储器。

使用特权

评论回复
14
mattlincoln| | 2024-7-19 09:23 | 只看该作者
间接寻址方式可以用于访问外部存储器。C51编译器中,对于8051单片机,通常使用XDATA作为指向外部RAM的指针。

使用特权

评论回复
15
ingramward| | 2024-7-19 16:15 | 只看该作者
基地址是外部存储器中一个固定的起始地址,而偏移量则是从这个基地址开始的一个相对地址。

使用特权

评论回复
16
jackcat| | 2024-7-19 20:05 | 只看该作者
在C51单片机中使用基址偏址寻址来访问外部RAM中的xdata变量。

使用特权

评论回复
17
wilhelmina2| | 2024-7-19 21:30 | 只看该作者
基址偏址寻址是一种在外部数据存储器中寻址特定位置的方法。

使用特权

评论回复
18
minzisc| | 2024-7-23 21:18 | 只看该作者
在C51单片机中,xdata类型用于声明位于外部RAM中的变量。

使用特权

评论回复
19
bestwell| | 2024-7-24 08:06 | 只看该作者
xdata变量的寻址方式支持基址加偏址的形式,这种寻址方式允许你通过一个基地址和一个偏移量来访问外部RAM中的数据。

使用特权

评论回复
20
10299823| | 2024-7-24 08:29 | 只看该作者
在8051单片机中,数据寻址方式有直接寻址、间接寻址和立即寻址等。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

1273

帖子

1

粉丝