
外部ram:相当于扩展的存放数据区,由于内部ram太小,有时候装不下我们要存放的数据,因此增加了外部RAM,它其实和内部RAM的功能一样,唯一的区别就是取值的方式不同.
程序存储器:存放程序的空间,你所写的程序编译后的机器码都在那个空间,我们执行程序的时候也是在那里实现,程序存储器也可以存放数据.
数据存储器:就是内部ram和外部ram
mov,movx两个指令的区别就是一个取内部RAM空间的值而movx取外部ram空间的值
程序指针,高八位和低八位
单片机访问外部程序存储器
用MOVX指令。单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
单片机访问外部数据存储器采用什么指令于汇编语言;如果访问的是外部程序存储器中的指令的话:如果访问的是外部程序存储器中存储的数据的话,这个好像不需要我们写代码,用的是MOVC指令,单片机会自己去读取指令。
单片机访问外部程序存储器用什么指令,所以如果要这样访问.com/question/85352979/.翻译成汇编就是movx dptr ,.baidu,表示往地址里面写数据这是人家的问题,必须P0有锁存器这样就可以忘外部ram0x100地址里面写东西了如果你不是总线形式的话://zhidao,.否则.html" rget="_blank"http,非前256字节只能通过dptr访问用movx指令.是玩不成任务的aa=0x100去回来就行了.单片机会自动产生.com/question/85352979aa = 0xAA/.上面我写错了,否则不可能完成任务这种方式.就是不知道你的P0口有没有用锁存器.读写了.不用那么麻烦/.那就只有通过你上边的那种.baidu.时许形://zhidao,:比人问得.补充,看看是不是和你的一样这种句子.char xdata *aa/.你上面写的 *** 作P0上次的动作这里多了一个*/.外部ram的//.用总线形式扩展,.一般用在 51单片机.不过看你接的那种 要两次P0口的.应该是aa = 0x100, @a这种的句子因为51访问外部ram用的就是movx 指令da = *aa.*aa = 0xAA.当然如果你要读0x100的数据那就char da.直接用指令访问就行了,估计是总线形式的如果直接是外部RAM的话。
51单片机怎么访问外部存储器?
8051访问片外ROM的信号为:1、EA=0;2、ALE有效3、PSEN有效8051访问片外RAM的信号为:1、ALE有效2、RD或WR有效。
8051单片机访问片外ROM与片外RAM的读写信号各是什么。
nsigned char xdata *p=0x0650写unsigned char mid: mid=*p:*p=mid。
51单片机有以下几个内存模块组成:1】rom或者flash,叫程序存储区,你写的程序是存在这里面的,上电后从这里面执行。
程序存储区也分为片内和片外,一般来说,现在的51很多已经做到了64k,所以很少有外扩
片外flash或者片外的rom了,flash或者rom不管是片内还是片外的,只能用来定义常量,是用code来修饰,也就是说,用code来修饰的东西,在程序运行过程中,不能修改;
2】ram有------内部ram的低128位(00-7f),对应c语言就是data,比如我定义一个变量,
data
unsigned
char
var
=
0
那么,这个
var变量就是放在内部的低128位ram中
-------内部ram的高128位(80-ff),对应c语言就是idata,比如我定义一个变量,
idata
unsigned
char
var
=
0
那么,这个
var变量就是放在内部的高128位ram中
-------特殊功能寄存器(sfr)(80-ff),对应c语言就是sfr比如我定义一个变量,
sfr
unsigned
char
var
=
0x90
那么,这个
var变量就是放在内部的特殊功能寄存器中,这是你对var *** 作,相当于 *** 作一个特殊的寄存器,但是小心,不能随便定义sfr变量,很危险
------外部ram
64k(0000-ffff)
外部的ram可以扩展到65536个,但是前256个算是一页,这一页比较特殊,是用
pdata来修饰的,当然,也可以用xdata来修饰。
除了第一页的256个以外的其他65280个空间,只能用xdata来修饰;
回过头来讨论pdata和xdata,这两个都能修饰外部ram的第一页,但是,pdata只能修饰第一页,即最前面的256个外部ram,那么,这最前面的256个到底用pdata还是xdata好的呢?
答案是pdata,因为xdata修饰的变量,用的是dptr寻址,pdata用的是r0和r1.dptr因为是16位的,所以可以覆盖整个的64k外部ram,r0和r1是8位,所以只能寻址最前面的256个,也就是外部ram的第一页,但是,用r0寻址,比dptr快一倍,代码也小的很多
楼主又疑惑了,好多地址是重复的,比如,我向80h地址写一个数值,单片机怎么知道读的是内部的高128位ram?还是sfr?还是外部64k的ram呢?
答案是用指令,如果是直接寻址,那么访问的就是sfr,如果是r0或者r1间接寻址,就是内部高128位ram,如果是dptr或者是r0,r1间接寻址,且配合的是movx指令,那么就是访问外部64kram中的第80h个地址。
概括一下来说,51的内存由以下组成:
1----程序存储器(包括片内flash或rom,也包括片外flash或rom,c语言用code定义)
2----内部低128位ram,c语言用data定义
3---内部高128位ram,c语言用idata定义
4---内部sfr,c语言用sfr定义
5---外部65536个ram(通常,很多单片机厂家不会给你扩展那么多的,一般来说扩展256个字节或者1024个字节就差不多了,最近宏晶的出了个扩展4096字节的。这65536字节的ram,前256个可以用pdata修饰,也可以用xdata修饰,超过256个之后的,只能用xdata修饰)
以上所说的只是针对51内核的单片机,其他内核的,像arm之类的,不是这种结构的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)