《单片机C语言编程软件,Keil C51演示套件.pdf》由会员分享,可在线阅读,更多相关《单片机C语言编程软件,Keil C51演示套件.pdf(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:3873092518051 演示套件前言该手册是 Keil 软件公司 8051 单片机软件开发工具的介绍是为新用户和有兴趣的读者准备的使用指南只需要阅读本书就可以正确地运行和使用该软件这本用户指南包括以下章节的内容第一章 介绍 对本用户手册的概述第二章 安装 讲述怎样安装软件并设置工具的操作环境第三章 8051 产品系列讲述为 8051 单片机提供的不同产品读完本章可以决定选用哪一种产品第四章 8051 开发工具讲述 8051 开发工具的主要特征包括 C 编译器汇编器调试器
2、和集成开发环境第五章 使用 8051 工具讲述通过演示程序指导用户如何使用这套工具第六章 硬件产品介绍辅助开发和调试的硬件工具还有 80C517A 和 80C520 评估板以及EPROM 仿真器第七章 实时内核讲述 RTX51 实时操作系统该章还提供多任务处理系统的概述第八章 命令参考简要讲述了 8051 开发工具的命令及控制符第一章 介绍Keil 软件公司的 8051 单片机软件开发工具可用于众多的 8051 派生器件以实现嵌入式应用开发工具清单如下?C51 优化 C 编译器?A51 宏汇编器?8051 工具连接器目标文件转换器库管理器?Windows 版 dScope 源程序级调试器/模拟
3、器?Windows 版Vision 集成开发环境这些工具都集合在一个套件内见第三章独立的工具在第四章详细介绍除了以上的开发工具以外还提供实时内核评估板和调试硬件这些内容详见第六章和第七章的讲述这套工具是为专业软件开发者设计的但任何水平的编程者都可使用手册主题该手册讨论了许多主题包括?将软件安装到系统并将其调整到最佳性能见第二章?为你的应用系统选择最佳工具套件见第三章?使用 8051 开发工具见第四章?运行演示程序见第五章如果想要马上开始使用应当安装软件并运行演示程序评估和演示套件Keil 提供两套软件供用户对开发工具进行评估C51 演示套件是开发工具的示范版本演示套件中的工具并不产生实际的目标
4、代码而是产生列表文件可通过列表文件查看编译器和其它工具产生的代码C51 评估套件是工具的评估版本评估套件的工具可产生最大为 2K 的应用程序可使用该套件评估开发工具的效用并可用于产生小型的目标应用系统第二章 安装广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:387309252这一章讲述如何设置一个操作环境以及如何将软件安装到硬盘上在开始安装之前必须进行以下步骤?确定你的计算机系统符合最低配置要求?将安装盘备份系统要求为了保证编译器和工具的正常工作系统必须满足软件和硬件的最低配置对 Windows 版工具必须满足以下条件
5、?100IBM 兼容 386 或以上 PC?Windows3.1 版或以上?至少 4M 内存?硬盘至少有 6MB 磁盘空间对 DOS 版工具必须满足以下条件?100IBM 兼容 386 或以上 PC带 640K 内存?MS-DOS3.1 版或以上?硬盘至少有 6MB 磁盘空间C 编译器及工具要求 CONFIG.SYS 文件中至少定义 20 个文件及 20 个缓冲区此外还需要足够的环境空间供编译器和工具的环境变量使用见环境设置章节CONFIG.SYS 文件应当和下列格式相似BUFFERS20FILES20SHELLC:COMMAND.COM/e:1024/p如果在 DOS 下收到信息Out of
6、 environment space就需要通过增加示例中 1024 的值以增加环境空间数量详情参考 DOS 用户指南备份磁盘强烈建议用户将安装磁盘拷贝到一个备份盘上然后用备份磁盘来安装软件将原磁盘妥善保存以防止备份磁盘丢失或损坏安装 DOS 版产品要安装 DOS 版将第一个安装盘插入驱动器 A并在 DOS 提示符下键入以下命令AINSTALL然后按安装程序的提示继续安装安装 Windows 版产品要安装 Windows 版产品?将第一个安装盘插入驱动器 A?在程序管理器的文件菜单中选择运行?在命令行提示符下键入 ASETUP?选择OK按钮然后按安装程序的提示继续安装目录结构安装程序将开发工具复
7、制到下列根目录中的子目录所使用的目录由安装的工具套件决定目录描述C518051 开发工具C51EVAL8051 评估工具广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:387309253在创建适当的目录后安装程序将开发工具复制到下列子目录中子目录描述ASM汇编器包含文件BIN可执行文件DS51dScope-51 DOS IOF 驱动器EXAMPLES示例应用程序RTX51RTX51RTX_TINYRTX51INCC 编译器文件LIBC 编译器库文件和启动代码MON51目标监控文件TS51tScope-51 DOS IOT
8、 驱动器环境设置下表列出了环境变量它们的默认路径以及简要的描述变量路径描述PATHC51BIN定义 8051 开发工具的路径PATHC51EVALBIN定义 8051 评估工具的路径TMP定义产生暂存文件的路径要得到最佳性能定义的路径应当是 RAM 磁盘如果环境变量已经定义路径必须存在否则工具将报告严重出错C51INCC51INC定义标准 C51 编译器包含文件的路径C51LIBC51LIB定义标准 C51 编译器库文件的路径通常环境设置由安装程序自动安装自动安装到 AUTOEXEC.BAT 文件中如果想将这些设置放入一个单独的批处理文件中必须写入如下的环境设置8051 开发工具8051 演示
9、工具PATH=C:C51BIN;PATHC:C51EVALBIN;SET C51INC=C:C51INCSET C51INC=C:C51EVALINCSET C51LIB=C:C51LIBSET C51LIB=C:C51EVALLIB改善系统性能可以使用两种方法改善 C51 编译器和工具的性能这些技术可以帮助改善大多数应用系统的性能?为编译器和工具软件提供一个 RAM 磁盘用于暂存文件?使用磁盘高速缓冲区disk cache保存最近访问过的磁盘文件使用 RAM 磁盘如果计算机有足够的扩展或扩充存储器可以考虑使用 RAM 磁盘由于 RAM 磁盘的内容保存在RAM 中访问的速度将会非常快如果使用
10、RAM 磁盘可以将环境变量 TMP 设成 RAM 磁盘的名称由于可以使用 RAM 磁盘存放暂存文件这样可加速许多工具软件的执行有许多 RAM 磁盘的软件可用RAMDRIVE.SYS 和 VDISK.SYS 是 DOS 最常装载的 RAM 磁盘程序名参考 DOS 手册学习如何安装这些程序使用磁盘高速缓冲区磁盘高速缓冲区利用巨大的存储区来暂存从磁盘读取的信息当计算机访问磁盘时先检查所要的信息是否已在高速缓冲区内如果是就从高速缓冲区内而不是从磁盘内读取信息这显然要比从磁盘读取信息快许多广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 F
11、ax:387309254通常软件的开发包括编辑编译编辑编译的循环这种情况下磁盘高速缓冲区提高了编辑器编译器和连接器的性能编辑器编译器源文件和目标文件全都可以放入高速缓冲区这样对磁盘的访问就降到最少MSDOS5.0 和 6.0 都有磁盘高速缓冲区的应用程序叫做 SMARTDRV.SYS参考 DOS 使用手册学习如何安装和使用该程序第三章 8051 产品系列Keil 提供工业用的 8051 开发工具为了帮助你熟悉我们是如何分配工具的下面介绍工具套件的概念工具套件是几个应用程序的集合这些程序用来创建 8051 应用系统使用汇编器汇编 8051 汇编程序使用编译器将 C 源代码编译成目标文件使用连接器
12、创建一个绝对目标文件模块供仿真器使用8051 开发工具套件使用 Keil 的开发工具其项目开发周期和任何软件开发项目都大致一样1.创建 C 或汇编语言的源程序2.编译或汇编源文件3.纠正源文件中的错误4.从编译器和汇编器连接目标文件5.测试连接的应用程序工具套件概述上面所述的开发周期用方框图表示最合适如图所示用Vision/51 IDE 创建源文件然后通过 C51 编译器或 A51汇编器编译器或汇编器处理源文件并创建浮动目标文件目标文件可通过 LIB51 库管理器创建库库是一个专门格式的有顺序的目标模块程序集连接器可对其进行处理目标文件和库文件通过连接器创建一个绝对目标模块绝对目标文件或模块是
13、没有浮动代码的目标文件绝对目标文件中的所有代码都有固定的位置由连接器创建的绝对目标文件可用于编程 EPROM 或其它存储器件绝对目标模块也可和 dScope-51 调试器/模拟器或电路内部仿真器一起使用dScope-51 调试器/模拟器对于快速可靠的高级语言程序的调试非常理想调试程序包括一个高速模拟器和一个目标调试器可对整个 8051 系统包括片内外围功能进行仿真通过装载特殊的 I/O 驱动器可对不同的 8051 派生器件的外围功能进行仿真和 Monitor-51 相连后调试程序甚至可以在目标硬件上达到源程序级的仿真RTX-51 实时操作系统是一个用于 8051 系列的多任务处理内核程序RTX
14、-51 实时内核简化了系统的设计编程以及对时间有严格要求的复杂系统的调试内核完全集成在 C51 编译器中并且非常易用任务描述表和操作系统的一致性由 BL51 连接器/定位器自动控制工具套件介绍上图列出了 Keil 8051 开发工具的全部内容该图中列出的工具包括下面将要介绍的专业开发者套件除了专业开发者套件外Keil 还为 8051 开发者提供了其它许多工具为了更好地说明每套工具的内容我们按照功能排序首先介绍功能最强的专业开发者套件广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:387309255PK51C51 专业开发
15、者套件该套件包括了专业的 8051 开发者创建复杂应用系统所需要的一切工具该套件的组件如下?C51 优化 C 编译器?A51 宏汇编器?BL51 代码连接器/定位器?OC51 目标文件转换器?OH51 目标十六进制转换器?LIB51 库文件管理器?dScope-51 模拟器/调试器?tScope-51 目标调试器?Monitor-51 ROM 监视和终端程序?集成开发环境?RTX-51 Tiny 实时操作系统另外专业开发者套件还包括为 Windows 用户提供的下列工具?Windows 版 dScope-51 模拟器/调试器?Windows 版Vision/51 集成开发环境专业开发者套件可配
16、置用于所有 8051 派生器件该套件中所有工具需运行在 100IBM PC386 或以上兼容机的 DOS 环境下DK51C51 开发者套件DK51C51 开发者套件是为那些需要在完全 DOS 环境下进行 8051 开发的用户设计的该套件可使用户在 DOS 开发平台上创建复杂的嵌入式应用系统该套件包括以下组件?C51 优化 C 编译器?A51 宏汇编器?BL51 代码连接器/定位器?OC51 目标文件转换器?OH51 目标十六进制转换器?LIB51 库文件管理器?dScope-51 模拟器/调试器?tScope-51 目标调试器?Monitor-51 ROM 监视和终端程序?集成开发环境开发者套
17、件可配置用于所有 8051 派生器件该套件中所有工具需运行在 100IBM PC386 或以上兼容机的 DOS 环境下CA51C51 编译器套件CA51C51 编译器套件是需要 C 编译器而不需要调试系统的开发者的最佳选择该套件可使开发者为目标硬件创建 8051 应用系统该编译器套件可配置用于所有的 8051 派生器件该套件中的工具需运行在 100IBM PC386 或以上兼容机的 DOS 环境下A51A51 宏汇编器套件A51 宏汇编器套件包括 8051 汇编器和所有创建 8051 应用系统所需的工具该汇编器套件可配置用于所有的 8051 派生器件该套件中的工具需运行在 100IBM PC3
18、86 或以上兼容机的 DOS 环境下DS51-dScope-51 模拟器套件DS51 模拟器套件包括与 A51 汇编器套件一起使用的调试器/模拟器和 CA51 编译器套件由于模拟器可对程序指令进行单步操作使用该套件可迅速找出 8051 应用系统出现问题的位置还可以观察程序变量SFR 和存储器该套件包括以下组件广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:387309256?dScope-51 模拟器/调试器?tScope-51 目标调试器?Monitor-51 ROM 监视和终端程序该模拟器套件可配置用于大多数 805
19、1 派生器件该套件中的工具需运行在 100IBM PC386 或以上兼容机的 DOS 环境下FR51RTX51 Full 实时内核程序FR51RTX51 Full 实时内核程序是一个用于 8051 单片机的实时操作系统RTX-51 Full 全实时内核提供特征超集以及 BITBUS 和 CAN 通讯协议界面库具体内容参看第七章 实时内核程序工具套件比较表下表为每个开发工具套件的项目清单通过该表用户可选择最合适的工具套件PK51DK51A518051汇编器编译器模拟器IDERTXWindowsDOS第四章 8051 开发工具这一章介绍 8051 单片机家族的特征和优点以及 Keil 的开发工具开
20、发工具可帮助开发者迅速并成功的实现设计目标8051 单片机家族8051 问世于二十世纪八十年代早期由于 8051CPU 内核有着杰出的特性以及外围功能在本世纪仍然可以得到良好的应用现今不同的芯片供应商可提供超过 200 种 8051 派生器件有超过半数的嵌入式项目使用 8051 系列单片机作为嵌入式处理器8051 是一枝独秀的典型的 8051 家族成员包含 8051CPU 内核数据存储器程序存储器和一些外围功能灵活的存储器界面使用户可以通过标准的外设和存储器件扩展 8051 的性能8051 开发工具Keil5 为 8051 提供下列开发工具?C51 优化 C 编译器?A51 宏汇编器?BL51
21、 代码连接器/定位器?OC51 目标文件转换器?OH51 目标十六进制转换器?LIB51 库文件管理器?Windows 版 dScope-51 模拟器/调试器?Windows 版Vision/51 C51 优化 C 交叉编译器C 语言是一种通用编程语言它提供高效代码结构化编程元素及丰富的运算符C 不是一个大型的语言不是为特定领域内的应用而设计的C 的普遍性使它可以为各种不同的软件任务提供便利有效的编程方案许多应用设计使用 C 比其它专门语言更有效Keil 的 C51 优化交叉编译器MSDOS 版是完全符合 ANSI美国国家标准协会标准的 C 语广州周立功单片机发展有限公司 Tel0203873
22、0916 38730917 38730976 38730977 Fax:387309257言工具C51 编译程序产生 8051 单片机使用的代码但它不是一个适合 8051 目标硬件的通用 C 编译器对于大多数 8051 应用使用像 C 这样的高级语言比使用汇编程序更具优点例如?不需要了解处理器的指令集对 8051 的存储器结构也不必要了解?寄存器分配和寻址方式由编译器进行管理?指定操作的变量选择组合提高了程序的可读性?可使用与人的思维更相近的关键字和操作函数?与使用汇编语言编程相比程序的开发和调试时间大大缩短?库文件可提供许多标准的例程例如格式化输出数据转换和浮点运算加入到应用程序当中?通过
23、C 可实现模块化编程技术从而可将已编制好的程序加入到新程序中?C 语言可移植性好且非常普及C 编译器几乎适用于所有的目标系统已完成的软件项目可以容易地转换到其它的处理器或环境C51 语言扩展C51 编译器是符合 ANSI 标准的 C 编译器C 语言的扩展支持 8051 单片机的应用包括?数据类型?存储器类型?存储器模型?指针?再入函数?中断函数?实时操作系统?PL/M 和 A51 源文件接口下面章节将简要介绍这些扩展功能数据类型C51 编译器支持下表列出的数据类型除了这些标量类型外还可以将变量组合到结构联合及阵列中除了指明的类型可通过指针访问这些数据类型数据类型位字节值的范围bit1101带符
24、号 char81-128+127无符号 char810255enum162-32768+32767short162-32768+32767short162065535int162-32768+32767int162065535long324-2147483648+2147483647long32404294967295float324+1.175494E-38+3.402823E+38sbit1101sfr1810255sfr1611620655351.bitsbitsfrs 和 sfr16 数据类型专门用于 8051 硬件和 C51 编译器并不是 ANSI C 的一部分不能通过指针进行访问b
25、itsbitsfrs 和 sfr16 数据类型用于访问 8051 的特殊功能寄存器例如sfr P0=0 x80 定义变量 P0 并将其分配特殊功能寄存器地址 0 x80在 8051 上是 P0 口的地址当结果表示不同的数据类型时C51 编译器自动转换数据类型例如位变量在整数分配中就被转换成一个整数除了数据类型的转换之外带符号变量的符号扩展也是自动完成的广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:387309258存储器类型C51 编译器支持 8051 及其派生器件结构并提供对 8051 所有存储区的访问每个变量可以明
26、确地分配到指定的存储空间对内部数据存储器的访问比对外部数据存储器的访问快许多因此应当将频繁使用的变量放在内部数据存储器而把较少使用的变量放在外部数据存储器中变量的定义包括了存储器类型的指定可以指定变量存放的位置存储器类型描述code程序存储器64K 字节通过操作码 MOVC A+DPTR 进行访问data直接寻址内部数据存储器对变量的最快访问128 字节idata间接寻址内部数据存储器访问整个内部地址空间256 字节bdata位寻址内部数据存储器允许位和字节混合寻址16 字节xdata外部数据存储器64K 字节通过 MOVX DPTR 访问pdata页外部数据存储器256 字节通过 MOVX
27、Rn 访问存储器模型存储器模型决定用于函数自变量自动变量和没有明确存储类型的变量的默认存储器类型在命令行中使用 SMALLCOMPACT 和 LARGE 控制命令指定存储器类型SMALL 在该模型中所有变量都默认位于 8051 内部数据存储器这和使用 data 指定存储器类型的方式一样此模型对于变量访问的效率很高但所有的数据对象和堆栈必须适合内部 RAM堆栈的大小很关键因为使用的堆栈空间是由不同函数嵌套的深度决定的通常如果 BL51 连接器/定位器将变量都配置在内部数据存储器内SMALL 模型是最佳选择COMPACT使用 COMPACT 模型所有变量都默认在外部数据存储器的一页内这和使用 pd
28、ata指定存储器类型一样该存储器类型适用于变量不超过 256 个字节此限制是由寻址方式所决定的该存储器模型的效率低于 SMALL 模型对变量访问的速度要慢一些但比 LARGE 模型快地址的高字节通常通过口 2 设置编译器没有设置该口LARGE在 LARGE 模型中所有变量都默认位于外部数据存储器这和使用 xdata 指定存储器类型一样使用数据指针DPTR进行寻址通过数据指针访问外部数据存储器的效率较低特别是当变量为 2 个字节或更多字节时该模型的数据访问比 SMALL 和 COMPACT 产生更多的代码指针C51 编译器支持使用*号说明的指针可以使用指针执行标准 C 中所有可执行的操作但由于8
29、051 及其派生器件的独特结构C51 支持两种不同类型的指针存储器特殊指针和普通指针普通指针普通指针的说明和标准 C 指针相同例如char*s;/*string ptr*/int*numptr/*int ptr*/long*state/*long ptr*/普通指针总是使用三个字节进行保存第一个字节用于存储器类型第二个字节用于保存偏移量的高字节第三个字节用于保存偏移量的低字节普通指针可以访问 8051 存储空间任何位置的变量因此许多库程序使用此类型的指针使用这种普通隐式指针可访问数据而不用考虑数据在存储器中的位置存储器特殊指针在指针的说明中存储器特殊指针总是包含存储器类型的指定并总是指向一个特
30、定的存储器区域例如char data*str;/*ptr to string in data*/int xdata*numtab;/*ptr to int(s)in xdata*/广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:387309259long code*powtab;/*ptr to long(s)in code*/由于存储器类型在编译时指定因此无类型指针需要存储器类型字节而已定义类型指针则不需要已定义类型指针可用一个字节idata,data,bdata 和 pdata 指针或两个字节code 和 xdata
31、 指针存储比较存储器特殊&普通指针用户可通过存储器特殊指针加速 8051C 程序下面的例子为几个不同指针说明中代码&数据规模和执行时间之间的差异描述idata 指针Xdata 指针Generic 指针示例程序char idata*ip;char xdata*xp;char*p;char val;char val;char val;val=*ip;val=*xp;val=*p;所产生的 8051 程MOV R0,ipMOV DPL,xp+1MOV R1,p+2序代码MOV val,R0MOV DPH,xpMOV R2,p+1MOV A,DPTRMOV val,AMOV R3,pCALL CLDP
32、TR指针大小1 字节数据2 字节数据3 字节数据代码大小4 字节代码9 字节代码11 字节代码+Lib.执行时间4 个周期7 个周期13 个周期再入函数再入函数可以同时由几个程序共用当执行再入函数时其它程序可以中断执行并开始执行同一个再入函数通常C51 函数不能递归调用或用于导致重入的方式受到该限制是因为函数自变量和局部变量都存放在固定的存储器位置再入函数属性允许说明那些可以重入的函数因此可以实现递归调用例如int calc(char i,int b)reentrantint x;x=table ireturn(x*b)再入函数可以递归调用也可以同时被两个或更多程序调用它经常用于实时应用或中断
33、代码和非中断代码必须共用一个函数的情况对于每个再入函数根据存储器的模型在内部或外部存储器模拟再入堆栈区中断函数当中断发生时C51 编译器提供一个调用 C 函数的方法这使用户可以用 C 创建中断服务程序用户只需要关心中断数和选择的寄存器组编译器自动产生中断向量和进入及退出代码中断函数属性当包含在一个说明中时指定所关联的函数为中断函数此外用户可以指定用于中断的寄存器组unsigned int interruptcnt;unsigned char second;void timer0(void)interrupt 1 using 2 if(+interruptcnt=4000)/*count to
34、4000*/second+;/*second counter*/interruptcnt=0;/*clear int counter*/参数传递C51 编译器在 CPU 寄存器中最多可传递三个函数自变量由于自变量不必从存储器中读写因此广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:3873092510显著地提高了系统的性能参数的传递可通过 REGPARMS 和 NOREGPARMS 控制命令进行控制下表列出了用于不同自变量和数据类型的寄存器自变量数char1 字节指针int,2 字节指针long,float普通指针123
35、R7R5R3R6&R7R4&R5R2&R3R4-R7R1-R3如果没有寄存器可用于参数传递或包含的参数太多使用固定存储器位置传递超出部分的参数函数返回值CPU 寄存器总是用于函数返回值下表列出了返回类型和所用的寄存器返回类型寄存器描述bit进位标志char,unsigned char,1-byte pointerR7int,unsigned int,2-byte pointerR6&R7R6 为高字节R7 为低字节long,unsigned longR4 R7R4 为高字节R7 为低字节floatR4 R732 位 IEEE 格式generic pointerR1 R3存储器类型在 R3 中
36、R2 为高字节 R1为低字节寄存器优化根据程序的前后关系C51 编译器最多分配 7 个 CPU 寄存器用于寄存器变量函数执行中的任何寄存器修改都由 C51 编译器在每个模块中标明连接器/定位器产生一个总体的寄存器文件其中包含了所有被外部函数改变的寄存器的信息因此C51 编译器知道在应用中被每个函数使用的寄存器并优化每个 C 函数的寄存器分配实时操作系统支持C51 编译器很好地集成了 RTX-51 多任务实时操作系统在连接过程中产生并控制任务描述表详细内容参考第七章 实时内核汇编接口从 C 可以很容易地访问汇编程序反之亦然函数参数通过 CPU 寄存器进行传递或使用NOREGPARMS 命令时通过
37、固定存储器位置进行传递函数返回值总是在 CPU 寄存器中传递用户可以使用 SRC 命令指导 C51 编译器产生一个准备用 A51 汇编器汇编的文件而不是一个目标文件例如下面的 C 源文件unsigned int asmfunc1(unsigned int arg)return(1+arg);当使用 SRC 命令编译时产生下列汇编输出文件?PR?asmfunc1?ASM1SEGMENT CODEPUBLICasmfunc1RSEG?PR?_asmfunc1?ASM1USING 0asmfunc1:;-Variablearg?00assigned to Register R6/R7-MOVA,R7
38、ADDA,#01H;load LSB of the intMOVR7,A;put it back into R7CLRAADDCA,R6;add carry&R6MOVR6,A广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:3873092511?C0001:RET;return result in R6/R7可以使用#pragma asm 和#pragma endasm 预处理程序命令将汇编指令插入到 C 源代码中与 PL/M-51 的接口Intel 的 PL/M-51 是一种广泛使用的编程语言它在许多方面和 C 相似用
39、户可以轻松地将 C 程序和 PL/M-51 程序连接起来代码优化C51 编译器是一个主动优化编译器意思是说编译器采取一定的步骤确定产生的代码和输出的目标文件是高效的代码编译器分析所产生的代码并使之成为最高效的指令序列这确保了 C 程序在最小程序空间内实现尽可能高效的运行C51 编译器提供 6 种不同级别的优化高级优化包含低级优化下面列出了 C51 编译器可执行的所有优化?常量合并一个表达式或地址计算式内的几个常量合并成一个常量?跳转优化跳转反演或扩展为最终目标地址使程序效率得以提高?无用代码消除将不可能执行的代码无用码从程序中删除?寄存器变量自动变量和函数自变量尽可能放在寄存器中没有为这些变量
40、保留数据存储器空间?参数通过寄存器传递通过寄存器最多可传递 3 个函数自变量?全局共用的子表达式消除将在一个函数中多次出现的子表达式和地址计算式尽可能只计算一次8051 特殊优化?窥孔优化当存储器空间或时间可作为结果保存时用简化操作代替复杂操作?访问优化在操作中直接计算并包含常量和变量?数据覆盖数据和位段函数被认为是可覆盖的并通过 BL51 连接器/定位器用其它数据和位段覆盖?Case/Switch 优化Case 和 Switch 语句根据它们的数据序列和位置可以使用跳转表或跳转串进行优化代码产生选项?OPTIMIZESIZE子程序代替共用的 C 操作在降低程序运行速度的前提下减小了程序代码占
41、用的空间?OPTIMIZESPEED共用的 C 操作内嵌扩展增加程序代码的规模换取程序速度的提高?NOAREGSC51 编译器不再使用绝对寄存器访问程序代码独立于寄存器组?NOREGPARMS参数传递总是在局部数据段内而不是在专门寄存器内进行使用pragma创建的程序代码和 C51 编译器PL/M-51 编译器和 ASM-51 汇编器的较早版本兼容全局寄存器优化C51 编译器支持宽范围的寄存器优化下面的例子为 C51 5.0 版和 C51 3.4 版的比较由于使用应用寄存器优化C51 编译器知道由外部函数使用的寄存器不由外部函数改变的寄存器用于寄存器变量这样所产生的代码占用更少的数据和代码空间
42、并且执行得更快在下面的例子中input 和 output 为外部函数仅需占用几个寄存器带全局寄存器优化 无全局寄存器优化main()广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:3873092512unsigned char i;unsigned char a;while(1)i=input();/*get number of values*/?C0001:?C0001:LCALL inputLCALL input;-assigned to R6-MOV DPTR,#iMOV R6,AR7MOV A,R7MOV DPT
43、R,Ado a=input();/*get input value*/?C0005:?C0005:LCALL inputLCALL input;-assigned to R7-MOV DPTR,#aMOV R5,AR7MOV A,R7MOVX DPTR,Aoutput(a);/*output value*/LCALL _output LCALL _output while(-i);/*decrement values*/DJNZ R6,?C0005 MOV DPTR,#iMOVX A,DPTRDEC AMOVX DPTR,AJNZ?C0005SJMP?C0001 SJMP?C0001RET R
44、ET代码规模18 字节 代码规模30 字节调试C51 编译器使用 Intel 目标格式OMF51并产生完全的符号信息此外编译器可以包含所有需要的信息例如变量名函数名和行数等等这样可以用 dsope-51 或 Intel 兼容的仿真进行详细完全的调试和分析所有 Intel 兼容仿真器都可用作程序调试此外OBJECTEXTEND 控制命令将额外的变量类型信息嵌入目标文件用户必须向仿真器供应商确认是否和 Intel OMF51 目标模块兼容以及是否能接受 Keil 的目标模块库文件C51 编译器包含了 7 个不同的 ANSI 编译库文件可根据不同的功能要求进行优化库文件描述C51S.LIBSmall
45、 model library without floating-point arithmeticC51FPS.LIBSmall model floating-point arithmetic libraryC51C.LIBCompact model library without floating-point arithmeticC51FPC.LIBCompact model floating-point arithmetic libraryC51L.LIBLarge model library without floating-point arithmeticC51FPL.LIBLarge
46、model floating-point arithmetic library80C751.LIBLibrary for use with the Philips 8xC751 and derivatives.广州周立功单片机发展有限公司 Tel02038730916 38730917 38730976 38730977 Fax:3873092513源代码提供给执行硬件相关 I/O 功能的库模块并建立在C51LIB 目录下用户可使用这些源文件帮助执行目标硬件中 I/O 器件的 I/O 功能内部库程序编译器所带的库包括了许多作为内部函数的程序非内部函数产生 ACALL 或 LCALL 指令执行库
47、程序内部库程序产生嵌入代码更快且更有效率执行库程序内部函数描述_crol_字符循环左移_cror_字符循环右移_irol_整数循环左移_iror_整数循环右移_lrol_长整数循环左移_lror_长整数循环右移_nop_空操作8051 NOP 指令_testbit_测试并清零位8051 JBC 指令列表文件举例C51 编译器产生一个列表文件其中包含源代码命令信息汇编列表和符号表C51 COMPILER V5.02,SAMPLE 07/01/95 08:00:00 PAGE 1The C51 compiler produces aDOS C51 COMPILER V5.02,COMPILATIO
48、N OF MODULE SAMPLElisting file with page numbersOBJECT MODULE PLACED IN SAMPLE.OBJas well as time and date ofCOMPILER INVOKED BY:C:C51BINC51.EXE SAMPLE.C CODEthe compilation.Remarksstmt level sourceabout the compiler invocation1#include /*SFR definitions for 8051*/and object file output are2#include
49、/*standard i/o definitions*/displayed in this listing.3#include /*defs for char conversion*/45#define EOT 0 x1A/*Control+Z signals EOT*/The listing includes a line6number for each statement7 void main(void)and a nesting level for each8 1 unsigned char c;block enclosed within curly9 1braces(and).10 1
50、/*setup serial port hdw(2400 Baud 12 MHz)*/11 1 SCON=0 x52;/*SCON*/12 1 TMOD=0 x20;/*TMOD*/13 1 TCON=0 x69;/*TCON*/14 1 TH1=0 xF3;/*TH1*/15 1Error messages and16 1 while(c=getchar()!=EOF)warning messages are17 2 putchar(toupper(c);included in the listing file.18 2 19 1 P0=0;/*clear Output Port to si