单片机各种96的数据类型是()6的数组的范围是怎么决定的?

51单片机C语言 几个数组定义的区别_百度知道
51单片机C语言 几个数组定义的区别
这样三个句子 const uchar a[12]={...........}; char idata time[4]={...........}; uchar code table[20]={...........};const idata
code 这三个是什么作用?句子是什么意思?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
CONST:通常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新)可以定义const常量,具有不可变性。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 存储器地址。
const 表示本数组不可修改 数组为常量数组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 存储器地址。指针类型和存储区的关系详解一、存储类型与存储区关系
可寻址片内ram
可位寻址的片内ram
可寻址片内ram,允许访问全部内部ram
分页寻址片外ram (MOVX @R0) (256 BYTE/页)
可寻址片外ram (64k 地址范围)
程序存储区 (64k 地址范围),对应MOVC @DPTR二、指针类型和存储区的关系
对变量进行声明时可以指定变量的存储类型如:
uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。
同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的存储区类型关键字的使用如:
uchar xdata * data pstr
是指在内ram区分配一个指针变量(&*&号后的data关键字的作用),而且这个指针本身指向xdata区(&*&前xdata关键字的作用),可能初学C51时有点不好懂也不好记。没关系,我们马上就可以看到对应“*”前后不同的关键字的使用在编译时出现什么情况。
uchar xdata tmp[10];
//在外ram区开辟10个字节的内存空间,地址是外ram的0x9
第1种情况:
uchar data *
首先要提醒大家这样的代码是有bug的, 他不能通过这种方式正确的访问到tmp空间。 为什么?我们把编译后看到下面的汇编代码:
MOV 0x08,#tmp(0x00)0x08是指针pstr的存储地址
看到了吗!本来访问外ram需要2 byte来寻址64k空间,但因为使用data关键字(在&*&号前的那个),所以按KeilC编译环境来说就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键字定义而造成的bug。特别是当工程中的默认的存储区类为large时,又把tmp[10] 声明为uchar tmp[10] 时,这样的bug是很隐秘的不容易被发现。
第2种情况:
uchar xdata *
这种情况是没问题的,这样的使用方法是指在内ram分配一个指针变量(&*&号后的data关键字的作用),而且这个指针本身指向xdata区(&*&前xdata关键字的作用)。编译后的汇编代码如下。
MOV 0x08,#tmp(0x00)0x08和0x09是在内ram区分配的pstr指针变量地址空间
MOV 0x09,#tmp(0x00)
这种情况应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了,请大家记住他。
第3种情况:
uchar xdata *
这中情况也是对的,但效率不如第2种情况。编译后的汇编代码如下。
MOV DPTR, #0x000A0x000A,0x000B是在外ram区分配的pstr指针变量地址空间
MOV A, #tmp(0x00)
MOV @DPTR, A
MOV A, #tmp(0x00)
MOVX @DPTR, A
这种方式一般用在内ram资源相对紧张而且对效率要求不高的项目中。
第4种情况:
uchar data *
如果详细看了第1种情况的读者发现这种写法和第1种很相似,是的,同第1 种情况一样这样也是有bug的,但是这次是把pstr分配到了外ram区了。编译后的汇编代码如下。
MOV DPTR, #0x000A0x000A是在外ram区分配的pstr指针变量的地址空间
MOV A, #tmp(0x00)
MOVX @DPTR, A
第5种情况:
大家注意到&*&前的关键字声明没有了,是的这样会发生什么事呢?下面这么写呢!对了用齐豫的一首老歌名来说就是 “请跟我来”,请跟我来看看编译后的汇编代码,有人问这不是在讲C51吗?为什么还要给我们看汇编代码。C51要想用好就要尽可能提升C51编译后的效率,看看编译后的汇编会帮助大家尽快成为生产高效C51代码的高手的。还是看代码吧!
MOV 0x08, #0X010x08-0x0A是在内ram区分配的pstr指针变量的地址空间
MOV 0x09, #tmp(0x00)
MOV 0x0A, #tmp(0x00)
注意:这是新介绍给大家的,大家会疑问为什么在前面的几种情况的pstr指针变量都用2 byte空间而到这里就用3 byte空间了呢?这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用 3 byte空间,对于没有声明指针指向存储空间类型的指针,系统编译代码时都强制加载一个字节的指针类型分辩值。具体的对应关系可以参考KeilC的help中C51 User's Guide。
第6种情况:
这是最直接最简单的指针变量声明,但他的效率也最低。还是那句话,大家一起说好吗!编译后的汇编代码如下。
MOV DPTR, #0x000A0x000A-0x000C是在外ram区分配的pstr指针变量地址空间
MOV A, #0x01
MOV @DPTR, A
MOV DPTR, #0x000A
MOV A, #tmp(0x00)
MOV @DPTR, A
MOV A, #tmp(0x00)
MOVX @DPTR, A
这种情况很类似第5种和第3种情况的组合,既把pstr分配在外ram空间了又增加了指针类型的分辨值。
本回答被提问者采纳
推崇一楼的答案,详细!
为您推荐:
其他类似问题
您可能关注的内容
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机的C语言中数组的用法_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机的C语言中数组的用法
&&单片机的C语言中数组的用法
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩4页未读,
定制HR最喜欢的简历
你可能喜欢C语言中数组的储存单元为什么不能是51单片机中扩展的sbit数据类型?_百度知道
C语言中数组的储存单元为什么不能是51单片机中扩展的sbit数据类型?
sbit key1 = P3^4;sbit key2 = P3^5;sbit key3 = P3^6;sbit key4 = P3^7;为什么不能由sbit key[4] = { P3^4 ,P3^5 ,P3^6, P3^7};代替?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
数组至少是以字节为单位,很多单片机I/O都没有位寻址功能
采纳率:29%
bit Key[4] ={}试试看可以吗
出错了······
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机C语言中不同数组能用同一个变量来代表其中的数组大小吗?_百度知道
单片机C语言中不同数组能用同一个变量来代表其中的数组大小吗?
Ad_start[i]和Ad_start_1[i]数组能用同一个变量i?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
如果是在定义的时候
是不能用变量的 如果是在使用数组长度的时候
最好还是用不同的变量你如果你的数组很多
你可以写一个专门存数组长度的数组
采纳率:15%
数组为常量数组 code 表示本数组生成后是在ROM区中 同样不可修改 idata 这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用 3 byte空间
数组不能用变量定义数组长度
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。如何在单片机程序中创建一个数组,里面的数是不停改变的值?_百度知道
如何在单片机程序中创建一个数组,里面的数是不停改变的值?
我写了个秒表程序,在51单片机的6个数码管上。
想从电脑发送指令0到5让其返回现在某个数码管正在显示的数值。
字数限制删开头
void display(uchar shiwan,uchar wan,char qian,uchar bai,uchar shi,uchar ge)
P0=table[shiwan];
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
直接用unsigned char类型即可,不要加volatile const之类的修饰词
这是怎么回事?
unsigned char desk[]这里的中括号(方括号)里面把数组元素的数量给填写进去,不要空着即写成desk[6]
那个不写也没事的。。。改了还是这样。。。。。
而且你数组声明的位置也不对,它应该放在所有函数(主函数和了函数)们的最前面你的这个数组声明的前面,似乎还有别的函数这是C语言里的错误做法-----------------------------------------------------------void chuanjoutongxin() interrupt 4{
RI=0;n=SBUF;y=1;}//应该把下面这行代码放在所有函数的最前面,而不是让它上面还有一个子函数unsigned code desk[]={ge,shi,bai,qian,wan,shiwan};
/*这里报错,我只是想引用数码管中时刻变化的数值用于串口返回数值*/void main(void){
写到前面就没有定义了。
这样:你在引用数组元素时,要么直接调用数组元素值,要么用指针,指针比较麻烦,建议你直接引用数组元素号也就是说,desk[0]表示个位值,那么,你在其它函数里引用这个数据时,只能使用desk[0],而不能用desk[ge]或者是ge以你现在的声明,KEIL在编译时,会把ge/shi/bia/qian的ASCII码值做为数组的初始值存入单片机你不能声明unsigned code desk[]={ge,shi,bai,qian,wan,shiwan};你只能声明unsigned code desk[6]={0,0,0,0,0,0};或者是unsigned code desk[6];
采纳率:70%
数组在ROM区,不能改变;
创建一个这个unsigned char desk[6]={ge,shi,bai,qian,wan,shiwan};
我没这么做过,如果可以编译也不是变量。
为您推荐:
其他类似问题
单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 数组是什么数据类型6 的文章

 

随机推荐