keil预处理命令及方法.ppt

上传人:本田雅阁 文档编号:2103422 上传时间:2019-02-14 格式:PPT 页数:25 大小:123.01KB
返回 下载 相关 举报
keil预处理命令及方法.ppt_第1页
第1页 / 共25页
keil预处理命令及方法.ppt_第2页
第2页 / 共25页
keil预处理命令及方法.ppt_第3页
第3页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《keil预处理命令及方法.ppt》由会员分享,可在线阅读,更多相关《keil预处理命令及方法.ppt(25页珍藏版)》请在三一文库上搜索。

1、第14章 预处理及用户配置文件,预处理命令通常在程序编译时进行一些符号处理,其并不执行具体的硬件操作。C51语言中的预处理命令主要有宏定义指令、文件包含指令和条件编译指令,还有其他一些调试时使用的指令。本章将详细介绍各种预处理命令以及C51的用户配置文件,并结合一定的程序实例以加深理解。本章包括: 宏定义指令 文件包含指令 条件编译指令 C51编译器的控制指令 C51的用户配置文件,14.1 预处理命令概述,C51语言中提供了各种预处理命令,类似于汇编程序中的伪指令。一般来说,在对源程序进行编译前,C51编译器需要先对程序中的预处理命令进行处理,然后将预处理的结果与源程序一并进行编译,最后产生

2、目标代码。通过这些预处理命令,在很大程度上为C51提供功能和符号等方面的扩展,使用预处理命令也可以提高程序的可读性。 为了与源程序中的语句相区别,预处理命令前要加一个“#”。C51程序中的预处理命令包括以下几个: #define /用于宏定义 #error /用于程序调试 #include /用于文件包含 #if /用于条件编译 #else /用于条件编译 #elif /用于多种条件编译选择 #endif /用于条件编译 #ifdef /用于条件编译 #ifndef /用于条件编译 #undef /用于宏定义 #line /用于更改行号 #pragma /用于传送控制指令,14.2 宏定义指令

3、,宏定义指令是用一些标识符作为宏名来代替一些符号或者常量的命令。宏定义指令可以带参数,也可以不带参数。下面分别介绍用于宏定义的一些预处理指令。,14.2.1 #define命令,#define命令用于定义一个“宏名”。其中“宏名”是一个标识符,在源程序中遇到该标识符时,均以定义的串的内容替代该标识符。ANSI标准将标识符定义为“宏名”,这个替换过程称为“宏替换”。#define命令用于定义宏名时,可以带参数,也可以不带参数,下面分别介绍这两种情况。 1不带参数的宏定义 不带参数的宏定义,其一般形式如下: #define 标识符 字符串 其中,#define是宏定义指令,标识符即宏名,字符串是被

4、替换的对象。典型的宏定义指令示例如下: #define TURE 1 #define FALSE 0 #define PI 3.1415926 2带参数的宏定义 带参数的宏定义指令,其一般形式如下: #define 宏名(参数表) 字符串,14.2.2 #undef命令,#undef命令用于取消前面已定义过的宏名。一般形式为: #undef 宏名 其中,宏名为前面用#define定义过的标识符。使用#undef的目的是将宏名局限在仅需要的代码段中。示例如下: #include /头文件 #define COUNT 25 /宏定义 void main() /主函数 printf(“COUNT =

5、%dn“, COUNT); /输出COUNT =10 #undef COUNT /撤销宏定义 /printf(“COUNT =%dn“, COUNT); /此时再引用是错误的 ,14.3 文件包含指令,文件包含指令#include通常在C51程序的开头,将另外一文件的内容引入当前文件。其中被包含的文件通常是头文件、宏定义等,利用文件包含指令可以有助于更好地调试文件。其一般形式如下: #include “头文件.h“ #include #include 宏定义标识符,14.4 条件编译指令,条件编译指令用于对程序源代码的各部分有选择地进行编译。采用条件汇编,可以提高程序的适用性,缩小目标代码的大

6、小。 在默认情况下,源程序中的所有行都要进行编译。但是有时需要某些语句行在条件满足的情况下,才进行编译,此时便用到条件编译指令。目前商业软件公司广泛应用条件编译来制作某个程序的许多不同用户版本。,14.4.1 #if、#else、#endif命令,#if、#else、#endif指令用于条件编译的一般形式如下: #if 常数表达式 语句段; #else 语句段; #endif 其中,#if、#else、#endif为条件编译指令,常数表达式为判断的条件,语句段为条件编译部分。执行过程为,如果常量表达式为真,则编译其后面的语句段;如果常量表达式为假,则编译#else后面的语句段;#endif命令

7、是一个条件编译的结束。,14.4.2 #elif命令,#elif命令用于进行多种编译选择。其意义与“else if”相同,形成一个if-else-if阶梯状语句。此时条件编译的一般形式如下: #if 表达式0 语句段; #elif 表达式1 语句段; #elif 表达式2 语句段; #elif 表达式3 语句段; #elif 表达式n 语句段; #endif,14.4.3 #ifdef、#ifndef命令,#ifdef与#ifndef命令用于判断宏名是否被定义,并根据判断的情况进行条件编译。#ifdef命令的一般形式是: #ifdef 宏名 语句段; #endif 其执行过程是,如果宏名在前面

8、#define语句中已定义过,则后面的语句段将被编译。#ifndef的一般形式是: #ifndef宏名 语句段; #endif,14.5 其他编译指令,除了以上几种预处理指令外,在C51语言中还定义了其他几种编译预处理指令,主要用于编译和调试程序等。下面分别进行讲解。,14.5.1 #line命令,#line命令用于改变_LINE_与_FILE_的内容。其中_LINE_和_FILE_是在编译程序中预先定义的标识符,分别表示行号和源文件。#line命令使用的一般形式如下: #line 数字“文件名“ 其中的数字为任意正整数,可选的文件名为任意有效文件标识符。行号为源程序中当前行号,文件名为源文件

9、的名字。命令#line主要用于调试及其他特殊应用。,14.5.2 #error,#error命令用于强迫编译程序停止编译,主要用于程序调试。其使用的一般形式如下: #error “message” 其中,message为错误消息。这里举例讲解#error命令在程序设计中的应用,示例如下: #include /头文件 #define SCORE 85 /宏定义 void main() /主函数 #ifdef SCORE /条件编译 printf(“SCORE existed!n“); /如果宏SCORE存在,则执行该语句 #else #error “No SCORE!n“ /如果宏SCORE不存

10、在,则执行该处 #endif #ifndef GREED #error “GREED is not defined!n“ /如果宏GREED存在,则执行该处 #else printf(“GREED is defined!n“); /如果宏GREED不存在,则执行该语句 #endif ,14.5.3 #pragma,#pragma命令用于向编译程序传送各种C51编译器的控制指令。根据#pragma指令后面的字符串,编译系统将按照特定的方式来翻译C51的字符串和函数。 #pragma指令后面的字符串,可以大写,也可以小写。示例如下: #pragma sfr /在C51中使用SFR #pragma

11、access /使用绝对地址 #pragma asm /在C51中插入汇编语句,14.6 C51编译器的控制指令,C51编译器的控制指令分为三类:源文件控制类、目标文件控制类及列表控制类。这些指令可能需要具体的编译器支持,因此这里仅进行简单的说明,用户可以参考具体的编译器。对于Keil Vision3集成开发环境,可以在项目选项中进行设置。下面分别介绍各类中常用的控制指令。,14.6.1 源文件控制类,比较常用的有如下两个,具体介绍可以参加相应的编译器。 NOEXTEND:C51源文件不允许使用ANSIC扩展功能; DEFINE(DF):定义预处理(在C51命令行)。,14.6.2 目标文件(

12、Object)控制类,比较常用的有如下几个,详细内容需要参加所使用的编译器。 COMPACT LARGE SMALL:选编译模式; DEBUG(DB):包含调试信息,以供仿真器或dSCope51使用; NOAMAKE(NOAM):禁止AutoMake信息记录; NOREGPARMS:禁止用寄存器传递参数; OBJECTEXTEND(OE) Object:文件包含附加变量类型信息; OPTIMIZE(OT):指定优化级别; REGFILE(RF):指定一个寄存器使用的文件以供整体优化用; REGISTERBANK(RB):指定一个供绝对寄存器访问的寄存器区名; SRC:不生成目标文件只生成汇编源

13、文件。,14.6.3 列表文件(Listing)控制类,比较常用的有如下几个,详细内容需要参加所使用的编译器。 CODE(CD):向列表文件加入汇编列表; LISTINCLUDE(LC):显示include文件; SYMBOLS(SB):列表文件包括模块内所有符号的列表; WARNINGLEVEL(WL):选择“警告”级别。,14.7 C51的用户配置文件,C51的用户配置文件包括启动代码文件、变量初始化文件、基本I/O函数文件、分组配置文件,这些文件都是以源程序的形式存放在KeilC51LIB文件夹中。用户根据需要适当修改配置文件以满足不同的硬件环境需要。 C51编译器在对用户创建的项目进行

14、编译连接时,会自动将上述代码添加到用户程序中去。需要修改配置文件时,可以通过Keil Vision3的项目窗口,将需要修改的配置文件添加到自己的文件组中,并在编辑窗口进行修改,然后进行总体编译连接,这样就可以将修改后的配置文件代码连接到自己的程序代码中。,14.7.1 C51启动代码文件,C51启动代码文件用于在主程序进入main()函数之前,完成对8051单片机片内外RAM清零、开设常规堆栈以及再入函数堆栈、设置堆栈指针等任务。Keil Vision3编译器针对不同类型的8051单片机提供了多种启动代码配置文件,其中最常用的启动代码文件是 STARTUP.A51,而其他的启动代码都和其基本类

15、似。 启动代码文件 STARTUP.A51的主要功能包括如下几个方面: 定义内部RAM大小、外部RAM大小、可重入堆栈位置。 清除内部、外部或者以此页为单元的外部存储器。 按存储模式初使化重入堆栈及堆栈指针。 初始化8051硬件堆栈指针。 向main()函数交权。,14.7.2 C51启动代码分析,前面介绍了C51的启动代码,下面详细介绍上面的启动代码文件中常用的一些EQU语句的功能。 1IDATALEN 2XDATASTART、XDATALEN 3PDATASTART、PDATALEN 4IBPSTACK、IBPSTACKTOP 5XBPSTACK、XBPSTACKTOP 6PBPSTACK

16、、PBPSTACKTOP 7PPAGEENABLE、PPAGE,14.7.3 变量初始化文件,变量初始化文件用于对源程序中声明的变量进行初始化赋值。在Keil Vision3编译环境中,主要的变量初始化文件为INIT.A51,此外还提供了INIT_TNY.A51文件用于不使用外部XDATA存储器的实时系统。 当C51源程序中包含有初始值的外部变量和静态变量时,连接定位器BL51将会自动将该目标代码加入到C51源程序的前面,对已确定初始化的外部变量和静态变量进行赋值。这是因为变量初始化文件的目标代码已经驻留在Keil Vision3的编译器的运行库内。,14.7.4 基本I/O函数文件,基本I/

17、O函数文件有两个:PUTCHAR.C和GETKEY.C。 PUTCHAR.C用于将字符串从串行口输出。其采用XON/XOFF协议进行控制,将换行字符“LF”(n)被转换为“CR,LF”(rn)。在Keil Vision3编译器中,是printf、puts等函数的字符输出核心函数。用户可以根据自己的需要来修改该文件,用以实现特定的输出效果,例如LCD或LED显示等。 GETKEY.C用于字符的串口输入。其不进行数据转换。在Keil Vision3编译器中,是C51编译器运行库中的getchar、scanf等函数的字符输入核心函数。用户可以根据自己的需要来修改该文件,用以实现特定的输入效果,例如做

18、矩阵键盘的输入等。,14.7.5 分组配置文件,分组配置文件用于对用户程序进行代码分组设计。在Keil Vision3编译器中提供了两个分组配置文件,分别介绍如下: 由于传统的8051单片机只能将ROM扩展到最大4MB,而新一代扩展型单片机可将其存储器范围扩展到最大16MB。为此提供了L51_BANK.A51、XBANKING.A51等分组配置文件。 1L51_BANK.A51文件 L51_BANK.A51文件用于传统8051单片机的分组代码设计。其ROM最大只能扩展到4MB,在对有C51编译器生成的浮动代码目标文件进行连接定位时,应采用BL51连接定位器。 2XBANKING.A51文件 XBANKING.A51文件用于新一代80C51单片机的分组代码设计。其支持far和far const储存器类型变量,扩展连接定位器Lx51通过far和far const储存器类型来访问扩展HDATA和HCONST存储器地址空间。,14.8 小结,本章详细介绍了C51语言所支持的各种预处理命令,包括宏定义指令、文件包含指令、条件编译指令和其他一些编译指令。然后还介绍了C51编译器的一些控制指令,这需要和具体的编译器相联系。最后还介绍了一下C51的用户配置文件。熟练掌握本章,对以后的程序设计有很大帮助。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1