C51的预处理命令和.ppt

上传人:max****ui 文档编号:3402934 上传时间:2019-12-13 格式:PPT 页数:22 大小:335.81KB
返回 下载 相关 举报
C51的预处理命令和.ppt_第1页
第1页 / 共22页
C51的预处理命令和.ppt_第2页
第2页 / 共22页
C51的预处理命令和.ppt_第3页
第3页 / 共22页
点击查看更多>>
资源描述
第8章C51的预处理命令和用户配置文件,用户编写的C51程序代码只能控制程序的执行流程,若要对编译程序进行操作,就要用到预处理命令。在编译环境对源程序进行编译前,先对程序中的预处理命令进行处理,然后将处理结果和源程序一起进行编译。预处理命令通常只进行一些符号的处理,其并不执行具体的单片机硬件操作。C51语言中的预处理命令包括文件包含指令、宏定义指令和条件编译指令等,还有其他一些指令在程序调试时使用。本章将详细介绍各种常用的预处理命令的用法,同时还介绍了C51的用户配置文件相关的内容。,8.1C51的预处理命令概述,C51语言中提供了各种预处理命令,其作用类似于汇编程序中的伪指令。一般来说,在对C51源程序进行编译前,编译器需要先对程序中的预处理命令进行处理,然后将预处理的结果和源代码一并进行编译,最后产生目标代码。预处理命令通常只进行一些符号的处理,其并不执行具体的硬件操作。为了与C51源代码中的程序语句相区别,预处理命令前要加一个“#”。C51语言中的预处理命令,如表所示。,C51的预处理命令,8.2文件包含指令,文件包含指令,即#include命令,通常位于C51源程序的开头,利用#include命令可以将其他的文件引入当前的C51源文件。其中被包含的文件通常是头文件、宏定义等。使用文件包含指令,有利于更好地调试C51源文件。当需要调试修改文件时,只要修改某一包含文件即可,而无需对所有文件进行修改。,8.2.1#include命令,在C51语言中,文件包含指令的一般形式如下:#include头文件.h#include#include宏定义标识符其中,“#include”表示文件包含指令、双引号或尖括号括起来的文件名是要引入的源文件。典型的文件包含指令示例如下:#includemyfile.h/引用自定义文件myfile#include/引用库函数文件studio#include/引用寄存器文件defineMATH_FILECkeilincmath1.h/宏定义自定义文件MATH_FILE#includeMATH_FILE/引用自定义文件MATH_FILE,8.2.2C51常用的头文件,在KeilVision3集成开发环境中,C51标准库提供了许多包含文件,即C51的头文件。这些文件存放在目录KeilC51INC文件夹及其子目录下。这些头文件包含常数、宏定义、类型定义和函数原型等。C51常用的头文件如下:absacc.h包含允许直接访问8051不同存储区的宏定义。asscert.h文件定义asscert宏,用来建立程序的测试条件。ctype.h常用的字符转换和分类程序。intrins.h文件包含指示编译器产生嵌入原有代码的程序的原型。math.h常用数学程序。reg51.h51系列单片机特殊寄存器。reg52.h52系列单片机特殊寄存器。setjmp.h定义jmp_buf类型以及setjmp和longjmp程序的原型。stdarg.h可变长度参数列表程序。stdlib.h存储区分配程序。stdio.h常用的输入和输出程序。string.h常用的字符串操作程序和缓冲区操作程序。,8.3宏定义指令,宏定义指令是指用一些标识符作为宏名,来代替其他一些符号或者常量的预处理命令。使用宏定义指令,可以减少程序中字符串输入的工作量,而且可以提高程序的可移植性。宏名既可以是字符串或常数,也可以是带参数的宏。宏定义指令可分为带参数的宏定义和不带参数的宏定义。下面分别介绍用于宏定义的一些预处理命令。,8.3.1#define命令,#define命令用于定义一个宏名。宏名是一个标识符,在源代码中遇到该标识符时,均以宏定义的串的内容代替该标识符。ANSI标准宏将定义的标识符称为“宏名”,而用定义的内容代替宏名的过程称为“宏替换”。#define命令用于定义宏名时,既可以带参数,也可以不带参数,下面分别介绍这两种情况。1不带参数的宏定义2带参数的宏定义,8.3.2#undef命令,#undef命令用于取消前面用#define命令定义过的宏名。一般形式为:#undef宏名其中,“#undef”是取消宏定义指令,“宏名”为前面用#define命令定义过的标识符。使用#undef命令的目的是将宏名局限在指定的代码段中,这样可以限制宏定义的使用范围。使用#undef命令的程序示例如下:#include/头文件#defineCOUNT50/宏定义voidmain()/主函数printf(COUNT=%dn,COUNT);/输出COUNT=50#undefCOUNT/撤销COUNT宏定义/printf(COUNT=%dn,COUNT);/此时再引用COUNT是错误的,8.4条件编译指令,在默认情况下,源程序中的所有程序代码都要进行编译。但是有时需要某些语句行在条件满足的情况下,才进行编译,此时便用到条件编译指令。目前商业软件公司广泛应用条件编译来制作某个程序的不同用户的版本,例如专业版、个人版、试用版等,从而可以限制软件的某些功能。条件编译指令是指对源程序的代码有选择地进行编译。采用条件编译,可以提高程序的广泛的适用性,缩小目标源代码的大小,加快程序执行的速度。C51的条件编译指令有#if、#else、#ifdef、#ifndef、#endif这几个命令。下面分别介绍这些命令的用法。,8.4.1#if、#else和#endif命令,#if、#else和#endif命令是一组常用的条件编译指令,用于进行条件编译,其一般形式如下:#if常量表达式语句段;#else语句段;#endif其中,“#if”、“#else”、“#endif”为条件编译指令,“常量表达式”为进行条件编译的判断条件,语句段为进行条件编译的程序代码段。,8.4.2#elif命令,#elif命令用于进行在多种编译条件下进行选择编译的情况。其含义与“elseif”相同,形成一个阶梯状编译语句。使用#elif命令的一般形式如下:#if表达式0语句段;#elif表达式1语句段;#elif表达式2语句段;#elif表达式n语句段;#endif,8.4.3#ifdef、#ifndef命令,#ifdef与#ifndef命令用于判断宏名是否被定义过,并根据判断的情况进行条件编译。#ifdef命令的一般形式是:#ifdef宏名语句段;#else语句段;#endif,8.5其他编译指令,#line命令用于修改_LINE_与_FILE_的内容。其中“_LINE_”和“_FILE_”是在编译程序中预先定义的标识符,分别表示行号和源文件。#line命令主要用于调试及其他一些特殊的应用。使用#line命令的一般形式如下:#line数字文件名其中,“数字”为任意正整数,表示源程序中当前语句的行号;“文件名”为可选的任意有效文件标识符,表示源文件的名字。使用#line命令的程序示例如下:#include/头文件#line300/初始化行计数器voidmain()/行号300/行号301printf(LineNumber=%dn,_LINE_);/行号302,8.5.1#line命令,#error命令用于强制使编译程序停止编译操作的编译指令,并同时输出错误信息提示。该命令主要用于程序调试。其使用的一般形式如下:#error“message”其中,“message”为显示的错误提示的信息。#error命令的程序示例如下:#include/头文件#defineSCORE85/宏定义voidmain()/主函数#ifdefSCORE/条件编译printf(SCOREisdefined!n);/如果宏SCORE存在,则执行该语句#else#errorSCOREisnotdefined!n/如果宏SCORE不存在,则执行该处#endif#ifndefGREED#errorGREEDisnotdefined!n/如果宏GREED存在,则执行该处#elseprintf(GREEDisdefined!n);/如果宏GREED不存在,则执行该语句#endif,8.5.2#error命令,#pragma命令用于向编译程序传送各种C51编译器的控制指令。根据#pragma指令后面的字符串,编译系统将按照特定的方式来编译C51的字符串和函数。其使用的一般形式如下:#pragma字符串其中,#pragma指令后面的字符串,可以大写,也可以小写。#pragma指令示例如下:#pragmasfr/在C51中使用SFR#pragmaaccess/在C51中使用绝对地址#pragmaasm/在C51中插入汇编语句,8.5.3#pragma命令,#pragma命令用于向编译程序传送各种C51编译器的控制指令。根据#pragma指令后面的字符串,编译系统将按照特定的方式来编译C51的字符串和函数。其使用的一般形式如下:#pragma字符串其中,#pragma指令后面的字符串,可以大写,也可以小写。#pragma指令示例如下:#pragmasfr/在C51中使用SFR#pragmaaccess/在C51中使用绝对地址#pragmaasm/在C51中插入汇编语句,8.6C51的用户配置文件,C51的用户配置文件是用来在程序执行前,配置单片机系统的一些相关设置。在C51中,用户可以根据需要适当修改配置文件以满足不同的硬件环境需要。这些用户配置文件存放在KeilC51LIB文件夹中。C51编译器在对用户创建的项目进行编译连接时,会自动将用户配置文件中的代码添加到用户程序中去。如果用户要对配置文件进行修改,可以通过KeilVision3的项目窗口,先将需要修改的配置文件添加到自己的项目文件组中,然后在编辑窗口进行修改,最后再进行总体编译连接,这样就可以将修改后的用户配置文件代码连接到自己的源程序代码中。C51的用户配置文件包括启动代码文件、变量初始化文件、基本I/O函数文件、分组配置文件几类。下面分别介绍这几类用户配置文件。,8.6.1C51的启动代码详解,C51启动代码文件用于在源程序进入主函数前,完成对单片机片内外RAM清零、开设常规堆栈和再入函数堆栈、设置堆栈指针等任务。在KeilVision3编译环境中,针对不同类型的8051单片机提供了多种启动代码配置文件,其中最常用的启动代码文件是STARTUP.A51,其他的启动代码都和STARTUP.A51作用相似。这里以启动代码文件STARTUP.A51为例进行介绍,其可以实现以下几方面功能:定义内部RAM大小、外部RAM大小和可重入堆栈位置。初始化8051硬件堆栈指针。按存储模式初使化重入堆栈及堆栈指针。清除内部、外部或者以此页为单元的外部存储器。向主函数main()交权。,8.6.2C51的变量初始化文件,变量初始化文件用于对源程序中声明的变量进行初始化赋值。在KeilVision3集成开发环境中,主要的变量初始化文件为INIT.A51。此外,对于不使用外部XDATA存储器的RTX-51TINY实时操作系统,还提供了INIT_TNY.A51变量初始化文件。变量初始化文件的目标代码已经驻留在KeilVision3的编译器的运行库内。当用户的C51源程序中包含有初始值的外部变量和静态变量时,连接定位器BL51将会自动将该变量初始化文件代码加入到C51源程序的前面,对已确定初始化的外部变量和静态变量进行赋值。如果需要对变量初始化文件进行修改,可以将其添加到用户自己的项目文件中,修改完毕后重新对项目进行编译即可。变量初始化文件INIT.A51包含一个看门狗定时器的宏定义WATCHDOG。如果程序使用了看门狗定时器,并且对变量初始化处理所需的时间比看门狗定时器的刷新时间要长。此时宏定义WATCHDOG中必须包含看门狗刷新时间的代码。,8.6.3C51的基本I/O函数文件,在KeilC51中提供了一些常用的I/O函数,主要有两个:PUTCHAR.C和GETKEY.C。用户可以直接调用,而不需要重新编写,这样可以大大节省程序开发的时间。下面分别介绍这两个文件。PUTCHAR.C用于将字符串从8051单片机的串行口输出。其采用XON/XOFF协议进行控制,将换行字符“LF”(n)被转换为“CR,LF”(rn)。在KeilVision3集成开发环境中,是printf、puts等函数的字符输出核心函数。用户也可以根据自己的需要来修改该文件中的函数,从而实现特定的输出效果,例如LCD或LED显示等。GETKEY.C用于字符的串口输入,其不进行数据转换。在KeilVision3集成开发环境中,是C51编译器运行库中的getchar、scanf等函数的字符输入核心函数。用户也可以根据自己的需要来修改该文件中的函数,可以实现特定的输入效果,例如44矩阵键盘的输入等。,8.6.4C51的分组配置文件,C51的分组配置文件用于对源程序进行代码分组设计。由于传统的8051单片机只能将ROM扩展到最大4MB,而新一代扩展型单片机可将其存储器范围扩展到最大16MB。因此,在KeilVision3集成开发环境中提供了两个分组配置文件,L51_BANK.A51和XBANKING.A51,分别介绍如下:1L51_BANK.A51文件L51_BANK.A51文件用于基本的8051单片机的代码分组设计,其ROM最大只能扩展到4MB。在对KeilVision3集成开发环境生成的浮动代码目标文件进行连接定位时,应采用BL51连接定位器。2XBANKING.A51文件XBANKING.A51文件用于新型的80C51系列单片机的代码分组设计,其支持far和farconst储存器类型变量。在KeilVision3集成开发环境中,扩展连接定位器LX51通过far和farconst储存器类型来访问扩展HDATA和HCONST存储器地址空间。,8.7小结,本章详细介绍了C51语言所支持的各种预处理命令,包括文件包含指令、宏定义指令、条件编译指令和其他一些编译指令,详细地介绍了各指令功能和使用方法,在本部分还介绍了C51常用的头文件。这些内容都是实际编程中经常要用到的知识点,对于这些内容需要熟练掌握。在本章的最后还介绍了一下C51的用户配置文件,熟悉这些内容可以对C51编译原理和过程有更加深刻的认识,对以后程序设计会有很大的帮助。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!