打印

关于IDATA的困惑,请老师指导

[复制链接]
1879|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hongweizy|  楼主 | 2010-10-9 15:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟在学习单片机时遇到了一个存储结构的问题。技术资料上是这样描述的:
"DATA
128 字节内部数据存储空间(00h:7Fh)。可使用除MOVX 和MOVC 之外的指令直
接或间接寻址。此空间可作为全部或部分堆栈空间。
     IDATA
间接数据。256 字节内部数据存储空间(00h:FFh)。可使用除MOVX 和MOVC 之
外的指令进行间接寻址。全部或部分堆栈位于此空间。该区域包括了DATA 区域
和其之上的128 字节间接RAM。"
        对于IDATA的描述我无法理解,"包括了DATA 区域和其之上的128 字节间接RAM",也就是说它含盖了常规的256字节的RAM,而总量只有256字节,这岂是说它本身不存在,只是原来的存储器的别称了吗?
        请各位老师帮我分析一下,我编程用的是汇编语言,只会用"EQU"定义变量地址,如果我在这个存储空间定义变量,应该如何确定地址,例如:"VAR1    EQU    ?",其中的"?"我该从何开始?

相关帖子

沙发
hongweizy|  楼主 | 2010-10-9 15:56 | 只看该作者
自已顶起来等老师

使用特权

评论回复
板凳
chunyang| | 2010-10-9 20:36 | 只看该作者
IDATA区是51系MCU特有的,常规RAM是针对外扩RAM即XDATA区而言的,用“常规RAM”不严谨容易造成误解,只需记住在51系中有128字节的直接寻址内部RAM和129字节的间接寻址内部RAM即可。

使用特权

评论回复
地板
hongweizy|  楼主 | 2010-10-10 17:20 | 只看该作者
chunyang老师说的间接寻址的129字节是指从080H到0FFH这部分空间吗?

使用特权

评论回复
5
j1732| | 2010-10-10 20:08 | 只看该作者
本帖最后由 j1732 于 2010-10-11 08:45 编辑

这个问题是MCS51内部memory地址重叠引起的。
MCS51内部memory用8位地址访问,按常规只能有256字节。
MCS51内部ram有256字节占用地址00H-FFH。内部特殊功能寄存器占用地址80H-FFH,实际只用了部分地址。例如:P0端口地址80H,IE地址A8H,寄存器B地址F0H,......
这样,地址80H-FFH就有重叠问题,比如80H单元可以是P0端口也可以是地址为80H的RAM单元;为了区分,51设计者Intel规定用直接寻址方式访问地址80H-FFH中的SFR,用间接寻址方式访问地址80H-FFH中的RAM。
MOV 80H,#67H 表示将立即数67H送P0口,当然我们一般写成MOV P0,#67H 更直观,其实是同一条指令。
如果将立即数67H送地址为80H的RAM单元,就必须用间接寻址方式,指令如下:
MOV R0,#80H
MOV @R0,#67h

至于地址00H-7FH,因为内部RAM独占此空间,所以直接寻址和间接寻址都访问RAM。

以上所述含有256字节RAM的cpu是MCS51系列中的增强型,还有基本型的只有128字节RAM。无论基本型还是增强型寻址方式和指令系统都是相同的。目前绝大部分MCS51CPU是增强型的。

在汇编下,我习惯用data定义所有的RAM,只是用到80H以后的RAM注意用间接寻址方式。
汇编语言源程序结构:

;常数定义
Sysclk equ 22118400;系统时钟
ms10  equ -18432;timer0初值,产生10mS定时
Flash equ 50;led闪烁时间,50×10=500ms,亮500ms,灭500ms
;......

;硬件定义
led        bit p1.0;led lamp        ;0 light   1 off
speaker bit p1.1;                    ;0 on      1 off
Relay1  bit p1.2;motor 1 relay ;0 on      1 off
Relay2  bit p1.3;motor 2 relay ;0 on      1 off
;......

;Ram定义
;Ram中用户的位地址定义
Relay1OnDelayF bit 0;motor 1 relay on delay flag,if Relay 1 On then flag=1 and delay 100ms
Relay2OnDelayF bit 1;motor 2 relay on delay flag,if Relay 2 On then flag=1 and delay 100ms
SpealerOnF        bit 2;speaker on flag
;......

;Ram中用户工作单元定义
;20h user's bit0 - bit7
;21h user's bit8 - bit15;提醒这两个单元留给用户的位地址

Cnt1L data 22h
Cnt1H data 23h;counter 1
prt1L data 24H
prt1H data 25h;pointer 1
;.......
BufferIn   data 80H;  32 bytes input Buffer
BufferOut data 0a0H;16 bytes output Buffer
Stack       data 0d0H;stack begin here
;......

               org 0000h
               ljmp main

               org 003H
               jmp Is_int0;转int0中断服务程序

               org 00BH
               jmp Is_timer0;转timer0中断服务程序
;......

Main: ;主程序
               MOV SP,#STACK-1;堆栈在STACK处开始
               CLR LED;LED LIGHT
               SETB SPEAKER;SPEAKER OFF;因为复位时P0-P3=0ffh,本指令可省略
               SETB RELAY1;RELAY 1 OFF    ;因为复位时P0-P3=0ffh,本指令可省略
               SETB RELAY2;RELAY 2 OFF    ;因为复位时P0-P3=0ffh,本指令可省略
;......

         

IDATA伪指令没有用过,不知道汇编是否会检查误用IDATA单元的错误。我是编程时自己注意。

另外,080H到0FFH这部分空间的RAM是128字节,不是129字节。

使用特权

评论回复
6
hongweizy|  楼主 | 2010-10-11 09:59 | 只看该作者
明白了,谢谢两位老师!

使用特权

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

本版积分规则

31

主题

157

帖子

0

粉丝