51微控制器访问片内资料储存器某单元的内容用c语言怎么写?

51微控制器访问片内资料储存器某单元的内容用c语言怎么写?,第1张

51微控制器访问片内资料储存器某单元的内容用c语言怎么写?

方法1:
char data p; 定义一个指向片内RAM地址的指标
p = 0x30; 片内RAM地址为0x30
p = 0x12; 向0x30内写入立即数0x12
方法2:
#include <absah>
char x;
x = DBYTE[0x30]; 将片内RANM地址0x30的内容赋给变数x
DBYTE[0x30] = 0x12; 向0x30内写入立即数0x12
方法3:采用 _at_ 直接宣告变数所处地址,但该变数必须是全域性变数。
char data x _at_ 0x30 ; x为char型全域性变数,地址位于data区地址0x30
。。。。。
x = 0x12; 向0x30内写入立即数0x12

51微控制器访问片外资料储存器的用c怎么写?

unsigned char xdata p=0x0650;
unsigned char mid;
读: mid=p;
写:p=mid;

把变数宣告成xdata 型的就可以了。
如 unsigned char xdata ab[100];
这些资料就存放在外部资料储存器了,但要求必须要真正地扩充套件了外部储存器,否则,读写资料就是错误的。不能自己骗自己吧。

MCS—51微控制器上电覆位后,片内资料储存器的内容均为

MCS—51微控制器上电覆位后,片内资料储存器的内容均为 :00H

微控制器片 内资料储存器 有多少单元

不同的微控制器具有不同的RAM单元。 有256位元组、512位元组、1K、2K,等等。

MCS-51微控制器访问外部资料储存器时,资料由什么口送出?

P0口啊,P0口先送出低8位地址,P2口送高8位地址,然后P0口再读或者写8位资料

微控制器片外资料储存器2000H-20FFH内容清零

利用R0暂存器做为回圈次数计数器,利用DPTR暂存器做为外部RAM的地址指标,通过回圈赋值实现外部RAM 2000H-20FFH 单元内容的清零。
MOV R0, #0
MOV DPTR,#2000H
CLR A
LOOP:
MOVX @DPTR, A
INC DPTR
DJNZ R0, LOOP
SJMP $
END

51微控制器程式设计, 实现片内资料储存器30H单元 与片外3000H单元资料交换。

MOV DPTR,#3000h;外部RAM地址写入DPTR
MOV A,30H;先把30H资料送到A
MOVX @DPTR,A;输出资料到3000H
MOVX A,@3000H;从3000H读入资料到A
MOV 30H,A;把资料送入内RAM 30H
;;;程式绝对没问题哦,模拟通过

51微控制器扩充套件外部资料储存器6264,怎么用C语言实现对其 *** 作

2.扩充套件RAM程式设计基础
(1)弄清扩充套件器件的地址
在图725中,U3的ABC接微控制器A13,A14,A15,所以片选讯号对应地址最高位,即:“CBAxxxxx xxxxxxxx”(x为任意)。U4片选接CS1,即Y1,CBA=001,可得U4的地址范围是0x2000~0x3fff。U5接CS3,即Y3,CBA=011,地址为0x6000~0x7fff。U6接CS4,即Y4,CBA=100,地址为0x8000~0x9fff。知道了器件地址,可以利用直接地址、外部资料指标来访问储存器。通过设定,也可以让编译器在扩充套件RAM中自动分配储存单元。
(2)直接地址访问
①向U4写资料:
XBYTE[0x2000+addr]=dat; addr为U4内部地址,取值为0~0x1fff;dat为资料。
②读出U4资料:
dat=XBYTE[0x2000+addr];
也可以用页访问方式。页访问方式,实际就是先把16位地址高8位送P2口,通过低8位地址读写。
③按页读写U4:
P2=0x20+page; page为页,取值为0x00~0x1F。
PBYTE[addr]=dat; addr为页内地址,取值为0x00~0xFF。
dat=PBYTE[addr];
④读U6
dat=XBYTE[0x8000];读U6,地址取0x8000~0x9fff任何值,都一样。
⑤写U5
XBYTE[0x6000]=dat; 写U5,地址取0x6000~0x7fff任何值,都一样。
(3)资料指标
如,读写U4,可以这样写:
unsigned char xdata p=0x3000; 宣告指标p,并初始指向0x3000单元
x=p; 读指标所指向的位置
p=p+1; 指标指向下一单元
p=0x16; 向指标所指向的位置写入资料
(4)让编译器自动分配储存空间
①为了能让编译器自动分配储存空间,并使用扩充套件RAM,必须设定扩充套件RAM地址。在Keil程式设计软体中,点选工具栏快捷图示“ ”,d出目标选项对话方块。按图726所示,设定RAM起始地址和长度。
②变数宣告时使用xdata关键词。如:
unsigned char xdata a;变数a使用扩充套件RAM空间。
特别注意,扩充套件RAM直接地址访问方式与自动分配储存空间方式最好不要混用,否则可能产生冲突。
摘自《微控制器控制装置安装与除错》下册,雷林均主编

51微控制器资料储存器最多扩充套件几位

51右侧的两组(P0,P2)I/O口为地址口,(汇编有指令支援这两组介面同时整体赋值),每一位只有0和1两个值,则16个I/O口的扩充套件位数为2^16=65536

memmov(char  src, char  dst, unsigned int count) 
{
    assert(dst >= src + count);
    while(count)
    {
        dst = src;
        dst++;
        src++;
        count--;
    }
    return;
}
main()
{
    memmov(0x8000, 0x8080, 0x80);
}

C中定义的全局变量、数组就是固定的了,直接 *** 作吧,比较方便。实际的地址是编译器自动分配的,具体在哪里要看汇编。
汇编里可以直接指定,这是汇编的好处。
以下转自网络
在网上看到有人提到在keil中使用_at_进行绝对地址定位问题,我简单介绍一下它的用法。
使用_at_关键字对存储器进行绝对地址定位程序如下
#i nclude<reg51h>
char xdata LED_Data[50] _at_ 0x8000;
main()
{
LED_Data[0] = 0x23;
}
在keil中运行以上程序可以在存储器窗口中输入 x:0x8000 可以看到0x8000地址中的值为0x23
值得指出的几点是
1在给变量LED_Data[50]定位绝对地址空间时,不能对其赋初值。
2char xdata LED_Data[50] _at_ 0x8000;这条语句不能主函数中。有些网友提到在按着keil说明中用_at_进行绝对地址定位时,编译会出现错误274,就是将这条语句放在主函数中的原因。
3keil中地址是自动分配的,所以除非特殊情况否则不提倡使用绝对地址定位。初学者因帖别注意。不要把c当作汇编使用。

51单片机有以下几个内存模块组成:
1rom或者flash,叫程序存储区,你写的程序是存在这里面的,上电后从这里面执行。
程序存储区也分为片内和片外,一般来说,现在的51很多已经做到了64k,所以很少有外扩
片外flash或者片外的rom了,flash或者rom不管是片内还是片外的,只能用来定义常量,是用code来修饰,也就是说,用code来修饰的东西,在程序运行过程中,不能修改;
2ram有------内部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和r1dptr因为是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之类的,不是这种结构的。

ROM是只读内存(Read-Only Memory)的简称,是一种只能读出事先所存数据的固态半导体存储器其特性是一旦储存资料就无法再将之改变或删除通常用在不需经常变更资料的电子或电脑系统中,资料并且不会因为电源关闭而消失RAM(随机存取存储器)RAM -random access memory 随机存储器存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序按照存储信息的不同,随机存储器又分为静态随机存储器(Static RAM,SRAM)和动态随机存储器(Dynamic RAM,DRAM)

c语言在定义数据的时候就已经定义了访问的位置。不需要人为定义。
比如:定义 unsigned char code stat[N];    说明了sta[] 是放在代码区,编译后就会执行MOVC 。
 定义 unsigned char xdata stat[N];    说明了sta[] 是放在XRAM,编译后就会执行MOVX 。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13154481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-12
下一篇 2023-06-12

发表评论

登录后才能评论

评论列表(0条)

保存