第8章C51的预处理命令和

上传人:沈*** 文档编号:168967562 上传时间:2022-11-13 格式:PPT 页数:22 大小:140.52KB
收藏 版权申诉 举报 下载
第8章C51的预处理命令和_第1页
第1页 / 共22页
第8章C51的预处理命令和_第2页
第2页 / 共22页
第8章C51的预处理命令和_第3页
第3页 / 共22页
资源描述:

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

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

2、C51源程序进行编译前,编译器需要先对程序中的预处理命令进行处理,然后将预处理的结果和源代码一并进行编译,最后产生目标代码。预处理命令通常只进行一些符号的处理,其并不执行具体的硬件操作。为了与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”表示文件包含指令、双引号或尖括号括起来的文件名是要引入的源文件。典型的文件包含指令示例如下:#in

4、clude 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包含允许直接访问8051不

5、同存储区的宏定义。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,COUNT);/此时再

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

9、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语句段;#endif8.4.3#

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

11、ine命令的程序示例如下:#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 SCORE/条件编译p

12、rintf(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指令后面的字符串,编译系统将按照特定的方式来编译C51

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

14、下:#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作用相似。这里以启动代码文件 STARTUP

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

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

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

19、char、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单片机的代码分组设计,其ROM最大只能扩展到4MB。在

20、对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编译原理和过程有更加深刻的认识,对以后程序设计会有很大的帮助。

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

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

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


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