C51存储单元.doc

上传人:sk****8 文档编号:3501403 上传时间:2019-06-01 格式:DOC 页数:78 大小:520KB
下载 相关 举报
C51存储单元.doc_第1页
第1页 / 共78页
C51存储单元.doc_第2页
第2页 / 共78页
C51存储单元.doc_第3页
第3页 / 共78页
C51存储单元.doc_第4页
第4页 / 共78页
C51存储单元.doc_第5页
第5页 / 共78页
点击查看更多>>
资源描述

1、char *addr=0xc000;char xdata *addr=0xc000;除了在内存中占用的字节不同外,还有别的区别吗?char *addr=0xc000; 是通用定义,指针变量 addr 可指向任何内存空间的值;char xdata *addr=0xc000; 指定该指针变量只能指向 xdata 中的值;后一种定义中该指针变量(addr)将少占用一个存储字节。uchar xdata *addr=0xc000;指针指向外 ram;如果:data uchar xdata *addr=0xc000;指针指向外 ram 但指针本身存在于内 ram(data)中以此类推可以 idata uc

2、har xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;data uchar idata *addr=0xa0;.51C 语言能不能定义 1024 个字节的 xdata unsigned char 的数组呢? 电路是用 hc573 和6264 外扩了 8K 的 ram 需要定义 1024 个字节的 xdata unsigned char 的数组,然后写了个测试程序测试定义的数组是否正常 FillMemory(RecBuffer,MAXCOMMBUFFERSIZE-1,0x12);/先填充 RecBuffer 为 0x12 for(i=0;i*

3、(px+) 4. (*px)+x+ 5. unsigned char xdata * x;unsinged char xdata * y;x=0x0456;*x=0x34 /等价于 mov dptr,#456h ; mov a,#34h; movx dptr,a 6. unsigned char pdata * x;x=0x045;*x=0x34 /等价于 mov r0,#45h ; mov a,#34h; movx r0,a 7. unsigned char data * x;x=0x30;*x=0x34 /等价于 mov a,#34h; mov 30h ,a 8. int *px;px=(

4、int xdata *)0x4000; /将 xdata 型指针 0x4000 赋给 px,也就是将 0x4000 强制转换为指向 xdata 区中的 int 型变量的指针,将其赋给px。 9. int x;x=*(char xdata *)0x4000); /将 0x4000 强制转换为指向 xdata 区中的 int 型变量的指针,从这个地址中取出值赋给变量 x。 10. px=*(int xdata * xdata *)0x4000); /如何分析? 11. px=*(int xdata * xdata *)0x4000);将阴影部分遮盖,这个意思就是将 0x4000 强制转换为指向 x

5、data 区中的 X 型变量的指针,这个 X 型变量就是阴影“int xdata *”,也就是 0x4000 指向的变量类型是一个指向xdata 区中的 int 型变量的指针,即 0x4000 中放的是另外一个指针,这个指针指向的是 xdata 区中的 int 型变量。Px 值放的是 0x4000 中放的那个指针。比如【0x4000】【0x2000】0x34。Px0x2000。 12. x=*(int xdata * xdata *)0x4000); x 中放着 0x4000 中放的那个指针所指向的值。比如【0x4000】【0x2000】0x34。 三. 指针与数组1. int arr10;i

6、nt * pr;pr=arr; / 等价于 pr这样的话,*(pr+1)=arr1; *(pr+2)=arr2; *(arr+3)=arr3; *(arr+4)=arr4;或者 pr0,pr1.代表 arr0,arr1.可以*pr+ (等价于*(pr+),来访问所有数组元素,而*arr+是不行的。因为 arr 是常量,不能+运算 2. char * s1char code str=”abcdefg”s1=str; 3. char *s1=”abcdefg”; 四. 指针与结构体1. typedef struct _data_str unsigned int DATA110;unsigned i

7、nt DATA210;unsigned int DATA310;unsigned int DATA410;unsigned int DATA510;unsigned int DATA610;unsigned int DATA710;unsigned int DATA810;DATA_STR;/开辟一个外 RAM 空间,确保这个空间够装你所需要的xdata uchar my_dataMAX_STR _at_ 0x0000;DATA_STR *My_Str;My_Str=(DATA_STR*)my_data; /把你的结构体指针指向这个数组的开头以后的操作就这样:My_Str-DATA10=xxx

8、;My_Str-DATA11=xxx;那么你的变量就自然放到 XDATA 中去了.注意定义的 my_dataMAX_STR,不能随便被操作,它只是开始的时候用来开辟内存用的. 2. struct studentchar name20;int num;stu1,stu2; 3. struct studentchar name20;int num;;struct student stu1,stu2;struct student *p;p=访问成员方法:A. stu1.numB. (*p).num; /因为“.”的优先级高于“*”所以要加括号。C. P-num; 4. struct student

9、stu10;struct student * p;p=stu; (责任编辑:admin) 1. 使用指针采用指针的方法,可实现在 C51 程序中对任意指定的存储器地址进行操作。例如:#define uchar unsigned char#define uint unsigned intvoid test_memory(void) uchar idata ivar1;uchar xdata *xdp; /*定义一个指向 XDATA 存储器空间的指针*/char data *dp; /*定义一个指向 DATA 存储器空间的指针*/uchar idata *idp; /*定义一个指向 IDATA 存

10、储器空间的指针*/xdp=0x1000; /*XDATA 指针赋值,指向 XDATA 存储器地址 1000H 处*/*xdp=0x5A; /*将数据 5AH 送到 XDATA 的 1000H 单元*/dp=0x61; /*DATA 指针赋值,指向 DATA 存储器地址 61H 处*/*dp=0x23; /*将数据 23H 送到 DATA 的 61H 单元*/idp= /*idp 指向 IDATA 区变量 ivar1*/*idp=0x16; /*等价于 ivar1=0x16*/2. 使用 C51 运行库中预定义宏C51 编译器提供了一组宏定义用来对 80C51 系列单片机的CODE、DATA、P

11、DATA 和 XDATA 空间进行绝对地址访问。函数原型如下:#define CBYTE(unsigned char volatile *)0x50000L)#define DBYTE(unsigned char volatile *)0x40000L)#define PBYTE(unsigned char volatile *)0x30000L)#define XBYTE(unsigned char volatile *)0x20000L)#define CWORD(unsigned int volatile *)0x50000L)#define DWORD(unsigned int vol

12、atile *)0x40000L)#define PWORD(unsigned int volatile *)0x30000L)#define XWORD(unsigned int volatile *)0x20000L)这些函数原型放在 absacc.h 文件中。CBYTE 以字节形式对 CODE 区寻址,DBYTE 以字节形式对DATA 区寻址,PBYTE 以字节形式对 PDATA 区寻址,XBYTE 以字节形式对 XDATA 区寻址,CWORD 以字形式对 CODE 区寻址,DWORD 以字形式对 DATA 区寻址,PWORD 以字形式对 PDATA 区寻址,XWORD 以字形式对 XD

13、ATA 区寻址。例如:#include#include#define uchar unsigned char#define uint unsigned intvoid main(void)uint ui_var1;uchar uc_var1;ui_var1 = XWORD 0x0002; /*访问外部 RAM 0004H0005H 地址的内容*/uc_var1 = XBYTE 0x0002; /*访问外部 RAM 0002H 地址的内容*/while(1);需要注意的是,ui_var1 在外部存储器区访问 0x0004。通过使用#define 预处理器命令,可采用其他符号定义绝对地址。3. 使

14、用 C51 扩展关键字 _at_ 使用_at_对指定的存储器空间的绝对地址进行定位,一般格式如下:存储器类型 数据类型 标识符 _at_ 常数其中,存储器类型为 idata、data、xdata 等 C51 能识别的数据类型,如果省略该选项,则按编译模式 SMALL、COMPAC 或 TLARGE 规定的默认存储器类型确定变量的存储器空间;数据类型除了可用int、 long、float 等基本类型外,还可采用数组、结构等复杂数据类型;常数规定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量只能为全局变量。例如:uchar xdata xram0x8000 _at_ 0x00

15、00; /*在外部 RAM 空间0000H 处定义了一个一维数组变量 xram,数组的元素个数为32768(0x8000)*/struct birthdateint year;uchar month, day;idata struct birthdate Hans _at_ 0x60; /*结构变量 Hans 定位于 IDATA 空间地址 0x60 */5.5.5 中断服务程序80C51 的中断系统十分重要,C51 编译器允许在 C 语言源程序中声明中断和编写中断服务程序,从而减轻了采用汇编程序编写中断服务程序的繁琐程度。通过使用 interrupt 关键字来实现。定义中断服务程序的一般格式如

16、下:void 函数名( ) interrupt n using m关 键 字 interrupt 后 面 的 n 是 中 断 号 , n 的 取 值 范 围 : 0 31。 编译 程 序 从 8n+3 处 产 生 中 断 向 量 , 即 在 程 序 存 储 器 8n+3 地 址 处 形 成一 条 长 跳 转 指 令 , 转 向 中 断 号 n 的 中 断 服 务 程 序 。 中 断 号 对 应 着 IE寄 存 器 中 的 使 能 位 , 即 : IE 寄 存 器 中 的 0 位 对 应 着 外 部 中 断 0, 相应 的 外 部 中 断 0 的 中 断 号 是 0。 中 断 号 0 4 对 应

17、 中 断 源 的 关 系 如 表所 示 。中断号和中断源的对应关系using m 指明该中断服务程序所对应的工作寄存器组,取值范围:03。指定工作寄存器组的缺点是所有被中断调用的过程都必须使用同一个寄存器组,否则参数传递会发生错误。通常不设定 using m,除非保证中断程序中未调用其他子程序。使用 C51 编写中断服务程序,程序员无需关心ACC、B 、DPH、DPL、PSW 等寄存器的保护,C51 编译器会根据上述寄存器的使用情况在目标代码中自动增加压栈和出栈。C51 具有 ANSI C 的所有标准数据类型。其基本数据类型包括:char、int 、short、long、float 和 dou

18、ble,对 C51编译器来说,short 类型和 int 类型相同,double 类型和 float 类型相同。整型和长整型的符号位字节在最低的地址中。除此之外,为了更加有利地利用 80C51 的结构,C51 还增加了一些特殊的数据类型,包括 bit、sfr、sfr16、sbit。1. char 字符类型char 类型的长度是 1B,通常用于定义处理字符数据的变量或常量。分无符号字符类型 unsigned char 和有符号字符类型 signed char,默认值为 signed char 类型。unsigned char 类型用字节中所有的位表示数值,可以表达的数值范围是 0255。sign

19、ed char 类型用字节中最高位表示数据的符号,0 表示正数,1 表示负数,负数用补码表示,能表示的数值范围是-128+127。unsigned char 常用于处理 ASCII 字符或用于处理小于或等于 255 的整型数。正二进制数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加 1。 2. int 整型int 整型长度为 2B,用于存放一个双字节数据。分有符号 int 整型数signed int 和无符号 int 整型数 unsigned int,默认值为 signed int 类型。signed int 表示的数值范围是-32768+32767,字节中最高位表示数据的符号,

20、0 表示正数,1 表示负数。unsigned int 表示的数值范围是065535。3. long 长整型long 长整型长度为 4B,用于存放一个 4B 数据。分有符号 long 长整型signed long 和无符号 long 长整型 unsigned long,默认值为 signed long类型。signed int 表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,0 表示正数,1 表示负数。unsigned long 表示的数值范围是 04294967295。4. float 浮点型float 浮点型在十进制中具有 7 位有效数字,是符合 I

21、EEE-754 标准(32)的单精度浮点型数据,占用 4B。具有 24 位精度。5. *指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不同的处理器长度也不尽相同,在 C51 中它的长度一般为 13 个字节。6. bit 位标量bit 位标量是 C51 编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是 0,就是 1,类似一些高级语言中的 Boolean 类型中的 True 和False。7. sfr 特殊功能寄存器sfr 也是一种扩充数据类型,点用一个内存单元,值域为 0255。利用它可以访问 51 单片机内部的所有特殊功能寄存器。如用 sfr P1 = 0x90这一句定义 P1 为 P1 端口在片内的寄存器,在后面的语句中可以用 P1 = 255(对 P1 端口的所有引脚置高电平)之类的语句操作特殊功能寄存器。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。