c51中存储类型code-data
C51中data,idata,xdata 区别

dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idATa: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。
idA Ta是用类似C中的指针方式访问的。
汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)xdA Ta: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdA Ta: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx 读写。
这个比较特殊,而且C51好象有对此BUG, 建议少用。
但也有他的优点,具体用法属于中级问题,这里不提。
startup.a51的作用,和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char dATa xxx="100";,那startup.a51中就会有相关的赋值。
如果没有=100,startup.a51就会把他清0。
(startup.a51==变量的初始化)。
这些初始化完毕后,还会设置SP指针。
对非变量区域,如堆栈区,将不会有赋值或清零动作。
有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。
比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。
, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。
bit是在内部数据存储空间中20H .. 2FH 区域中一个位的地址,这在DATA的20H以后以字节形式出现,可互相参照。
另外加上8051 可寻址的SFR,但刚刚试过,只是00H--7FH起作用,也就是说当数据有变化时颜色变红,以后的从80H到--FFH就不是位寻址区了,是位寻址的特殊寄存器,如涉及到了可位寻址的那11个当然会有反应。
C51的数据类型

C51的数据类型标题:C51的数据类型引言概述:C51是一种常用的单片机,对于程序员来说,了解C51的数据类型是非常重要的。
本文将详细介绍C51的数据类型,包括基本数据类型、派生数据类型、数组、结构体和枚举类型。
一、基本数据类型1.1 位类型(bit):C51中的位类型只能存储0或1,用于表示逻辑真假。
1.2 无符号整型(unsigned int):用于表示正整数,范围为0~65535。
1.3 有符号整型(int):用于表示带符号的整数,范围为-32768~32767。
二、派生数据类型2.1 字符型(char):用于表示一个字符,范围为-128~127。
2.2 浮点型(float):用于表示带有小数点的数值,精度较高。
2.3 双精度型(double):用于表示双精度浮点数,精度更高。
三、数组3.1 一维数组:用于存储相同类型的数据,通过下标访问数组元素。
3.2 多维数组:可以是二维、三维甚至更高维度的数组,用于存储复杂的数据结构。
3.3 数组名:数组名是数组的首地址,可以用来访问数组元素。
四、结构体4.1 结构体定义:用于存储不同类型的数据,通过成员名访问结构体成员。
4.2 结构体数组:可以定义结构体数组,每个元素都是一个结构体变量。
4.3 结构体指针:可以定义指向结构体的指针,方便对结构体成员进行操作。
五、枚举类型5.1 枚举定义:用于定义一组有序的常量,方便程序员使用。
5.2 枚举变量:可以定义枚举变量,取值为定义的枚举常量。
5.3 枚举类型转换:可以将枚举类型转换为整型,方便进行运算。
结论:通过本文的介绍,读者可以更加深入地了解C51的数据类型,包括基本数据类型、派生数据类型、数组、结构体和枚举类型。
掌握这些知识可以帮助程序员更好地编写C51程序,提高代码的质量和效率。
希望本文能对读者有所帮助。
C51数据类型和存储空间

关于单片机存储器的问题,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 V ar = 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快一倍,代码也小的很多。
C51基本结构与数据

单片机技术
一、C51程序结构 程序结构
C51语言程序采用函数结构,每个C51语言程序由一个 语言程序采用函数结构,每个 语言程序采用函数结构 语言程序由一个 或多个函数组成。 或多个函数组成。
单片机技术
1. C51的一般格式 的一般格式
类型 函数名(参数表) 函数名(参数表) 参数说明; 参数说明; { 数据说明部分; 数据说明部分; 执行语句部分; 执行语句部分; }
单片机技术
C51的一般格式 的一般格式
中函数分为两大类: (1) C51中函数分为两大类:库函数、用户定义函数。 ) 中函数分为两大类 库函数、用户定义函数。 (2) 函数在程序中的三种形态:函数定义、函数调用和函数 ) 函数在程序中的三种形态:函数定义、 说明。 说明。 (3) 函数定义:包括函数类型、函数名、形式参数说明等, ) 函数定义:包括函数类型、函数名、形式参数说明等, 函数名后面必须跟一个圆括号(),形式参数在()内定义。 (),形式参数在()内定义 函数名后面必须跟一个圆括号(),形式参数在()内定义。 包括, (4)函数体:由一对花括号“{}”包括,在“{}”的内容就是函 )函数体:由一对花括号“ 包括 的内容就是函 数体。如果一个函数内有多个花括号,则最外层的一对“ 之 数体。如果一个函数内有多个花括号,则最外层的一对“{}”之 间的部分为函数体的内容。 间的部分为函数体的内容。 (5) 函数体内的两个组成部分,声明语句用于对函数中用到 ) 函数体内的两个组成部分, 的变量进行定义,也可能对函数体中调用的函数进行声明。 的变量进行定义,也可能对函数体中调用的函数进行声明。执行 语句由若干语句组成,用来完成一定功能。 语句由若干语句组成,用来完成一定功能。 (6)仅有一对“{}”,这种函数称为空函数。 )仅有一对“ ,这种函数称为空函数。 (7) 每个语句和数据定义的最后必须以分号结束。 ) 每个语句和数据定义的最后必须以分号结束。
C51的数据存储详解

C51的存储种类和存储器类型1.自动变量(auto)char chr=‘a’;等价于auto char chr=‘a’;注意自动变量的作用域在main函数和复合语句中分别定义了一个同名的字符型自动变量并输出,结果证明复合语句中自动变量的作用域仅限于符合语句中。
#include"stdio.h"void main(){char chr='a';{char chr='b';printf("%c\n",chr);}printf("%c\n",chr);}程序运行结果为ba复合语句说明:复合语句把多个语句用括号{}括起来组成的一个语句称复合语句。
在程序中应把复合语句看成是单条语句,而不是多条语句,例如{x=y+z;a=b+c;printf("%d%d",x,a);}是一条复合语句。
复合语句内的各条语句都必须以分号“;”结尾;此外,在括号“}”外不能加分号。
2.外部变量(extern)C51语言允许将大型程序分解为若干个独立放入程序模块文件,各个模块可以分别进行编译然后再连接在一起,在这种情况下,如果某个变量要在其他程序模块文件中使用,只要在一个程序文件中将该变量定义为全局变量,而在其他程序模块文件中使用“extern”说明该变量是已经被定义过的变量就可以了。
在整个程序中都具有相同名字的外部变量只能在一处进行定义和初始化。
#include"stdio.h"char chr_1='a';void main(){extern char chr_2;printf("%c\n",chr_1);printf("%c\n",chr_2);}char chr_2='b';程序运行结果abchr-1是一个全局变量,不需要使用extern进行声明,而chr-2在定义前被使用,因此使用前必须使用extern进行声明。
C51中data,idata,xdata,pdata的区别

dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idATa: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。
idA Ta是用类似C中的指针方式访问的。
汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)xdA Ta: 外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdA Ta: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx 读写。
这个比较特殊,而且C51好象有对此BUG, 建议少用。
但也有他的优点,具体用法属于中级问题,这里不提。
startup.a51的作用,和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char dATa xxx="100";,那startup.a51中就会有相关的赋值。
如果没有=100,startup.a51就会把他清0。
(startup.a51==变量的初始化)。
这些初始化完毕后,还会设置SP指针。
对非变量区域,如堆栈区,将不会有赋值或清零动作。
有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。
比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。
, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。
bit是在内部数据存储空间中20H .. 2FH 区域中一个位的地址,这在DATA的20H以后以字节形式出现,可互相参照。
另外加上8051 可寻址的SFR,但刚刚试过,只是00H--7FH起作用,也就是说当数据有变化时颜色变红,以后的从80H到--FFH就不是位寻址区了,是位寻址的特殊寄存器,如涉及到了可位寻址的那11个当然会有反应。
单片机C语言中的data,idata,xdata,pdata,code

单片机C语言中的data,idata,xdata,pdata,code
从数据存储类型来说,8051 系列有片内、片外程序存储器,片内、片外数
据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应
code、data、xdata、idata 以及根据51 系列特点而设定的pdata 类型,使用不同的存储器,将使程序执行效率不同,在编写C51 程序时,最好指定变量的存储
类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。
与ANSI-C 稍有不同,它只分SAMLL、COMPACT、LARGE 模式,各种不同的模式对应
不同的实际硬件系统,也将有不同的编译结果。
在51 系列中data,idata,xdata,pdata 的区别:
data:固定指前面0x00-0x7f 的128 个RAM,可以用acc 直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff 的256 个RAM,其中前128 和data 的128 完全相同,只是因为访问的方式不同。
idata 是用类似C 中的指针方式访问的。
汇编中的语句为:mox ACC,@Rx.(不重要的补充:c 中idata 做指针式的访问效果很好) xdata:外部扩展RAM,一般指外部0x0000-0xffff 空间,用DPTR 访问。
pdata:外部扩展RAM 的低256 个字节,地址出现在A0-A7 的上时读写,用movx ACC,@Rx 读写。
这个比较特殊,而且C51 好象有对此BUG,建议少用。
但也有他的优点,具体用法属于中级问题,这里不提。
单片机C 语言unsigned charcodetable[]code 是什么作用?。
C51关键字数据类型及存储类型总结

C51关键字数据类型及存储类型总结C51关键字数据类型及存储类型总结⼀、数据类型1.char 字符类型char 类型的长度是⼀个字节,通常⽤于定义处理字符数据的变量或常量。
分⽆符号字符类型unsigned char 和有符号字符类型signed char,默认值为signed char 类型。
unsigned char 类型⽤字节中所有的位来表⽰数值,所能表达的数值范围是0~255。
signed char 类型⽤字节中最⾼位字节表⽰数据的符号,“0”表⽰正数,“1”表⽰负数,负数⽤补码表⽰。
所能表⽰的数值范围是-128~+127。
unsigned char 常⽤于处理ASCII 字符或⽤于处理⼩于或等于255 的整型数。
2.int 整型int 整型长度为两个字节,⽤于存放⼀个双字节数据。
分有符号int 整型数signed int 和⽆符号整型数unsigned int,默认值为signed int 类型。
signed int 表⽰的数值范围是-32768~+32767,字节中最⾼位表⽰数据的符号,“0”表⽰正数,“1”表⽰负数。
unsigned int 表⽰的数值范围是0~65535。
3.long 长整型long 长整型长度为四个字节,⽤于存放⼀个四字节数据。
分有符号long 长整型signed long 和⽆符号长整型unsigned long,默认值为signed long 类型。
signed int 表⽰的数值范围是-2147483648~+2147483647,字节中最⾼位表⽰数据的符号,“0”表⽰正数,“1”表⽰负数。
unsigned long 表⽰的数值范围是0~4294967295。
4.float 浮点型float 浮点型在⼗进制中具有7 位有效数字,是符合IEEE-754 标准的单精度浮点型数据,占⽤四个字节。
因浮点数的结构较复杂在以后的章节中再做详细的讨论。
5.指针型指针型本⾝就是⼀个变量,在这个变量中存放的指向另⼀个数据的地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机C 语言code 与data 的作用
单片机C 语言unsigned char code table[] code 是什么作用?
code 的作用是告诉单片机,我定义的数据要放在ROM (程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVC(好像是),因为C 语言中没办法详细描述存入的是ROM 还是RAM (寄存器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data 是存入RAM 的意思。
程序可以简单的分为code (程序)区,和data (数据)区,code 区在运行的时候是不可以更改的,data 区放全局变量和临时变量,是要不断的改变的,cpu 从code 区读取指令,对data 区的数据进行运算处理,因此code 区存储在什么介质上并不重要,象以前的计算机程序存储在卡片上,code 区也可以放在rom 里面,也可以放在ram 里面,也可以放在flash 里面(但是运行速度要慢很多,主要读flash
比读ram 要费时间),因此一般的做法是要将程序放到flash 里面,然后load 到 ram 里面运行的;DA TA 区就没有什么选择了,肯定要放在RAM 里面,放到rom 里面改动不了。
附:
c51中的存储类型
本文来自CSDN 博客,转载请标明出处:/erazy0/archive/2009/09/20/4573196.aspx
data ---> 可寻址片内ram
bdata ---> 可位寻址的片内ram
idata ---> 可寻址片内ram ,允许访问全部内部ram
pdata ---> 分页寻址片外ram (MOVX @R0) (256 BYTE/页) xdata ---> 可寻址片外ram (64k 地址范围)
code ---> 程序存储区 (64k 地址范围),对应MOVC @DPTR const 表示本c51中存储类型
数组不可修改数组为常量数组
code 表示本数组生成后是在ROM区中同样不可修改
idata 表示数组生成后在在0x00~0xff的256个RAM中,使用指针寻址
具体的参考下面
data,bdata,idata,pdata,xdata,code存储类型与存储区
bit是在内部数据存储空间中20H .. 2FH 区域中一个位的地址,或者8051 位可寻址SFR 的一个位地址。
code是在0000H .. 0FFFFH 之间的一个代码地址。
data是在0 到127 之间的一个数据存储器地址,或者在128 .. 255 范围内的一个特殊功能寄存器(SFR)地址。
idata是0 to 255 范围内的一个idata 存储器地址。
xdata 是0 to 65535 范围内的一个xdata 存储器地址。