打印

请问C51中怎样访问外部存储器?

[复制链接]
3452|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhaohe2001|  楼主 | 2007-10-6 21:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
awey| | 2007-10-6 21:43 | 只看该作者

对定义成xdata的数据访问指向外部存储器

使用特权

评论回复
板凳
computer00| | 2007-10-6 21:57 | 只看该作者

使用xdata时会生成movx指令。

使用特权

评论回复
地板
zhaohe2001|  楼主 | 2007-10-6 22:07 | 只看该作者

有段程序是这样的

#include <at89x52.h>

unsigned long xdata datas[]  = {0x00000001,0x00000002,0x00000003,
                                0x00000004,0x3F065B4F,0x666D7D07,
                                0x7F6F777C,0x895E7971};
unsigned long xdata datas2[] = {0x00030001,0x00040002,0x00005003,
                                0x00060004,0x4F065B4F,0x676D7D07,
                                0x7F89777C};
unsigned char xdata datas3[] = {0x01,0x02,0x03,0x04,0x05,0x06,
                                0x07,0x08,0x09,0xf8,0xfe,0xff}; 
void DelayMs(unsigned int time);//延时函数

/***********************************************
*主函数
*功能:程序入口
************************************************/
void main()
{
    unsigned char *p;
    unsigned char i;
    unsigned char da;

    DelayMs(500); //延时,等待将数据写入外部存储器

    while (1)
    {
        p = datas3;

        for (i = 0; i < 7; i++)
        {            
            da = *p++;
            P1 = 0xFE;//P1, P0端口控制8个7段数码管显示
            P0 = da;  //

            DelayMs(1000);
        }
   }
}

/*****************************************************
* 延时函数
*******************************************************/
void  DelayMs(unsigned int time)
{
   unsigned int i;
   unsigned int j;
   for (j = 0x00; j < time; j++)
   {
       for (i = 0x00; i < 0x189; i++);
   }
}

datas[]中每个数怎么是8位十六进制数啊,在访问外部存储器时是怎么处理的?

使用特权

评论回复
5
zhaohe2001|  楼主 | 2007-10-6 22:25 | 只看该作者

hhe

c51编程时,要访问外部设置时,用以下语句可以了吗: 
char xdata *px;
char data temp;
temp=px[100];      
//这三句是不是完成了将外部RAM的第100单元的数移到temp变量中?有没有什么环境设置之类的?
汇编以后,
MOV  A,0xOA
ADD  A,#0x64
MOV  DPL,A
CLR  A
ADDC  A,px(0x09)
MOV  DPH,A
MOVX  A,@DPTR
MOV   temp,A

里面的0x0A,px(0x09)是什么意思?为何要加上该偏量?

使用特权

评论回复
6
zhaohe2001|  楼主 | 2007-10-7 12:23 | 只看该作者

顶一下

使用特权

评论回复
7
computer00| | 2007-10-7 12:44 | 只看该作者

0x0A,px(0x09),这里的数字都是地址。

使用特权

评论回复
8
zhaohe2001|  楼主 | 2007-10-7 13:58 | 只看该作者

那0x0A,px(0x09)中存放的应该是px[0]的地址了?

使用特权

评论回复
9
zhaohe2001|  楼主 | 2007-10-7 19:20 | 只看该作者

上面那段程序中

unsigned long xdata datas[]  = {0x00000001,0x00000002,0x00000003,
                                0x00000004,0x3F065B4F,0x666D7D07,
                                0x7F6F777C,0x895E7971};

unsigned char xdata datas3[] = {0x01,0x02,0x03,0x04,0x05,0x06,
                                0x07,0x08,0x09,0xf8,0xfe,0xff}; 

datas[]中的每个数怎么是8位十六进制数啊?
而datas3[] 中是两位数?

使用特权

评论回复
10
沈老| | 2007-10-7 19:41 | 只看该作者

MOVX A,@DPTR 和 MOVX A,@R0

// 下面程序中读的是同一单元
#include <reg51.h>
#include <ABSACC.h>


void main()
{
    char rval;
    rval = XBYTE[0xFF02];
    P2=0xFF;
    rval = PBYTE[02];
}
///////////////////////////     
     5: void main() 
     6: { 
     7:         char rval; 
     8:         rval = XBYTE [0xFF02]; 
C:0x000F    90FF02   MOV      DPTR,#0xFF02
C:0x0012    E0       MOVX     A,@DPTR
     9:         P2=0xFF; 
C:0x0013    75A0FF   MOV      P2(0xA0),#0xFF
    10:         rval = PBYTE[02]; 
C:0x0016    7802     MOV      R0,#0x02
C:0x0018    E2       MOVX     A,@R0
    11: }
C:0x0019    22       RET      

使用特权

评论回复
11
rainmans| | 2007-10-7 19:47 | 只看该作者

兄弟,这种问题书上写的再清楚不过了

没别的意思,见谅!

使用特权

评论回复
12
computer00| | 2007-10-7 20:52 | 只看该作者

char型的跟long型的当然不一样了。char是8位,long是32位的。

0x0A,px(0x09)中存放的是px[0]的地址了

使用特权

评论回复
13
ayb_ice| | 2007-10-8 07:45 | 只看该作者

明明是long型的,32位。。。

使用特权

评论回复
14
zhaohe2001|  楼主 | 2007-10-9 11:03 | 只看该作者

谢谢大家的帮助和批评

我手头没书,刚从网上down了一本.
不怕大家笑话,我还是要问
datas[]中访问的是不是32位的外部存储空间?
那它的地址总线是怎么连接的呢?

使用特权

评论回复
15
xwj| | 2007-10-9 11:08 | 只看该作者

51都是8位的,32位是按一定的规律读4次

总线的连接还是一样的,但数组每个单元的地址是以4位间隔增加的


懂了吗?





PS:没事是多看看书,有疑问时多看看帮助

使用特权

评论回复
16
computer00| | 2007-10-9 11:09 | 只看该作者

它有4个字节,编译器会产生依次访问4个字节的代码。

使用特权

评论回复
17
yongzai| | 2011-5-9 11:46 | 只看该作者
没看懂

使用特权

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

本版积分规则

55

主题

1169

帖子

7

粉丝