Chapter08_C51程序设计_第1页
Chapter08_C51程序设计_第2页
Chapter08_C51程序设计_第3页
Chapter08_C51程序设计_第4页
Chapter08_C51程序设计_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、机械电子工程学院机械电子工程学院第第8章章 C51程序设计程序设计 8.2 数据类型数据类型8.1 变量存储类型与编译模式变量存储类型与编译模式 8.3 指针指针 8.4 对绝对地址的访问对绝对地址的访问8.5 函数的使用函数的使用 机械电子工程学院机械电子工程学院8.1 变量的存储器类型与编译模式变量的存储器类型与编译模式8.1.1 变量的存储器类型变量的存储器类型Keil C51对变量进行定义的格式如下:对变量进行定义的格式如下: 存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名变量名; 变量的存储种类有四种:自动(变量的存储种类有四种:自动(auto)、外部()、外部(e

2、xtern)、)、静态(静态(static)和寄存器()和寄存器(register)。定义变量时如果省略存)。定义变量时如果省略存储种类选项,则该变量将为自动(储种类选项,则该变量将为自动(auto)变量。)变量。机械电子工程学院机械电子工程学院8.1.1 变量的存储器类型变量的存储器类型存储器类型存储器类型说说 明明data直接寻址直接寻址的的片内数据存储器片内数据存储器(128字节,字节地址:字节,字节地址:0 x000 x7F),访问速度最快。),访问速度最快。bdata可可位寻址位寻址的的片内数据存储器片内数据存储器(16字节,字节地址:字节,字节地址:0 x200 x2F),允许位与

3、字节混合访问。),允许位与字节混合访问。idata寄存器寄存器间接寻址间接寻址的的片内数据存储器片内数据存储器(256字节,字节地址:字节,字节地址:0 x000 xFF),允许访问全部片内地址。),允许访问全部片内地址。pdata分页寻址分页寻址的的片外数据存储器片外数据存储器(256字节,字节地址:字节,字节地址:0 x000 xFF),用),用“MOVX A, Ri”之类的指令访问。之类的指令访问。xdata片外数据存储器片外数据存储器(64K字节,字节地址:字节,字节地址:0 x00000 xFFFF),),用用“MOVX A, DPTR”之类的指令访问。之类的指令访问。code程序存

4、储器程序存储器(64K字节,只读不写,可能片内也可能片外),字节,只读不写,可能片内也可能片外),用用“MOVC A, A+DPTR”之类的指令访问。之类的指令访问。机械电子工程学院机械电子工程学院8.1.1 变量的存储器类型变量的存储器类型 例:例: 1、char data var1;/*字符变量字符变量var1被定义在被定义在8051单片机片内单片机片内数据存储区中(地址为数据存储区中(地址为00H07FH)*/ 2、bit bdata var2;/*位变量位变量var2被定义在被定义在8051单片机片内数单片机片内数据存储区的据存储区的位寻址区位寻址区中(地址为中(地址为20H02FH)

5、*/ 3、float idata var3, var4;/*浮点变量浮点变量var3、var4被定义在被定义在8051单片机片内数据存储区中,并且只能用单片机片内数据存储区中,并且只能用间接寻址间接寻址方式访方式访问(地址为问(地址为00H0FFH)*/ 4、int pdata var5;/*整型变量整型变量var5被定义在被定义在8051单片机片外单片机片外数据存储区中(地址为数据存储区中(地址为00H0FFH),它的高字节地址保存),它的高字节地址保存在在P2口中口中*/ 5、unsigned int xdata var6;/*无符号整型变量无符号整型变量var6被定义在被定义在8051单

6、片机单片机片外数据存储区片外数据存储区中(地址为中(地址为0000H0FFFFH)*/机械电子工程学院机械电子工程学院编译模式编译模式存储器类型存储器类型SMALL 变量被定义在变量被定义在8051片内片内RAM中。堆栈必须位于片内中。堆栈必须位于片内RAM中。与定义变量时指定中。与定义变量时指定data存储器类型具有相同的效果。存储器类型具有相同的效果。COMPACT 变量被定义在变量被定义在分页寻址分页寻址的片外的片外RAM中,每一页片外中,每一页片外RAM的长度为的长度为256字节。对变量的访问通过寄存器间接寻址进行字节。对变量的访问通过寄存器间接寻址进行 。堆栈位于片内堆栈位于片内RA

7、M中中。变量的高。变量的高8位地址由位地址由P2口决定,低口决定,低8位地址由位地址由R0或或R1的内容决定。与定义变量时指定的内容决定。与定义变量时指定pdata存储存储器类型具有相同的效果。器类型具有相同的效果。LARGE 变量被定义在片外变量被定义在片外RAM中(最大可达中(最大可达64K字节),使用字节),使用数据指针数据指针DPTR来间接访问变量。与定义变量时指定来间接访问变量。与定义变量时指定xdata存储器类型具有相同的效果。存储器类型具有相同的效果。8.1 变量的存储器类型与编译模式变量的存储器类型与编译模式8.1.2 编译模式编译模式机械电子工程学院机械电子工程学院8.2 数

8、据类型数据类型数据类型数据类型长长 度度值值 域域 unsigned char单字节单字节0255signed char单字节单字节-128127unsigned int双字节双字节065536(高字节在前高字节在前的方式存储的方式存储)signed int 双字节双字节-3276832767unsigned long四字节四字节04294967295signed long四字节四字节-21474836482147483647float四字节四字节1.175494E-383.402823E38*13字节字节对象的地址对象的地址bit位位0 或或 1sfr单字节单字节0255sfr16双字节双字

9、节065536sbit位位0 或或 1机械电子工程学院机械电子工程学院8.2.1 类型类型bit8.2 数据类型数据类型 可以定义一个位变量、函数、函数参数、函数返回值。可以定义一个位变量、函数、函数参数、函数返回值。但但不能定义位指针不能定义位指针,也,也不能定义位数组不能定义位数组。 bit类型的变量都被定义在片内类型的变量都被定义在片内RAM的可位寻址区。的可位寻址区。 最多只能声明最多只能声明128个个bit类型变量。类型变量。 声明声明bit类型变量时,可以带有存储器类型类型变量时,可以带有存储器类型data、idata或或bdata。机械电子工程学院机械电子工程学院8.2.2 特殊

10、功能寄存器特殊功能寄存器sfr8.2 数据类型数据类型 可以定义单片机的所有内部可以定义单片机的所有内部8位特殊功能寄存器。位特殊功能寄存器。 sfr型数据占用一个内存单元,其取值范围是型数据占用一个内存单元,其取值范围是0255。定义方法:定义方法: sfr 特殊功能寄存器名特殊功能寄存器名 = 地址常数地址常数 例如:例如: sfr P0 = 0 x80; /*定义定义P0寄存器,地址为寄存器,地址为0 x80*/ sfr SCON = 0 x90; /*定义串口控制寄存器定义串口控制寄存器SCON, 地址为地址为0 x90*/机械电子工程学院机械电子工程学院8.2.3 16位位特殊功能寄

11、存器特殊功能寄存器sfr168.2 数据类型数据类型 占用两个内存单元,取值范围是占用两个内存单元,取值范围是065536,可以定义,可以定义8051单片机内部的单片机内部的16位特殊功能寄存器,如定时器位特殊功能寄存器,如定时器T0和和T1。 例如,对于例如,对于8052单片机的定时器单片机的定时器T2,可定义如下:,可定义如下: sfr16 T2 = 0 xCC; /*定义定义T2,其地址为,其地址为TL2 = 0 xCC, TH2 = 0 xCD*/机械电子工程学院机械电子工程学院8.2.4 可寻址位可寻址位sbit8.2 数据类型数据类型 可以定义可以定义8051单片机单片机内部内部R

12、AM中的可寻址位或中的可寻址位或特殊功能特殊功能寄存器寄存器中的可寻址位。中的可寻址位。 注意:注意: 1、带有、带有bdata存储器类型的变量被定位在片内存储器类型的变量被定位在片内RAM的可的可位寻址区,因此既可以进行字节寻址,也可以进行位寻址,位寻址区,因此既可以进行字节寻址,也可以进行位寻址,这样对这样对bdata变量可用变量可用sbit指定其中任一位为可寻址位变量。指定其中任一位为可寻址位变量。 2、采用、采用bdata及及sbit所定义的变量都必须是全局变量,并所定义的变量都必须是全局变量,并且采用且采用sbit定义可寻址位变量时,要求基址对象的存储器类定义可寻址位变量时,要求基址

13、对象的存储器类型为型为bdata。机械电子工程学院机械电子工程学院8.2.4 可寻址位可寻址位sbit先定义变量的数据类型和存储器类型:先定义变量的数据类型和存储器类型: int bdata ibase; /*定义定义ibase为为bdata整型变量整型变量*/ char bdata bary4; /*定义定义bary4为为bdata字符型变量字符型变量*/然后使用然后使用sbit定义位寻址变量:定义位寻址变量: sbit mybit0 = ibase0; /*定义定义mybit0为为ibase的第的第0位位*/ sbit mybit15 = ibase15; /*定义定义mybit15为为i

14、base的第的第15位位*/ sbit Ary07 = bary07; /*定义定义Ary07为为bary0的第的第7位位*/ sbit Ary37 = bary37; /*定义定义Ary37为为bary3的第的第7位位*/ibase = -1; /*字寻址,对字寻址,对ibase赋值为赋值为-1*/bary3 = a; /*字节寻址,对字节寻址,对bary3赋值为赋值为a*/Ary37 = 0; /*bary3的第的第7位清位清0*/mybit15 = 1; /*ibase的第的第15位置位置1*/机械电子工程学院机械电子工程学院访问特殊功能寄存器中的可寻址位,有如下访问特殊功能寄存器中的可

15、寻址位,有如下3种方法:种方法:1、sbit 位变量名位变量名 = 位地址位地址 sbit CY = 0 xD7;2、sbit 变量名变量名 = 特殊功能寄存器名特殊功能寄存器名位位置位位置 sfr PSW = 0 xD0; sbit CY = PSW7; sfr P0 = 80H; sbit FLAG1 = P01;3、sbit 位变量名位变量名 = 字节地址字节地址位位置位位置 sbit CY = 0 xD07;8.2.4 可寻址位可寻址位sbit机械电子工程学院机械电子工程学院8.3.1 通用指针通用指针8.3 指针指针 通用指针可用于存取任何变量而不必考虑变量在通用指针可用于存取任何变

16、量而不必考虑变量在8051单片机单片机存储器空间的位置,可以利用通用指针来存取位于任何存储器存储器空间的位置,可以利用通用指针来存取位于任何存储器空间的数据。例如:空间的数据。例如:char * sptr; /* char型指针型指针*/int * numptr; /* int型指针型指针*/ 也可以在也可以在“*”后面带一个存储器类型选项,用以指定通用后面带一个存储器类型选项,用以指定通用指指针本身的存储器空间位置针本身的存储器空间位置,如:,如:char * xdata strptr; /*位于位于xdata空间的通用指针空间的通用指针*/int * data numptr; /*位于位于

17、data空间的通用指针空间的通用指针*/long * idata varptr; /*位于位于idata空间的通用指针空间的通用指针*/机械电子工程学院机械电子工程学院8.3.1 通用指针通用指针地址地址+0+1+2内容内容存储器类型存储器类型高字节地址偏移量高字节地址偏移量低字节地址偏移量低字节地址偏移量存储器类型存储器类型idata/data/bdataxdatapdatacode编码值编码值0 x000 x010 xFE0 xFF地址地址+0+1+2内容内容0 x010 x120 x34通用指针的存储格式通用指针的存储格式 通用指针的存储器类型编码通用指针的存储器类型编码 将将xdata

18、类型的地址类型的地址0 x1234作为通用指针表示作为通用指针表示 机械电子工程学院机械电子工程学院8.3.1 基于存储器的指针基于存储器的指针8.3 指针指针 基于存储器的指针对象具有明确的存储器空间,长度可为基于存储器的指针对象具有明确的存储器空间,长度可为1个字节或个字节或2个字节。个字节。 基于存储器类型基于存储器类型data、idata和和pdata的指针具有的指针具有1个字节个字节的的长度,基于存储器类型长度,基于存储器类型xdata和和code的指针具有的指针具有2个字节个字节的长度。的长度。 如果在定义指针时,在如果在定义指针时,在“*”前面前面增加一个存储器类型选项,增加一个

19、存储器类型选项,则该指针就被定义为基于存储器的指针,如:则该指针就被定义为基于存储器的指针,如:char data * str; /*指向指向data空间空间char型数据的指针型数据的指针*/int xdata * num; /*指向指向xdata空间空间char型数据的指针型数据的指针*/long code * pow; /*指向指向code空间空间long型数据的指针型数据的指针*/机械电子工程学院机械电子工程学院8.3 基于存储器的指针基于存储器的指针 定义基于存储器的指针时还可以指定定义基于存储器的指针时还可以指定指针本身的存储器空间指针本身的存储器空间位置,即在位置,即在“*”后面

20、带一个存储器类型的选项,如:后面带一个存储器类型的选项,如: char data * xdata str; /*指向指向data空间空间char型数据的指针,型数据的指针, 指针本身在指针本身在xdata空间空间*/ int xdata * data num; /*指向指向xdata空间空间char型数据的指针,型数据的指针, 指针本身在指针本身在data空间空间*/ long code * idata pow; /*指向指向code空间空间long型数据的指针,型数据的指针, 指针本身在指针本身在idata空间空间*/ 注意指针变量只能存放地址(即指针型数据)。注意指针变量只能存放地址(即指

21、针型数据)。 对指针变量赋值(地址值):对指针变量赋值(地址值): char data *p; /*定义指针变量定义指针变量*/ p = 30H; /*给指针变量赋值,给指针变量赋值,30H为为8051单片机单片机 片内片内RAM地址地址*/机械电子工程学院机械电子工程学院8.4.1 采用预定义宏采用预定义宏8.4 对绝对地址的访问对绝对地址的访问宏定义宏定义可访问的存储器空间及数据类型可访问的存储器空间及数据类型CBYTE地址地址访问访问CODE区区char型型CWORD地址地址访问访问CODE区区int型型DBYTE地址地址访问访问DATA区区char型型PBYTE地址地址访问访问PDAT

22、A区或区或I/O端口端口char型型XBYTE地址地址访问访问XDATA区或区或I/O端口端口char型型DWORD地址地址访问访问DATA区区int型型PWORD地址地址访问访问PDATA区或区或I/O端口端口int型型XWORD地址地址访问访问XDATA区或区或I/O端口端口int型型absacc.h文件中的宏定义文件中的宏定义 机械电子工程学院机械电子工程学院8.4.1 采用预定义宏采用预定义宏例:例:XBYTE0 x7FFF = 0 x80; /*向片外扩展端口地址向片外扩展端口地址7FFFH写入写入 一个字符型数据一个字符型数据*/XWORD0 = 0 x9988; /*将将int型

23、数据型数据0 x9988送入外部送入外部 RAM单元单元0000H和和0001H*/如果定义一个如果定义一个D/A转换器端口地址:转换器端口地址:#define DAC0832 XBYTE0 x7FFF /*定义定义DAC0832端口地址端口地址*/DAC0832 = 0 x80; /*启动一次启动一次D/A转换转换*/ 机械电子工程学院机械电子工程学院8.4.2 用用“_at_”指定绝对地址指定绝对地址8.4 对绝对地址的访问对绝对地址的访问存储器类型存储器类型 数据类型数据类型 标识符标识符 _at_ 地址常数地址常数;struct link struct link idata *next

24、; char code *test;idata struct link list _at_ 0 x40; /*结构变量结构变量list定位于定位于 idata空间地址空间地址0 x40*/xdata char text256 _at_ 0 xE000; /*数组数组text定位于定位于 xdata空间地址空间地址0 xE0000*/xdata int i1 _at_ 0 x8000; /*int变量变量i1定位于定位于 xdata空间地址空间地址0 x8000*/机械电子工程学院机械电子工程学院8.4.2 用用“_at_”指定绝对地址指定绝对地址 注意:注意: 1、利用扩展关键字、利用扩展关键

25、字“_at_”定义的变量称为定义的变量称为绝对变量绝对变量,对该,对该变量的操作就是对指定存储器空间绝对地址的直接操作,因此,变量的操作就是对指定存储器空间绝对地址的直接操作,因此,不能对绝对变量进行初始化不能对绝对变量进行初始化。对于函数和位(。对于函数和位(bit)类型变量不)类型变量不能采用这种方法进行绝对地址定位。能采用这种方法进行绝对地址定位。 2、采用关键字、采用关键字“_at_”定义的绝对变量必须是定义的绝对变量必须是全局变量全局变量,在,在函数内部不能采用函数内部不能采用“_at_”关键字指定局部变量的绝对地址。关键字指定局部变量的绝对地址。 3、在、在xdata空间定义全局变

26、量的绝对地址时,还可以在变量空间定义全局变量的绝对地址时,还可以在变量前面加一个关键字前面加一个关键字“volatile”,这样对该变量的访问就,这样对该变量的访问就不会被不会被编译器优化掉编译器优化掉。机械电子工程学院机械电子工程学院8.5.1 主函数主函数8.5 函数的使用函数的使用void main(void)LCDInit(); while(1) SendString(0 x80, Hello, Everyone!);SendString(0 xC0, You are Welcome!);Delay(200);WriteCommand(0 x01);Delay(250); 机械电子工程

27、学院机械电子工程学院8.5.2 自定义函数自定义函数8.5 函数的使用函数的使用函数类型函数类型 函数名函数名(形式参数表形式参数表) 编译模式编译模式 reentrant interrupt n using m reentrant用于定义再入函数。再入函数可以进行用于定义再入函数。再入函数可以进行递归递归 调用调用,或者,或者同时被两个以上同时被两个以上的其它函数同时调用。的其它函数同时调用。interrupt n用于定义中断服务函数,用于定义中断服务函数,n为中断号,可为中断号,可 为为031。根据中断号决定中断服务程序的入口地址。根据中断号决定中断服务程序的入口地址。using m用于确定函数所使用的工作寄存器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论