当前位置:首页 » 编程语言 » c语言idata
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言idata

发布时间: 2022-11-16 03:56:59

⑴ 单片机c语言中的code什么意思

C51的code修饰的变量,表示将变量存储在单片机程序存储空间FLASH中,节省单片机RAM资源,在程序中不能更改这些变量的值。

⑵ C语言的51单片机idata类型数组问题

你想两 个不同类型的数组能直接赋值吗?默认将16位数赋值给8位变量时,丢失高8位,取低8位,这叫小端模式

⑶ 单片机中 什么是片内RAM和片外RAM,RAM就是数据存储器吗

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之类的,不是这种结构的。

⑷ C语言中的“code”是什么意思啊

code是keil C51里面的关键字,一般用于定义常量数组,意思是告诉编译说把这个数组放在ROM存储。

code的作用是告诉单片机,定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改。因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM的意思。

程序可以简单的分为code(程序)区,和data (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理。

(4)c语言idata扩展阅读:

c51中的存储类型:

code :程序存储区(64KB)

data :可直接寻址的内部数据存储区(128B)

idata:不可直接寻址的内部数据存储区(256B)

bdata:可位寻址内部数据存储区(16B)

xdata:外部数据存储区(64KB)

pdata:分页的外部数据存储区

⑸ C51中,idata区定义变量,使用指针赋值时应当如何定义指针变量

首先纠正一下,C语言没有“字符串变量”这一说,也就是没有一个特定的变量用来存放我们所说的字符串(java语言有,通过String类来实现)。
通常我们所说的字符串其实是很多单个字符组成的,默认以转义字符‘\0’结尾。
这里还要说明一下,常量(数值常量或是字符常量)在内存当中是没有地方专门存放它们的,只能通过变量来存放。既然上面说了,字符串是很多的字符常量组成的,那想要保存它,只能通过数组来保存。比如字符串:china存放在一个数组里可以这样写:
char str[ ] = "china";
char str[ ] = {'c','h','i','n','a'};
上面的两种形式都可以,结尾没有加上'\0'结束符,编译时编译器会默认帮我们加。
现在来回答你的问题。既然字符串保存在数组中,那就要熟悉数组的用法,这里我就不详细说明了,
但是我想提醒的一点就是,数组在声明时可以一次性对全部元素赋初值(称作初始化),如果在声明的时候没有初始化,那以后只能一个个给数组元素赋值。比如:
char str[5]; //声明了一个长度为5的字符串(注意声明数组时数组长度一定是确定了的)
str[5] ="china"; //这句是错的,不能一次性引用数组,只能像下面一样一个个引用赋值:
str[0] = 'c'; //正确
str[1] = 'h';
.... //下面的自己完成
或者用初始化的形式:
char str[ ] = "china"; //正确,声明的同时初始化了数组,数组长度根据元素个数确定
数组说那么多。
那指针呢?好,我给你说两点。
第一:在上一步当中,我们把字符串保存到了数组当中,那只要用一个指针指向这个数组就OK了。那我们可以让这个指针指向数组的首地址也就是字符'c'(希望你对指针已经有了一定的基础),以后偏移一个单位的存储单元就可以指向下一个元素。可以向下面一样:
char str[ ] = "china";
char *p; //声明一个指向char型的指针变量
p = &str[0]; //指向数组的首地址,即取第0个元素的地址给p
当然,C语言当中数组名表示该数组的首地址,所以上面的这句可以写成:
p = str;
第二:一个字符串赋给一个指针变量,其实是将该字符串的首地址给了这个指针。所以,我们可以直接这样写而不用借助于

⑹ 单片机C语言中: 定义 int idata i;和 idata int i 的区别

  1. idata和xdata的地址空间范围不同,以51单片机举例,idata一般就是指单片机内部128字节的RAM中,而xdata是指数据存放在外扩的RAM芯片中,导致了地址存取范围和寻址方式完全不同。从汇编语言的角度来说,idata使用MOV指令即可,而xdata必须使用MOVX指令才能寻址。

  2. C51中变量的存储器类型有code,data,idata,xdata,bdata,pdata这几种。
    code:定义的变量在程序存储区域,64Kbyte范围,变量为只读。
    data:定义的变量在00H~7FH的RAM,128byte范围,变量可读写。
    idata:定义的变量在00H~FFH的RAM,256byte范围,变量可读写。
    bdata:定义的变量在20H~2FH的RAM,16byte范围,变量可读写。
    xdata:定义的变量在扩展的外部存储区,64Kbyte范围,变量可读写。
    pdata:分页寻址外部存储区,256byte范围

⑺ 关于单片机存储器的问题,idata,data,badata,xdata,pdata,code,片内存储区,片外存储区都是些什么关系啊

关于51单片机内存问题,一直是个疑惑大家的问题,因为51单片机是个很另类的单片机。
下面我给楼主讲解一下:
51单片机之所以另类,是因为,他寻址内存的空间,不是靠总线,是用指令的方式。
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之类的,不是这种结构的。

最后,回答楼主的问题:
片外存储区是什么?
这个问题太模糊,答案可以是外扩的Flash,也可以说是外扩的RAM,
如果问题是这么问的:
程序或者常量存储在片外存储区,这个片外存储区指的是什么?
答案是外扩Flash;
如果问题是---变量存储在片外存储区,这个片外存储区指的是什么?
答案是外扩RAM;
一般来说,如果不指明的话,外内存储区,行业内人士指的是外部的Ram。

片内存储器是什么?是不是就是内部的E2PROM?
片内存储区一般来说,指的是内部的Ram,包括高128位(idata)和低128位(data)
片内存储器,这个说法我没听说过,可能是EEPROM吧。

⑻ 在keil的C语言编程中怎么在file2.c里面调用file1.c里面定义的idata类型的数组啊a[10]

1. file1.c里面定义的a[ ]要声明为idata存储类型。
2.在.h文件中声明a[ ],例如:extern uchar idata a[2]; 。
3.在file2.c中包含‘2’ 中的.h文件,如:#include file2.h 。
有以上3个步骤,就可以在file2.c中引用数组a[ ]了。

⑼ 由于写的c51程序超出了128B,没有外部存储的设备,现想用idata,请教idata使用,附程序

单片机C语言里以下几种存储空间:
1 code 用来存储代码和常数,或者常数数组的,比如你程序定义的数组,如果不需要改动,即只是用来读取,不用赋值的,可以定义到code空间里,比如我们常用的7段数码管的显示数组,又或者NTC的表格,这些不需要改动,只用来读取的,定义到code里。

2 data空间:单片机内部RAM的低128B,特点是速度最快,因为采用的是直接寻址方式。
3 idata空间:单片机内部RAM的高128B,速度次快,采用的是与R0,R1配合的间接寻址方式
4 pdata空间:单片机外部RAM的前面的256B,速度与idata一样,采用的是与MOVX,R0,R1配合的间接寻址方式
5 xdata空间:单片机外部RAM的所有空间,包括前面的256B,即与pdata是有重合,采用的是与MOVX,DPTR配合的间接寻址方式,速度最慢
6 SFR空间:单片机的特殊功能寄存器空间,不能用来存放变量,只能是根据单片机的特点定义。

以上理论讲解完毕。
如果你用的是AT89C51单片机,且没有外部的RAM,那么,你只能把变量存放到data里,而idata,pdata,xdata都是没法用的,因为没有那么多物理空间,所以,即便你定义了,也是没用的。

可以有一个方法:我看你里面很多常数数组,可以把这些不需要改动的数组定义到code空间里去,而不占用RAM
这样还不行,你就只能是换单片机了,别无他法。

⑽ c语言的51单片机idata类型数组问题

因为是C语言,所以不用太关心寄存器结构,这样是可以用的,单片机会自动处理的,若是不够用时会自动报错,只是会牺牲速度,没有汇编执行效率快。