首页 理论教育 C51预处理命令和库函数的使用技巧

C51预处理命令和库函数的使用技巧

时间:2023-10-23 理论教育 版权反馈
【摘要】:下面简单介绍常用的预处理命令。C51提供了丰富的库函数,并有相应的头文件,只有用#include命令包含了相应头文件,才可以调用库中的函数。1)左环移本征函数。C51针对51单片机硬件特点设置了SMALL、COMPACT、LARGE三种情况下的有和没有浮点运算的函数库,如下:头文件。

C51预处理命令和库函数的使用技巧

1.预处理命令

预处理命令是在编译前预先处理的命令,编译器不能直接对它们处理,是在编译前预先处理的命令。下面简单介绍常用的预处理命令。

(1)宏定义#define。

1)不带参数的宏定义。用指定的标识符来代表一个字符序列。一般定义形式为:

#define 标识符 字符序列 /*宏定义命令后不加分号*/

在上述形式中:

a.#define为宏命令。

b.标识符为宏名,一般取含义清晰易记忆的名称。

c.字符序列为被代表的数字或字符序列。例如:

#define PI 3.1415926

宏定义后PI作为一个常量使用,预处理时又将程序中所有的PI替换为3.1415926。

2)带参数的宏定义。预处理时不但进行字符替换,而且替换字符序列中的形参。一般定义形式如下:

#define标识符(形参)字符序列 /*字符串中含有形参*/

例如:

#define s(a,b) a*b

宏定义后,程序中可以使用宏名,并将形参换成实参。如:

(2)类型定义typedef。使用基本类型定义或声明变量时,用数据类型关键字指明变量的数据类型,而用结构、联合等类型定义变量时,先定义结构、联合的类型,再用关键字,类型名定义变量。如果用typedef定义新的类型名后,只要用类型名就可定义新的变量。例如:

接着便可以在程序中用STD_TYPE,就可以定义属于这种类型的结构变量。例如:

STD_TYPE std1,std2;/*定义STD_TYPE类型结构变量std1,std2*/

(3)文件包含#include。文件包含命令是将另外的文件插入到本文件中,作为一个整体文件编译。C51提供了丰富的库函数,并有相应的头文件,只有用#include命令包含了相应头文件,才可以调用库中的函数。包含命令一般形式为:

#include“文件名”或者#include<文件名>

例如:#include“stdio.h” /*包含标准I/O头文件,后面无‘;’号*/

#include“math.h” /*包含数学计算函数库头文件*/

2.C51的通用文件

在KeilμVision的安装目录C51/LIB中有几个重要的源文件,对它们稍作修改就可以用在专用的系统中。

(1)init_mem.C。功能是初始化动态内存区,指定动态内存区的大小。(www.xing528.com)

(2)init.a51。功能是对watchdog操作。

(3)C51启动配置文件startup.a51。启动配置文件startup.a51中包含了目标系统启动代码,可以在每个工程项目中加入这个文件,复位以后先执行该程序,然后转主函数main()。其功能包括:①定义内部和外部RAM的大小,可重入堆栈的位置;②初始化内部和外部RAM存储器;③按存储模式初始化重入堆栈和重入堆栈指针;④初始化硬件堆栈指针sp;⑤转向main(),向main()交权。

必须根据目标是CPU和扩展RAM的情况,编译前选用SMALL、COMPACT或LARGE模式之一,并修改startup.a51中下述参数,将startup.a51加入项目,一起编译,才能对目标系统正确地初始化,修改参数见表4-11。

表4-11 startup.a51中的修改参数

在紧凑模式中,P2作为页(高端)地址,若指定某页为BE00H~BEFFH,则PPAGE=0XBE,连接时L51<input modules>PDATA(BE80H)。

3.C51的库函数

(1)本征函数文件。本征函数也称为内联函数,这种函数不采用调用形式,编译时直接将代码插入当前行。

1)左环移本征函数。函数原型:

a.unsigned char_crol_(unsigned char a,unsigned char n);

b.unsigned int_irol_(unsigned int a,unsigned char n);

c.unsigned long_lrol_(unsigned long a,unsigned char n);

功能:_crol_,_irol_,_lrol_分别将字符型变量a、整型变量a、长整型变量a循环左移n位。

例如:

2)右环移本征函数。函数原型:

a.unsigned char_cror_(unsigned char a,unsigned char n);

b.unsigned int_iror_(unsigned int a,unsigned char n);

c.unsigned long_lror_(unsigned long a,unsigned char n);

功能:_cror_,_iror_,_lror_分别将字符型变量a、整型变量a、长整型变量a循环右移n位。举例类同于左环移本征函数,从略。

3)其他本征函数。

a._nop_; /*空操作,产生一条NOP指令*/

b.bit_testbit_(bit b); /*位测试,产生一条JBC指令*/

功能:测试的位为1时,清零该位,并返回1;否则返回0。

例如:if_testbit_(RI)a=SBUF; /*RI=1,清零RI,读SBUF*/

(2)库函数。C51针对51单片机硬件特点设置了SMALL、COMPACT、LARGE三种情况下的有和没有浮点运算的函数库,如下:

(3)头文件。每个函数库都有相应头文件,用户如果需要用库函数,必须将用#include命令包含相应头文件。用户尽可能采用小系统无浮点运算的函数库,以减少代码的长度。下面列出相应头文件(位于Keil\C51\INC目录下):

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈