【ACCESS精品源码栏目提醒】:网学会员在ACCESS精品源码频道为大家收集整理了“第8章 C51的预处理命令 - 电子电信“提供大家参考,希望对大家有所帮助!
第8章 C51的预处理命令 和用户配置文件8.1C51的预处理命令概述 C51语言中提供了各种预处理命令,其作用类似于汇编程序 中的伪指令。
一般来说,在对C51源程序进行编译前,编译 器需要先对程序中的预处理命令进行处理,然后将预处理 的结果和源代码一并进行编译,最后产生目标代码。
预处 理命令通常只进行一些符号的处理,其并不执行具体的硬 件操作。
为了与C51源代码中的程序语句相区别,预处理命令前要加 一个“”。
8.1C51的预处理命令概述 预处理命令 用途 define 用于宏定义 error 用于程序调试 include 用于文件包含 if 用于条件编译 else 用于条件编译 elif 用于多种条件编译选择 endif 用于条件编译 ifdef 用于条件编译 ifndef 用于条件编译 undef 用于宏定义 line 用于更改行号 pragma 用于传送控制指令8.2文件包含指令 文件包含指令,即include命令,通常位于C51源程序的开 头,利用include命令可以将其他的文件引入当前的C51源 文件。
其中被包含的文件通常是头文件、宏定义等。
使用 文件包含指令,有利于更好地调试C51源文件。
当需要调试 修改文件时,只要修改某一包含文件即可,而无需对所有 文件进行修改。
8.2.1include命令 在C51语言中,文件包含指令的一般形式如下: include 头文件.h include include 宏定义标识符 其中,“include”表示文件包含指令、双引号或尖括号括起来的文 件名是要引入的源文件。
典型的文件包含指令示例如下: include myfile.h //引用自定义文件myfile include //引用库函数文件studio include //引用寄存器文件 define MATH_FILE Ckeilincmath1.h” //宏定义自定义文件MATH_FILE include MATH_FILE //引用自定义文件MATH_FILE8.2.2C51常用的头文件 在Keil μVision3集成开发环境中,C51标准库提供了许多包含文件, 即C51的头文件。
这些文件存放在目录KeilC51INC文件夹及其子目录 下。
这些头文件包含常数、宏定义、类型定义和函数原型等。
C51常用 的头文件如下: absacc.h—包含允许直接访问8051不同存储区的宏定义。
asscert.h—文件定义asscert宏,用来建立程序的测试条件。
ctype.h—常用的字符转换和分类程序。
intrins.h—文件包含指示编译器产生嵌入原有代码的程序的原型。
math.h—常用数学程序。
reg51.h—51系列单片机特殊寄存器。
reg52.h—52系列单片机特殊寄存器。
setjmp.h—定义jmp_buf类型以及setjmp和longjmp程序的原型。
stdarg.h—可变长度参数列表程序。
stdlib.h—存储区分配程序。
stdio.h—常用的输入和输出程序。
string.h—常用的字符串操作程序和缓冲区操作程序。
8.3宏定义指令 宏定义指令是指用一些标识符作为宏名,来代替其他一些 符号或者常量的预处理命令。
使用宏定义指令,可以减少 程序中字符串输入的工作量,而且可以提高程序的可移植 性。
宏名既可以是字符串或常数,也可以是带参数的宏。
宏定 义指令可分为带参数的宏定义和不带参数的宏定义。
下面 分别介绍用于宏定义的一些预处理命令。
8.3.1define命令 define命令用于定义一个宏名。
宏名是一个标识符,在源 代码中遇到该标识符时,均以宏定义的串的内容代替该标 识符。
ANSI标准宏将定义的标识符称为“宏名”,而用定 义的内容代替宏名的过程称为“宏替换”。
define命令用 于定义宏名时,既可以带参数,也可以不带参数,下面分 别介绍这两种情况。
1.不带参数的宏定义 2.带参数的宏定义8.3.2undef命令 undef命令用于取消前面用define命令定义过的宏名。
一般形式为: undef 宏名 其中,“undef”是取消宏定义指令,“宏名”为前面用define命令 定义过的标识符。
使用undef命令的目的是将宏名局限在指定的代码段中,这样可以限 制宏定义的使用范围。
使用undef命令的程序示例如下: include //头文件 define COUNT 50 //宏定义 void main //主函数 printfCOUNT dn COUNT //输出COUNT 50 undef COUNT //撤销COUNT宏定义 //printfCOUNT dn COUNT //此时再引用COUNT是错误的 8.4条件编译指令 在默认情况下,源程序中的所有程序代码都要进行编译。
但是有时需要某些语句行在条件满足的情况下,才进行编 译,此时便用到条件编译指令。
目前商业软件公司广泛应 用条件编译来制作某个程序的不同用户的版本,例如专业 版、个人版、试用版等,从而可以限制软件的某些功能。
条件编译指令是指对源程序的代码有选择地进行编译。
采 用条件编译,可以提高程序的广泛的适用性,缩小目标源 代码的大小,加快程序执行的速度。
C51的条件编译指令有 if、else、ifdef、ifndef、endif这几个命令。
8.4.1if、else和endif命令 if、else和endif命令是一组常用的条件编译指令,用 于进行条件编译,其一般形式如下: if 常量表达式 语句段 else 语句段 endif 其中,“if”、“else”、“endif”为条件编译指 令,“常量表达式”为进行条件编译的判断条件,语句段 为进行条件编译的程序代码段。
8.4.2elif命令 elif命令用于进行在多种编译条件下进行选择编译的情况。
其含义与 “else if”相同,形成一个阶梯状编译语句。
使用elif命令的一般 形式如下: if 表达式0 语句段 elif 表达式1 语句段 elif 表达式2 语句段 … elif 表达式n 语句段 endif8.4.3ifdef、ifndef命令 ifdef与ifndef命令用于判断宏名是否被定义过,并根据 判断的情况进行条件编译。
ifdef命令的一般形式是: ifdef 宏名 语句段 else 语句段 endif8.5其他编译指令 除了以上几种常用的预处理指令外,在C51语言中还提供了 其他一些预处理指令,主要用于进行编译和调试程序等操 作。
8.5.1line命令 line命令用于修改_LINE_与_FILE_的内容。
其中“_LINE_”和 “_FILE_”是在编译程序中预先定义的标识符,分别表示行号和源文 件。
line命令主要用于调试及其他一些特殊的应用。
使用line命令 的一般形式如下: line 数字文件名 其中,“数字”为任意正整数,表示源程序中当前语句的行号;“文 件名”为可选的任意有效文件标识符,表示源文件的名字。
使用line 命令的程序示例如下: include //头文件 line 300 //初始化行计数器 void main //行号300 //行号301 printfLine Numberdn__LINE__ //行号302 8.5.2error命令 error命令用于强制使编译程序停止编译操作的编译指 令,并同时输出错误信息提示。
该命令主要用于程序调 试。
其使用的一般形式如下: error “message” 其中,“message”为显示的错误提示的信息。
8.5.3pragma命令 pragma命令用于向编译程序传送各种C51编译器的控制指 令。
根据pragma指令后面的字符串,编译系统将按照特定 的方式来编译C51的字符串和函数。
其使用的一般形式如 下: pragma 字符串 其中,pragma指令后面的字符串,可以大写,也可以小 写。
pragma指令示例如下: pragma sfr //在C51中使用SFR pragma
access //在C51中使用绝对地址 pragma asm //在C51中插入汇编语句8.6C51的用户配置文件 在C51中,用户可以根据需要适当修改配置文件以满足不同 的硬件环境需要。
这些用户配置文件存放在KeilC51LIB文 件夹中。
C51编译器在对用户创建的项目进行编译连接时, 会自动将用户配置文件中的代码添加到用户程序中去。
如果用户要对配置文件进行修改,可以通过Keil μVision3 的项目窗口,先将需要修改的配置文件添加到自己的项目文 件组中,然后在编辑窗口进行修改,最后再进行总体编译连 接,这样就可以将修改后的用户配置文件代码连接到自己的 源程序代码中。
C51的用户配置文件包括启动代码文件、变量初始化文件、 基本I/O函数文件、分组配置文件几类。
8.6.1C51的启动代码详解 C51启动代码文件用于在源程序进入主函数前,完成对单片 机片内外RAM清零、开设常规堆栈和再入函数堆栈、设置堆 栈指针等任务。
在Keil μVision3编译环境中,针对不同 类型的8051单片机提供了多种启动代码配置文件,其中最 常用的启动代码文件是 STARTUP.A51,其他的启动代码都 和STARTUP.A51作用相似。
这里以启动代码文件 STARTUP.A51为例进行介绍,其可以实现以下几方面功能: 定义内部RAM大小、外部RAM大小和可重入堆栈位置。
初始化8051硬件堆栈指针。
按存储模式初使化重入堆栈及堆栈指针。
清除内部、外部或者以此页为单元的外部存储器。
向主函数main交权。
8.6.2C51的变量初始化文件 变量初始化文件用于对源程序中声明的变量进行初始化赋值。
在Keil μVision3集成开发环境中,主要的变量初始化文件为INIT.A51。
此 外,对于不使用外部XDATA存储器的RTX-51 TINY实时操作系统,还提 供了INIT_TNY.A51变量初始化文件。
变量初始化文件的目标代码已经驻留在Keil μVision3的编译器的运 行库内。
当用户的C51源程序中包含有初始值的外部变量和静态变量 时,连接定位器BL51将会自动将该变量初始化文件代码加入到C51源程 序的前面,对已确定初始化的外部变量和静态变量进行赋值。
如果需 要对变量初始化文件进行修改,可以将其添加到用户自己的项目文件 中,修改完毕后重新对项目进行编译即可。
变量初始化文件INIT.A51包含一个看门狗定时器的宏定义WATCHDOG。
如果程序使用了看门狗定时器,并且对变量初始化处理所需的时间比 看门狗定时器的刷新时间要长。
此时宏定义WATCHDOG中必须包含看门 狗刷新时间的代码。
上一篇:
第一期_操作系统、程序和开发语言
下一篇:
高职院理实一体信息技术论文