文档详情

单片机第4章80C51单片机C语言程序设计-thh.ppt

发布:2017-06-10约2.76万字共140页下载文档
文本预览下载声明
* * 编译模式 默认 存储分区 特 点 SMALL data 小模式。 变量默认在片内RAM。空间小,速度块。 COMPACT pdata 紧凑模式。变量默认在片外RAM的页(256字节,页号由P2口决定)。 LARGE xdata 大模式。 变量默认在片外RAM的64KB范围。空间大,速度慢。 编译模式默认的变量存储分区 3.1.3 C51的编译模式 未对变量存储分区定义时,C51编译器采用默认存储分区。例如: char var; //SMALL模式时,var定位于data存储区 //COMPACT模式时,var定位于pdata存储区 //LARGE模式时,var定位于xdata存储区 * * 3.1.4 用_at_定义变量绝对地址 用关键字“_at_”定义变量存放的首地址 idata int y _at_ 0x30; // idata区域整型变量y的首地址为0x30 例如: 又如: xdata char string[20] _at_ 0x3000; //xdata中字符型数组string的首地址为0x3000 注意,C51编程时不要轻易使用绝对地址定位变量。 * * 3.2 C51的指针 对于一个变量a,利用a表示变量a的地址。则语句 p = a; 表明把a的地址赋给了指针变量p,则“p指向了变量a”。 可以用*P表示变量a 指针变量的定义 char *p; // 定义指针变量P p = 30H ; // 指针变量赋值,30H为片内RAM地址 x = *p; // 30H单元的内容送给变量x *P 指针变量 数据变量 3.2.1 已定义数据存储分区的指针 定义时就指定了所指向数据的存储分区。 该指针占1个字节(idata *,data *,pdata *)或2个字节(code *,xdata *) 示例: char data *str; // 指针str指向的char型数据存于data 空间 int xdata *num; // 指针num指向的int型数据存于xdata 空间 基于存储器的指针长度比通用指针短,可以节省存储器空间,运行速度快,但它所指对象具有确定的存储器空间,兼容性不好。 数据 数据分区 * * 定义时未指定所指向的数据的存储分区 。也称通用指针。 3.2.2 未定义数据存储分区的指针---通用指针 通用指针占3个字节 第一字节存放该指针的默认存储器类型编码(见表) 第二字节存放该指针的高位地址偏移量 第三字节存放该指针的低位地址偏移量 存储器类型编码 存储器类型 bdata/ data / idata xdata pdata code 编码 0x00 0x01 0xfe 0xff * * 通用指针定义示例: char *xdata strptr; // 指针本身存于xdata 空间,它指向char型数据 int *data number; // 指针本身存于data 空间,它指向int型数据 由于指向对象的存储空间在编译时无法确定(运行时确定),因此必须生成通用代码以保证对任意空间的对象进行存取。所以通用指针生成的代码速度较慢。 指针 char型数据 指针分区 * * 3.2.3 利用指针进行绝对地址访问 unsigned char data *p; p=0x40 ; *p=0x55; //数据0x55送入内部RAM的0x40单元 例如: C51编译器提供了一组宏定义实现对80C51绝对地址的访问。这组宏定义原型放在absacc.h文件中,形如: #define DBYTE ((unsigned char volatile data *) 0) 从而使DBYTE用于以字节形式对data区访问,可以写成: *(DBYTE)=0x55H;或 DBYTE[0]=0x55H; 与此类似: CBYTE用于以字节形式对code区进行访问; PBYTE用于以字节形式对pdata区进行访问; XBYTE用于以字节形式对xdata区进行访问。 CWORD、DWORD、PWORD和XWORD用于以字形式对code区、data区、pdata区和xdata区进行访问。 3.2.4 C51程序编写示例 【例3-1】将30H至3FH共16个RAM单元初始化为“55H”。 #include reg52.h #include absacc.h void main(void) { unsigned char i; for (i=0;i=15;i++) { DBYTE[0x30+i]=0x55; } whil
显示全部
相似文档