第8章C51的预处理命令和

上传人:re****.1 文档编号:592355298 上传时间:2024-09-20 格式:PPT 页数:22 大小:140.50KB
返回 下载 相关 举报
第8章C51的预处理命令和_第1页
第1页 / 共22页
第8章C51的预处理命令和_第2页
第2页 / 共22页
第8章C51的预处理命令和_第3页
第3页 / 共22页
第8章C51的预处理命令和_第4页
第4页 / 共22页
第8章C51的预处理命令和_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《第8章C51的预处理命令和》由会员分享,可在线阅读,更多相关《第8章C51的预处理命令和(22页珍藏版)》请在金锄头文库上搜索。

1、第8章 C51的预处理命令和用户配置文件用户编写的C51程序代码只能控制程序的执行流程,若要对编译程序进行操作,就要用到预处理命令。在编译环境对源程序进行编译前,先对程序中的预处理命令进行处理,然后将处理结果和源程序一起进行编译。预处理命令通常只进行一些符号的处理,其并不执行具体的单片机硬件操作。C51语言中的预处理命令包括文件包含指令、宏定义指令和条件编译指令等,还有其他一些指令在程序调试时使用。本章将详细介绍各种常用的预处理命令的用法,同时还介绍了C51的用户配置文件相关的内容。8.1 C51的预处理命令概述C51语言中提供了各种预处理命令,其作用类似于汇编程序中的伪指令。一般来说,在对C

2、51源程序进行编译前,编译器需要先对程序中的预处理命令进行处理,然后将预处理的结果和源代码一并进行编译,最后产生目标代码。预处理命令通常只进行一些符号的处理,其并不执行具体的硬件操作。为了与C51源代码中的程序语句相区别,预处理命令前要加一个“#”。C51语言中的预处理命令,如表所示。C51的预处理命令预处理命令用途#define用于宏定义#error用于程序调试#include用于文件包含#if用于条件编译#else用于条件编译#elif用于多种条件编译选择#endif用于条件编译#ifdef用于条件编译#ifndef用于条件编译#undef用于宏定义#line用于更改行号#pragma用于

3、传送控制指令8.2 文件包含指令 文件包含指令,即#include命令,通常位于C51源程序的开头,利用#include命令可以将其他的文件引入当前的C51源文件。其中被包含的文件通常是头文件、宏定义等。使用文件包含指令,有利于更好地调试C51源文件。当需要调试修改文件时,只要修改某一包含文件即可,而无需对所有文件进行修改。 8.2.1 #include命令在C51语言中,文件包含指令的一般形式如下:#include 头文件.h#include #include 宏定义标识符其中,“#include”表示文件包含指令、双引号或尖括号括起来的文件名是要引入的源文件。典型的文件包含指令示例如下:#

4、include myfile.h/引用自定义文件myfile#include /引用库函数文件studio#include /引用寄存器文件define MATH_FILE Ckeilincmath1.h/宏定义自定义文件MATH_FILE#include MATH_FILE/引用自定义文件MATH_FILE 8.2.2 C51常用的头文件在Keil Vision3集成开发环境中,C51标准库提供了许多包含文件,即C51的头文件。这些文件存放在目录KeilC51INC文件夹及其子目录下。这些头文件包含常数、宏定义、类型定义和函数原型等。C51常用的头文件如下:absacc.h包含允许直接访问8

5、051不同存储区的宏定义。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 宏定义指令宏定义指令是指用一些标识符作为宏名

6、,来代替其他一些符号或者常量的预处理命令。使用宏定义指令,可以减少程序中字符串输入的工作量,而且可以提高程序的可移植性。宏名既可以是字符串或常数,也可以是带参数的宏。宏定义指令可分为带参数的宏定义和不带参数的宏定义。下面分别介绍用于宏定义的一些预处理命令。8.3.1 #define命令#define命令用于定义一个宏名。宏名是一个标识符,在源代码中遇到该标识符时,均以宏定义的串的内容代替该标识符。ANSI标准宏将定义的标识符称为“宏名”,而用定义的内容代替宏名的过程称为“宏替换”。#define命令用于定义宏名时,既可以带参数,也可以不带参数,下面分别介绍这两种情况。1不带参数的宏定义2带参数

7、的宏定义8.3.2 #undef命令#undef命令用于取消前面用#define命令定义过的宏名。一般形式为:#undef 宏名其中,“#undef”是取消宏定义指令,“宏名”为前面用#define命令定义过的标识符。使用#undef命令的目的是将宏名局限在指定的代码段中,这样可以限制宏定义的使用范围。使用#undef命令的程序示例如下:#include /头文件#define COUNT 50/宏定义void main()/主函数printf(COUNT =%dn, COUNT);/输出COUNT =50#undef COUNT/撤销COUNT宏定义/printf(COUNT =%dn, C

8、OUNT);/此时再引用COUNT是错误的 8.4 条件编译指令在默认情况下,源程序中的所有程序代码都要进行编译。但是有时需要某些语句行在条件满足的情况下,才进行编译,此时便用到条件编译指令。目前商业软件公司广泛应用条件编译来制作某个程序的不同用户的版本,例如专业版、个人版、试用版等,从而可以限制软件的某些功能。条件编译指令是指对源程序的代码有选择地进行编译。采用条件编译,可以提高程序的广泛的适用性,缩小目标源代码的大小,加快程序执行的速度。C51的条件编译指令有#if、#else、#ifdef、#ifndef、#endif这几个命令。下面分别介绍这些命令的用法。8.4.1 #if、#else

9、和#endif命令#if、#else和#endif命令是一组常用的条件编译指令,用于进行条件编译,其一般形式如下:#if 常量表达式语句段;#else语句段;#endif其中,“#if”、“#else”、“#endif”为条件编译指令,“常量表达式”为进行条件编译的判断条件,语句段为进行条件编译的程序代码段。8.4.2 #elif命令#elif命令用于进行在多种编译条件下进行选择编译的情况。其含义与“else if”相同,形成一个阶梯状编译语句。使用#elif命令的一般形式如下:#if 表达式0语句段;#elif 表达式1语句段;#elif 表达式2语句段;#elif 表达式n语句段;#end

10、if8.4.3 #ifdef、#ifndef命令#ifdef与#ifndef命令用于判断宏名是否被定义过,并根据判断的情况进行条件编译。#ifdef命令的一般形式是:#ifdef 宏名语句段;#else 语句段;#endif8.5 其他编译指令#line命令用于修改_LINE_与_FILE_的内容。其中“_LINE_”和“_FILE_”是在编译程序中预先定义的标识符,分别表示行号和源文件。#line命令主要用于调试及其他一些特殊的应用。使用#line命令的一般形式如下:#line 数字文件名其中,“数字”为任意正整数,表示源程序中当前语句的行号;“文件名”为可选的任意有效文件标识符,表示源文件

11、的名字。使用#line命令的程序示例如下: #include /头文件#line 300/初始化行计数器void main()/行号300/行号301printf(Line Number=%dn,_LINE_);/行号302 8.5.1 #line命令#error命令用于强制使编译程序停止编译操作的编译指令,并同时输出错误信息提示。该命令主要用于程序调试。其使用的一般形式如下:#error “message”其中,“message”为显示的错误提示的信息。#error命令的程序示例如下:#include /头文件#define SCORE 85/宏定义void main()/主函数#ifdef

12、 SCORE/条件编译printf(SCORE is defined!n);/如果宏SCORE存在,则执行该语句#else#error SCORE is not defined!n/如果宏SCORE不存在,则执行该处#endif#ifndef GREED#error GREED is not defined!n/如果宏GREED存在,则执行该处#elseprintf(GREED is defined!n);/如果宏GREED不存在,则执行该语句#endif 8.5.2 #error命令#pragma命令用于向编译程序传送各种C51编译器的控制指令。根据#pragma指令后面的字符串,编译系统将

13、按照特定的方式来编译C51的字符串和函数。其使用的一般形式如下:#pragma 字符串其中,#pragma指令后面的字符串,可以大写,也可以小写。#pragma指令示例如下:#pragma sfr/在C51中使用SFR#pragma access/在C51中使用绝对地址#pragma asm/在C51中插入汇编语句 8.5.3 #pragma命令#pragma命令用于向编译程序传送各种C51编译器的控制指令。根据#pragma指令后面的字符串,编译系统将按照特定的方式来编译C51的字符串和函数。其使用的一般形式如下:#pragma 字符串其中,#pragma指令后面的字符串,可以大写,也可以小

14、写。#pragma指令示例如下:#pragma sfr/在C51中使用SFR#pragma access/在C51中使用绝对地址#pragma asm/在C51中插入汇编语句8.6 C51的用户配置文件C51的用户配置文件是用来在程序执行前,配置单片机系统的一些相关设置。在C51中,用户可以根据需要适当修改配置文件以满足不同的硬件环境需要。这些用户配置文件存放在KeilC51LIB文件夹中。C51编译器在对用户创建的项目进行编译连接时,会自动将用户配置文件中的代码添加到用户程序中去。如果用户要对配置文件进行修改,可以通过Keil Vision3的项目窗口,先将需要修改的配置文件添加到自己的项目

15、文件组中,然后在编辑窗口进行修改,最后再进行总体编译连接,这样就可以将修改后的用户配置文件代码连接到自己的源程序代码中。C51的用户配置文件包括启动代码文件、变量初始化文件、基本I/O函数文件、分组配置文件几类。下面分别介绍这几类用户配置文件。8.6.1 C51的启动代码详解C51启动代码文件用于在源程序进入主函数前,完成对单片机片内外RAM清零、开设常规堆栈和再入函数堆栈、设置堆栈指针等任务。在Keil Vision3编译环境中,针对不同类型的8051单片机提供了多种启动代码配置文件,其中最常用的启动代码文件是 STARTUP.A51,其他的启动代码都和STARTUP.A51作用相似。这里以

16、启动代码文件 STARTUP.A51为例进行介绍,其可以实现以下几方面功能:定义内部RAM大小、外部RAM大小和可重入堆栈位置。初始化8051硬件堆栈指针。按存储模式初使化重入堆栈及堆栈指针。清除内部、外部或者以此页为单元的外部存储器。向主函数main()交权。8.6.2 C51的变量初始化文件变量初始化文件用于对源程序中声明的变量进行初始化赋值。在Keil Vision3集成开发环境中,主要的变量初始化文件为INIT.A51。此外,对于不使用外部XDATA存储器的RTX-51 TINY实时操作系统,还提供了INIT_TNY.A51变量初始化文件。变量初始化文件的目标代码已经驻留在Keil V

17、ision3的编译器的运行库内。当用户的C51源程序中包含有初始值的外部变量和静态变量时,连接定位器BL51将会自动将该变量初始化文件代码加入到C51源程序的前面,对已确定初始化的外部变量和静态变量进行赋值。如果需要对变量初始化文件进行修改,可以将其添加到用户自己的项目文件中,修改完毕后重新对项目进行编译即可。变量初始化文件INIT.A51包含一个看门狗定时器的宏定义WATCHDOG。如果程序使用了看门狗定时器,并且对变量初始化处理所需的时间比看门狗定时器的刷新时间要长。此时宏定义WATCHDOG中必须包含看门狗刷新时间的代码。8.6.3 C51的基本I/O函数文件在Keil C51中提供了一

18、些常用的I/O函数,主要有两个:PUTCHAR.C和GETKEY.C。用户可以直接调用,而不需要重新编写,这样可以大大节省程序开发的时间。下面分别介绍这两个文件。PUTCHAR.C用于将字符串从8051单片机的串行口输出。其采用XON/XOFF协议进行控制,将换行字符“LF”(n)被转换为“CR,LF”(rn)。在Keil Vision3集成开发环境中,是printf、puts等函数的字符输出核心函数。用户也可以根据自己的需要来修改该文件中的函数,从而实现特定的输出效果,例如LCD或LED显示等。GETKEY.C用于字符的串口输入,其不进行数据转换。在Keil Vision3集成开发环境中,是

19、C51编译器运行库中的getchar、scanf等函数的字符输入核心函数。用户也可以根据自己的需要来修改该文件中的函数,可以实现特定的输入效果,例如44矩阵键盘的输入等。8.6.4 C51的分组配置文件C51的分组配置文件用于对源程序进行代码分组设计。由于传统的8051单片机只能将ROM扩展到最大4MB,而新一代扩展型单片机可将其存储器范围扩展到最大16MB。因此,在Keil Vision3集成开发环境中提供了两个分组配置文件,L51_BANK.A51和XBANKING.A51,分别介绍如下: 1L51_BANK.A51文件L51_BANK.A51文件用于基本的8051单片机的代码分组设计,其

20、ROM最大只能扩展到4MB。在对Keil Vision3集成开发环境生成的浮动代码目标文件进行连接定位时,应采用BL51连接定位器。2XBANKING.A51文件XBANKING.A51文件用于新型的80C51系列单片机的代码分组设计,其支持far和far const储存器类型变量。在Keil Vision3集成开发环境中,扩展连接定位器LX51通过far和far const储存器类型来访问扩展HDATA和HCONST存储器地址空间。8.7 小结本章详细介绍了C51语言所支持的各种预处理命令,包括文件包含指令、宏定义指令、条件编译指令和其他一些编译指令,详细地介绍了各指令功能和使用方法,在本部分还介绍了C51常用的头文件。这些内容都是实际编程中经常要用到的知识点,对于这些内容需要熟练掌握。在本章的最后还介绍了一下C51的用户配置文件,熟悉这些内容可以对C51编译原理和过程有更加深刻的认识,对以后程序设计会有很大的帮助。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号