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 |