Keil C51有丰富的可直接调用的库函数,灵活使用库函数可使程序代码简单、结构清晰,并且易于调试和维护。每个库函数都在相应的头文件中给出了函数原型声明,用户如果需要使用库函数,必须在源程序的开始处用预处理命令“#include”将有关的头文件包含进来。

1. 本征库函数:

本征库函数是指编译时直接将固定的代码插入到当前行,而不是用汇编语言中的“ACALL”和“LCALL”指令来实现调用,从而大大提高了函数的访问效率。Keil C51的本征库函数有9个,数量少但非常有用。使用本征库函数时,C51源程序中必须包含预处理命令“#include  <intrins.h>”。

函数名及定义

功能说明

unsigned char _crol_(unsigned char val,unsigned char n)

将字符型数据val循环左移n位,相当于RL命令

unsigned int _irol_(unsigned int val,unsigned char n)

将整型数据val循环左移n位,相当于RL命令

unsigned long _lrol_(unsigned long val,unsigned char n)

将长整型数据val循环左移n位,相当于RL命令

unsigned char _cror_(unsigned char val,unsigned char n)

将字符型数据val循环右移n位,相当于RR命令

unsigned int _iror_(unsigned int val,unsigned char n)

将整型数据val循环右移n位,相当于RR命令

unsigned long _lror_(unsigned long val,unsigned char n)

将长整型数据val循环右移n位,相当于RR命令

bit _testbit_(bit x)

相当于JBC  bit指令

unsigned char _chkfloat_(float ual)

测试并返回浮点数状态

void _nop_(void)

产生一个NOP指令

2. 字符判断转换库函数:

字符判断转换库函数的原型声明在头文件CTYPE.H中定义。

函数名及定义

功能说明

bit isalpha(char c)

检查参数字符是否为英文字母,是则返回1,否则返回0

bit isalnum(char c)

检查参数字符是否为英文字母或数字字符,是则返回1,否则返回0

bit iscntrl(char c)

检查参数字符是否为控制字符(值在0x00~0x1f之间或等于0x7f)是则返回1,否则返回0

bit isdigit(char c)

检查参数字符是否为十进制数字0~9,是则返回1,否则返回0

bit isgraph(char c)

检查参数字符是否为可打印字符(不包括空格),值域0x21~0x7e,是则返回1,否则返回0

bit isprint(char c)

检查参数字符是否为可打印字符(包括空格),值域0x21~0x7e,是则返回1,否则返回0

bit ispunct(char c)

检查参数字符是否为标点、空格或格式字符,是则返回1,否则返回0

bit islower(char c)

检查参数字符是否为小写英文字母,是则返回1,否则返回0

bit isupper(char c)

检查参数字符是否为大写英文字母,是则返回1,否则返回0

bit isspace(char c)

检查参数字符是否为空格、制表符、回车、换行、垂直制表符和送纸(值为0x09~0x0d,或为0x20),是则返回1,否则返回0

bit isxdigit(char c)

检查参数字符是否为十六进制数字字符,是则返回1,否则返回0

char toint(char c)

将ASCII字符的0~9、a~f(大小写无关)转换为十六进制数字

char tolower(char c)

将大写字符转换成小写形式,如果字符参数不在A~Z之间,则该函数不起作用

char _tolower(char c)

将字符参数c与常数0x20逐位相或,从而将大写字符转换成小写字符

char toupper(char c)

将小写字符转换成大写形式,如果字符参数不在a~z之间,则该函数不起作用

char _toupper(char c)

将字符参数c与常数0xdf逐位相与,从而将小写字符转换成大写字符

char toascii(char c)

将任何字符参数值缩小到有效的ASCII范围内,即将c与0x7f相与,去掉第7位以上的位

3. 输入输出库函数:

输入输出库函数的原型声明在头文件STDIO.H中定义,通过8051的串行口工作。如果希望支持其他I/O接口,只需要改动_getkey()和putchar()函数。库中所有其他的I/O支持函数都依赖于这两个函数模块。在使用8051系列单片机的串行口之前,应先对其进行初始化。例如,以2400波特率(12MHz时钟频率)初始化串行口的语句如下:

        SCON=0x52;        //SCON置初值

        TMOD=0x20;        //TMOD置初值

        TH1=0xF3;          //T1置初值

        TR1=1;             //启动T1

函数名及定义

功能说明

char _getkey(void)

等待从8051串口读入一个字符并返回读入的字符,这个函数是改变整个输入端口机制时应做修改的唯一一个函数

char getchar(void)

使用_getkey从串口读入字符,并将读入的字符马上传给putchar函数输出,其他与_getkey函数相同

char *gets(char *s,int n)

该函数通过getchar从串口读入一个长度为n的字符串并存入由s指向的数组。输入时一旦检测到换行符就结束字符输入。输入成功时返回传入的参数指针,失败时返回NULL

char ungetchar(char c)

将输入字符回送到输入缓冲区,因此下次gets或getchar可用该字符。成功时返回char型值,失败时返回EOF,不能处理多个字符

char putchar(char c)

通过8051串行口输出字符,与函数_getkey一样,这是改变整个输出机制所需要修改的唯一一个函数

int printf(const char *fmstr[,argument]...)

以第一个参数指向字符串制定的格式通过8051串行口输出数值和字符串,返回值为实际输出的字符数

int sprintf(char *s,const char *fmstr[,argument]...)

与printf功能相似,但数据是通过一个指针s送入内存缓冲区,并以ASCII码的形式存储

int puts(const char *s)

利用putchar函数将字符串和换行符写入串行口,错误时返回EOF,否则返回0

int scanf(const char *fmstr[,argument]...)

在格式控制串的控制下,利用getchar函数从串行口读入数据,每遇到一个符合格式控制串fmstr规定的值,就将它按顺序存入由参数指针argument指向的存储单元。其中每个参数都是指针,函数返回所发现并转换的输入项数,错误则返回EOF

int sscanf(char *s,const char *fmstr[,argument]...)

与scanf的输入方式相似,但字符串的输入不是通过串行口,而是通过指针s指向的数据缓冲区

void vprintf(const char *s,char *fmstr,char *argptr)

将格式化字符串和数据值输出到由指针s指向的内存缓冲区内。类似于sprintf,但接受一个指向变量表的指针,而不是变量表。返回值为实际写入到输出字符串中的字符数

4. 字符串处理库函数:

字符串处理库函数的原型声明包含在头文件STRING.H中,字符串函数通常接收指针串作为输入值。一个字符串包括两个或多个字符,字符串的结尾以空字符表示。在函数memcmp、memcpy、memchr、memccpy、memset和memmove中,字符串的长度由调用者明确规定,这些函数可工作在任何模式。

函数名及定义

功能说明

void *memchr(void *s1, char val, int len)

顺序搜索字符串s1的前len个字符,以找出字符val,成功时返回s1中指向val的指针,失败时返回NULL

char memcmp(void *s1, void *s2, int len)

逐个字符比较串s1和s2的前len个字符,成功时返回0,如果串s1大于或小于s2,则相应地返回一个正数或一个负数

void *memcpy(void *dest, void *src , int len)

从src所指向的内存中复制len个字符到dest中,返回指向dest中最后一个字符的指针。如果src与dest发生交迭,则结果是不可测的

void *memccpy(void *dest, void *src, char val, int len)

复制src中len个元素到dest中。如果实际复制了len个字符则返回NULL。复制过程在复制完字符val后停止,此时返回指向dest中下一个元素的指针

void *memmove(void *dest, void *src, int len)

它的工作方式于memcpy相同,但复制的区域可以交迭

void memset(void *s, char val, int len)

用val来填充指针s中的len个单元

void *strcat(char *s1, char *s2)

将串s2复制到s1的尾部。strcat假定s1所定义的地址区域足以接受两个串。返回指向s1中的第一个字符的指针

char *strncat( char *s1, char *s2, int n)

复制串s2中n个字符到s1的尾部,如果s2比n短,则只复制s2(包括串结束符)

char strcmp(char *s1, char *s2)

比较串s1和s2,如果相等则返回0;如果s1<s2,则返回一个负数;如果s1>s2,则返回一个正数

char strncmp(char *s1, char *s2, int n)

比较串s1和s2中的前n个字符。返回值同上

char *strcpy(char *s1, char *s2)

将串s2(包括结束符)复制到s1中,返回指向s1中第一个字符的指针

char *strncpy(char *s1, char *s2, int n)

与strcpy相似,但它只复制n个字符。如果s2的长度小于n,则s1串以0补齐到长度n

int strlen(char *s1)

返回串s1中的字符个数,不包括结尾的空字符

char *strstr(const char *s1, char *s2)

搜索字符串s2中第一次出现在s1中的位置,并返回一个指向第一次出现位置开始处的指针。如果字符串s1中不包括字符串s2,则返回一个空指针

char *strchr(char *s1, char c)

搜索s1串中第一个出现的字符c,如果成功则返回指向该字符的指针,否则返回NULL。被搜索的字符可以是串结束符,此时返回值是指向串结束符的指针

int strpos(char *s1, char c)

与strchr类似,但返回的是字符c在串s1中第一次出现的位置值,没有找到则返回-1。s1串首字符的位置是0

char *strrchr(char *s1, char c)

搜索s1串中最后一个出现的字符c,如果成功则返回指向该字符的指针,否则返回NULL。被搜索的字符可以是串结束符

int strrpos(char *s1, char c)

与strrchr相似,但返回值是字符c在s1串中最后一次出现的位置值,没有找到则返回-1

int strspn(char *s1, char *set)

搜索s1串中第一个不包括在set串中的字符,返回值是s1中包括在set里的字符个数。如果s1中的所有字符都包括在set里面,则返回s1的长度(不包括结束符)。如果set是空串,则返回0

int strcspn(char *s1, char *set)

与strspn相似,但它搜索的是s1串中的第一个包含在set里的字符。

char *strpbrk(char *s1, char *set)

与strspn相似,但返回指向搜索到的字符的指针,而不是个数;如果未找到,则返回NULL

char *strrpbrk(char *s1, char *set)

与strpbrk相似,但它返回s1中指向找到的set字符集中最后一个字符的指针

5. 类型转换及内存分配库函数:

类型转换及内存分配库函数的原型声明包含在头文件STDLIB.H中,利用该库函数可以完成数据类型转换以及存储器分配操作。

函数名及定义

功能说明

float atof(char *s1)

将字符串s1转换成浮点数值并返回,输入串中必须包含与浮点值规定相符的数。该函数在遇到第一个不能构成数字的字符时,停止对输入字符串的读操作

long atoll(char *s1)

将字符串s1转换成一个长整型数值并返回,输入串中必须包含与长整型数格式相符的字符串。该函数在遇到第一个不能构成数字的字符时,停止对输入字符串的读操作

int atoi(char *s1)

将字符串s1转换成整型数并返回,输入串中必须包含与整型数格式相符的字符串。该函数在遇到第一个不能构成数字的字符时,停止对输入字符串读操作

void *calloc(unsigned int n, unsigned int size)

为n个元素的数组分配内存空间,数组中每个元素的大小为size,所分配的内存区域用0初始化。返回值为已分配的内存单元起始地址,如不成功则返回0

void free(void xdata *p)

释放指针p所指向的存储器区域。如果p为NULL,则该函数无效,p必须是以前用calloc、malloc或realloc函数分配的存储器区域。调用free函数后,被释放的存储器区域就可以参加以后的分配了

void init_mempool(void xdata *p, unsigned int size)

对可被函数calloc、free、malloc或realloc管理的存储器区域进行初始化,指针p表示存储区的首地址,size表示存储区的大小

void *malloc(unsigned int size)

在内存中分配一个size字节大小的存储器空间,返回值为一个size大小对象所分配的内存指针。如果返回NULL,则无足够的内存空间可用

void *realloc(void xdata *p, unsigned int size)

用于调整先前分配的存储器区域大小。参数p指示该存储区域的起始地址,参数size表示新分配存储器区域的大小。原存储器区域的内容被复制到新存储器区域中。如果新区域较大,多出的区域将不作初始化。realloc返回指向新存储区的指针,如果返回NULL,则无足够大的内存可用,这时将保持原存储区不变。

int rand()

返回一个0~32767之间的伪随机数,对rand的相继调用将产生相同序列的随机数

void srand(int n)

用来将随机数发生器初始化成一个已知(或期望)值

unsigned long strtod (const char *s, char **ptr)

将字符串s转换为一个浮点型数据并返回,字符串前面的空格、/、tab符被忽略

long strtol (const char *s, char **ptr, unsigned char base)

将字符串s转换为一个long型数据并返回,字符串前面的空格、/、tab符被忽略

long strtoul (const char *s, char **ptr, unsigned char base)

将字符串s转换为一个unsigned long型数据并返回,溢出时则返回ULONG_MAX。字符串前面的空格、/、tab符被忽略

6. 数学计算库函数:

数学计算库函数的原型声明包含在头文件MATH.H中。

函数名及定义

功能说明

int abs(int val)

char cabs(char val)

float fabs(float val)

long labs(long val)

abs计算并返回val的绝对值。如果val为正,则不做改变就返回;如果val为负,则返回相反数。其余3个函数除了变量和返回值类型不同之外,其他功能完全相同

 

float exp(float x)

float log(float x)

float log10(float x)

exp计算并返回浮点数x的指数函数

log计算并返回浮点数x的自然对数(以e为底,e=2.718282)

log10计算并返回浮点数x以10为底的对数

float sqrt(float x)

计算并返回x的正平方根

float cos(float x)

float sin(float x)

float tan(float x)

cos计算并返回x的余弦值

sin计算并返回x的正弦值

tan计算并返回x的正切值

变量范围-π/2~+π/2

值在-65535~+65535之间

否则产生NaN错误

float acos(float x)

float asin(float x)

float atan(float x)

float atan2(float y, float x)

acos计算并返回x的反余弦值

asin计算并返回x的反正弦值

atan计算并返回x的反正切值,值域为-π/2~+π/2

atan2计算并返回y/x的反正切值,值域为-π~+π

float cosh(float x)

float sinh(float x)

float tanh(float x)

cosh计算并返回x的双曲余弦值

sinh计算并返回x的双曲正弦值

tanh计算并返回x的双曲正切值

float ceil(float x)

计算并返回一个不小于x的最小整数(作为浮点数)

float floor(float x)

计算并返回一个不大于x的最小整数(作为浮点数)

float modf(float x, float *ip)

将浮点数x分成整数和小数部分,两者都含有与x相同的符号,整数部分放入*ip,小数部分作为返回值

float pow(float x, float y)

计算并返回xy值,如果x不等于0而y=0,则返回1.当x=0且y<=0或当x<0且y不是整数时,则返回NaN