单片机C语言(C51)的常用库函数

更新时间:2024-05-02 02:32:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C51的常用库函数详解

C51语言的编译器中包含有丰富的库函数,使用库函数可以大大简化用户程序设计的工作量,提高编程效率。每个库函数都在相应的头文件中给出了函数原型声明,在使用时,必须在源程序的开始处使用预处理命令#include将有关的头文件包含进来。

C51库函数中类型的选择考虑到了8051单片机的结构特性,用户在自己的应用程序中应尽可能地使用最小的数据类型,以最大限度地发挥8051单片机的性能,同时可减少应用程序的代码长度。下面将C51的库函数分类列出并详细介绍其用法。 1 字符函数

字符函数的原型声明包含在头文件CTYPE.H中。常用的一些字符函数介绍如下。 1.1 检查英文字母函数

检查英文字母函数用于检查形参字符是否为英文字母,其函数原型如下: bit isalpha(char c);

其中,c为待判断的字符,如果是英文字母则返回1,否则返回0。程序示例如下:

1.2 检查字母数字函数

检查字母数字函数用于检查形参字符是否为英文字母或数字字符,其函数原型如下: bit isalnum(char c);

1

1.3 检查控制字符函数

检查控制字符函数用于检查形参字符是否为控制字符,其函数原型:bit iscntrl (char c);其中,c为待判断的字符。控制字符其取值范围为0x00~0xlF之间或等于0x7F,如果是,则返回1,否则返回0。

2

1.4 十进制数字检查函数

十进制数字检查函数用于检查形参字符是否为十进制数字,其函数原型如下: bit isdigit (char c);

其中,c为待判断的字符,如果是十进制数字则返回1,否则返回0。

1.5 可打印字符检查函数

可打印字符检查函数用于检查形参字符是否为可打印字符,其函数原型如下: bit isgraph (char c);

其中,c为待判断的字符。可打印字符的取值范围为0x21~0x7C,不包含空格,如果是可打印字符则返回1,否则返回0。

3

1.6 包含空格的可打印字符检查函数

包含空格的可打印字符检查函数用于检查形参字符是否为可打印字符以及空格,其函数原型如下:

bit isprint (char c);

其中,c为待判断字符。如果是则返回1,否则返回0。该函数与isgraph的区别在于包含了空格符,空格符为0x20。

4

1.7 格式字符检查函数

格式字符检查函数用于检查形参字符是否为标点、空格或格式字符,其函数原型如下: bit ispunct (char c);

其中,c为待判断字符,如果是则返回1,否则返回0。

1.8 小写英文字母检查函数

小写英文字母检查函数用于检查形参字符是否为小写英文字母,其函数原型如下: bit islower(char c);

其中,c为待判断字符。如果是小写英文字母则返回1,否则返回0。

5

1.9 大写英文字母检查函数

大写英文字母检查函数用于检查形参字符是否为大写英文字母,其函数原型如下: bit isupper(char c);

其中,c为待判断字符。如果是大写英文字母则返回1,否则返回0。 1.10 控制字符检查函数

控制字符检查函数用于检查形参字符是否为控制字符,其函数原型如下: bit isspace (char c);

其中,c为待判断字符。如果是控制字符则返回1,否则返回0。控制字符包括:空格、制表符、回车、换行、垂直制表符和送纸,其取值范围为0x09~0x0d,或为0x20。 1.11 十六进制数字检查函数

十六进制数字检查函数用于检查形参字符是否为十六进制数字,其函数原型如下: bit isxdigit (char c);

其中,c为待判断字符。如果是16进制数字字符则返回1,否则返回0。 1.12 十六进制数字转换函数

十六进制数字检查函数用于转换形参字符为十六进制数字,其函数原型如下: char toint (char c);

其中,c为待转换字符。该函数将形参字符0~9、a~f(大小写无关)转换为16进制数字。其中,对于字符0~9,返回值为0H~9H,对于ASCII字符a~f(大小写无关),返回值为0AH~0FH。 1.13 大写字符转换函数

大写字符转换函数用于将大写字符转换为小写字符,其函数原型如下:

6

char tolower (char c);

其中,c为待转换的大写字符。如果字符参数不在A~Z之间,则该函数将不起作用,而直接返回原字符。 1.14 小写字符转换函数

小写字符转换函数用于将小写字符转换为大写字符,其函数原型如下: char toupper (char c);

其中,c为待转换的小写字符。如果字符参数不在a~z之间,则该函数将不起作用,而直接返回原字符。

1.15 ASCII字符转换函数

ASCII字符转换函数用于将任何字符型参数缩小到有效的ASCII范围之内,其函数原型如下:

char toascii (char c);

其中,c为待转换的字符。该函数执行的操作是将形参数值和0x7f做与运算,从而去掉第7位以上的所有位数。如果形参已是有效的ASCII字符,则不作处理,直接返回原字符。

1.16 大写字符宏转换函数

大写字符宏转换函数用于大写字符转换为小写字符,其函数原型如下: char _tolower(char c);

其中,c为待转换的大写字符。这其实是一个由宏定义完成的操作,其功能是将字符参数c与常数0x20逐位进行或运算,从而将大写字符转换为小写字符。 1.17 小写字符宏转换函数

小写字符宏转换函数用于小写字符转换为大写字符,其函数原型如下: char _toupper (char c);

其中,c为待转换的小写字符。这其实是一个由宏定义完成的操作,其功能是将字符参数c与常数0xdf逐位进行与运算,从而将小写字符转换为大写字符。 2 字符串函数

字符串函数的原型声明包含在头文件STRING.H中。在C51语言中,字符串应包括2个或多个字符,字符串的结尾以空字符来表示。字符串函数通过接受指针串来对字符串进行处理。常用的字符串函数介绍如下。 2.1 字符查找函数

字符查找函数用于在字符串中顺序查找字符,其函数原型如下: void *memchr(void*sl,char val,int len);

其中,s1为输入字符串,val为待查找的字符,len为查找的长度范围。该函数的功能是在字符串s1中顺序搜索前len个字符以找出字符val,如果找到则返回sl中指向val的指针,如果没有找到则返回NULL。 2.2 指定长度的字符串比较函数

指定长度的字符串比较函数用于按照指定的长度比较两个字符串的大小,其函数原型如下:

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

其中,s1和s2为输入字符串,len为比较的长度。该函数的功能是逐个比较字符串

7

sl和s2的前len个字符,如果相等则返回0,如果字符串s1大于s2,则返回一个正数,如果字符串s1小于s2,则返回一个负数。如果两个字符串的长度小于len,该函数仍将一直比较len个字符,这种情况下,有可能结果是错误的。因此应该保证len不能超过最短字符串的长度。 2.3 字符串复制函数

字符串复制函数用于复制指定长度的字符串,其函数原型如下: void*memcpy(void*dest,void*src,int len);

其中,dest为目标字符串,src为源字符串,len为复制的长度。该函数的功能是从src所指向的字符串中复制len个字符到dest字符串中,其返回值指向dest中的最后一个字符的指针。

2.4 带终止字符的字符串复制函数

带终止字符的字符串复制函数用于复制字符串,如果遇到终止字符则停止复制,其函数原型如下:

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

其中,dest为目标字符串,src为源字符串,val为终止字符,len为复制的长度。该函数的功能是复制字符串src中的len个字符到dest中,复制len个字符后则返回NULL。如果遇到字符val则停止复制,此时返回一个指向dest中的下一个元素的指针。 2.5 字符串移动函数

字符串移动函数同样用于复制字符串,其函数原型如下: void *memmove(void*dest,void*src,int len);

其中,dest为目标字符串,src为源字符串,len为复制长度。该函数的功能是从src所指向的字符串中复制len个字符到dest字符串中,其返回值指向dest中的最后一个字符的指针。其功能与memcpy相同,但是复制区间src与dest可以发生交迭。 2.6 字符串填充函数

字符串填充函数用于按规定的字符填充字符串,其函数原型如下: void*memset(void*s,char val,int len);

其中,s为待填充的字符串,val为填充字符,len为填充的长度。该函数实现的操作是用字符val来填充字符串s,共填充len个单元 2.7 字符串追加函数

字符串追加函数用于复制字符串到另一个字符串的尾部,其函数原型如下: void *strcat(char *s1,char *s2);

其中,s1为目标字符串,s2为待复制的字符串。该函数实现的操作是将字符串s2复制到字符串s1的尾部。其中字符串s1要有足够的大小来保存两个字符串。该函数的返回值指向字符串s1中的第一个字符的指针。 2.8 指定长度的字符串追加函数

指定长度的字符串追加函数用于复制指定长度的字符串到另一个字符串的尾部,其函数原型如下:

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

其中,s1为目标字符串,s2为待复制的字符串,n为复制的长度。该函数实现的操作是从字符串s2中复制n个字符添加到字符串s1的尾部。其中,如果字符串s2的长度比

8

n小,则将全部复制字符串s2(包括串结束符)。 2.9 字符串比较函数

字符串比较函数用于比较两个字符串的大小,其函数原型如下: char strcmp(char *s1,char *s2);

其中,s1和s2为待比较的字符串。该函数的功能是比较字符串s1和s2,如果两者相等则返回0;如果s1s2,则返回一个正数。 2.10 包含结束符的字符串比较函数

包含结束符的字符串比较函数用于比较两个字符串的大小,其函数原型如下: char*strncmp(char *s1,char *s2,int n);

其中,s1和s2为待比较的字符串,n为比较的长度。该函数的功能是比较字符串s1和s2的前n个字符,如果两者相等则返回0;如果s1s2,则返回一个正数。这里需要和memcmp函数相区别,如果字符串的长度小于n,则strncmp函数比较到字符串结束符后便停止,这和memcmp函数是不一样的。 2.11 字符串覆盖函数

字符串覆盖函数用于将一个字符串覆盖另一个字符串,其函数原型如下: char* strcpy(char *s1,char *s2);

其中,s1为目标字符串,s2为源字符串。该函数的功能是将字符串s2(包括结束符)复制到字符串s1中的第1个字符指针处。这里需要注意和strcat函数相区别,strcat函数将字符串s2复制到字符串s1的末尾。 2.12 指定长度的字符串覆盖函数

指定长度的字符串覆盖函数用于将一个指定长度的字符串覆盖另一个字符串,其函数原型如下:

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

其中,s1为目标字符串,s2为源字符串,n为长度。该函数实现的操作是从字符串s2(包括结束符)中复制n个字符到字符串s1中的第1个字符指针处。如果字符串s2的长度小于n,则s1串以0补齐到长度n。 2.13 获取字符串个数函数

获取字符串个数函数用于返回字符串中字符总数,其函数原型如下: char*strlen(char *s1);

其中,s1为输入字符串。该函数的功能是获取字符串s1中的字符个数,返回值的大小不包括结尾的字符串结束符。 2.14 搜索字符串函数

搜索字符串函数用于搜索字符串出现的位置,其函数原型如下: char*strstr(const char *s1,char*s2);

其中,s1为目标字符串,s2为搜索的字符串。该函数实现的操作是在字符串s1中搜索第一次出现字符串s2的位置,并返回该处的指针。如果字符串s1中不包括字符串s2,则该函数返回一个空指针。 2.15 搜索字符函数

搜索字符函数用于搜索字符出现的位置,其函数原型如下: char*strchr(char *s1,char c);

9

其中,s1为目标字符串,c为待搜索的字符。该函数的功能是搜索字符串s1中是否包含字符c,如果包含则返回第一次指向该字符的指针,否则返回NULL。被搜索的字符可以是串结束符,此时返回值是指向串结束符的指针。 2.16 返回位置值的字符搜索函数

返回位置值的字符搜索函数用于搜索并返回字符出现的位置,其函数原型如下: int strpos(char*s1,char c);

其中,s1为目标字符串,c为搜索的字符。该函数的功能是查找并返回字符c在字符串s1中第一次出现的位置值,没有找到该字符则返回-1,s1串首字符的位置值是0。strpos函数的功能与strchr类似,只不过返回值不同。 2.17 字符包含函数

字符包含函数用于检查字符串中是否包含某字符,其函数原型如下: char*strrchr(char *s1,char c);

其中,s1为目标字符串,c为查找的字符。该函数的功能是搜索字符串s1中是否包含字符c,如果包含则返回最后一次指向该字符的指针,否则返回NULL。被搜索的字符可以是串结束符,此时返回值是指向串结束符的指针。 2.18 返回位置值的字符包含函数

返回位置值的字符包含函数同样用于检查字符串中是否包含某字符,其函数原型如下:

int strrpos(char*s1,char c);

其中,s1为目标字符串,c为查找的字符。该函数的功能是查找并返回字符c在字符串s1中最后一次出现的位置值,没有找到该字符则返回-1,s1串首字符的位置值是0。strrpos函数的功能与strrchr类似,只不过返回值不同。 2.19 在指定字符集中查找不包含字符函数

在指定字符集中查找不包含字符函数用于查找不包含在指定字符集中的字符,其函数原型如下:

int strspn(char*s1,char*set);

其中,s1为目标字符串,set为字符集。该函数的功能是搜索字符串s1中第一个不包含在set串中的字符,返回值是字符串s1中包括在set中的字符的个数。如果s1中所有的字符都包含在set中,则返回s1的长度(不包括结束符)。如果set是空字符串则返回0。

2.20 在指定字符集中查找包含字符函数

在指定字符集中查找包含字符函数用于查找包含在指定字符集中的字符,其函数原型如下:

int strcspn(char*s1,char*set);

其中,s1为目标字符串,set为字符集。该函数的功能是搜索的是第一个包含在set串中字符,返回值是字符串s1中包括在set中的字符的个数。如果s1中所有的字符都包含在set中,则返回s1的长度(不包括结束符)。如果set是空字符串则返回0。 2.21 查找第一个包含字符函数

查找第一个包含字符函数用于查找第一个包含在指定字符集中的字符,其函数原型如下:

10

4.6 幂函数

幂函数用于进行幂指数运算。其函数原型如下: float pow(float x,floaty);

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

5 标准函数

标准函数主要用于完成数据类型转换以及存储器分配等操作。标准函数的原型声明包含在头文件STDLIB.H中。下面介绍常用的一些函数。 5.1 字符串转换函数

字符串转换函数用于将字符串转换成数值类型并输出。根据输出数值类型的不同,可以有如下几种形式:

float atoi(char*sl); float atol(char*sl); float atof(char*sl);

其中,atoi函数用于将字符串sl转换成整型数值并返回该值。输入字符串的格式为:[whitespace][{+/-}]数字。其中,whitespace可由空格、/、制表符组成。这里的数字可以是一个或多个十进制数。

16

5.2 带返回指针的字符串转换函

带返回指针的字符串转换函数将字符串转换成数值类型并输出,同时返回未转换部分的指针。根据输出数值类型的不同,可以有如下几种形式:

float strtod(const char*s,char**ptr);

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

unsigner long strtoul (const char*s,char**ptr,unsigned char base); 5.3 随机函数

随机函数用于产生伪随机数。在C51语言中,包含两种随机函数,其函数声明如下: int rand();

void srand(int n);

其中,函数rand用于返回一个0到32767之间的伪随机数,而函数srand用来初始化随机数发生器的随机种子。如果不使用srand函数,则对rand函数的相继调用将产生相同的随机序列。

5.4 数组内存分配函数

数组内存分配函数用于为n个元素的数组分配内存空间,其函数原型如下: void*calloc (unsighed int n,unsighed int size);

其中n数组元素的个数,size为数组中每个元素的大小。该函数所分配的内存区域用0进行初始化。返回值为已分配的内存单元起始地址,如果不成功则返回0。 5.5 释放内存函数

释放内存函数用于释放前面已分配的内存空间,其函数原型如下: void free (void xdata *p);

其中,指针p指向待释放的存储区域。p必须是以前用calloc、malloc或realloc函数分配的存储区域,如果p为NULL,则该函数无效。经free函数所被释放的存储区域可以参与以后的分配。 5.6 初始化内存函数

初始化内存函数用于对前面申请的内存进行初始化,其函数原型如下: void init_mempool (void xdata *p,unsighed int size);

其中,指针p表示存储区首地址,size表示存储区大小。该函数可对被函数calloc、malloc、free或realloc管理的存储区域进行初始化。 5.7 内存分配函数

内存分配函数用于在内存中分配指定大小的存储空间,其函数原型如下: void*malloc (unsighed int size);

其中,size为分配的空间大小,返回值为指向所分配内存的指针。如果返回NULL,则表示没有足够的内存空间可用。 5.8 调整内存大小函数

调整内存大小函数用于调整先前分配的存储器区域大小,其函数原型如下: void*realloc (void xdata *p,unsighed int size);

其中,参数p表示该存储区域的起始地址,参数size表示新分配的存储区域大小。该函数的返回值为新区域所指向的指针。如果返回NULL,则表示没有足够的内存空间可用。原存储器区域的内容被复制到新存储器区域中,如果新存储器区域较大,多出的区

17

域不作初始化。 6 内部函数

内部函数的原型声明包含在头文件INTRINS.H中。下面介绍常用的一些函数。 6.1 循环左移函数

循环左移函数主要用于将数据按照二进制循环左移n位。按照操作数据类型的不同,其函数原型如下几种形式:

unsighed char _crol_(unsighed char val,unsighed char n); unsighed int _irol_(unsighed int val,unsighed char n); unsighed long _lrol_(unsighed long val,unsighed char n);

其中,val为待移位的变量,n为循环移位的次数。函数_crol_、_irol_和_lrol_分别用于字符型、整型和长整形变量的循环左移,其返回值分别为移位后的字符型、整型和长整形。该函数与8051单片机的RLA指令相关。 6.2 循环右移函数

循环右移函数主要用于将数据按照二进制循环右移n位。按照操作数据类型的不同,其函数原型如下几种形式:

unsighed char _cror_(unsighed char val,unsighed char n); unsighed int _iror_(unsighed int val,unsighed char n); unsighed long _lror_(unsighed long val,unsighed char n);

其中,val为待移位的变量,n为循环移位的次数。函数_cror_、_iror_和_lror_分别用于字符型、整型和长整形变量的循环右移,其返回值分别为移位后的字符型、整型和长整形。该函数与8051单片机的RRA指令相关。 6.3 延时函数

延时函数用于使单片机程序产生延时,其函数原型如下: void_nop_(void);

该函数类似于 8051单片机的NOP指令。程序示例如下: #include //头文件 #include

void main(void) //主函数 {

P1=0xFF; //P1端口输出0xFF _nop_(); //延时 _nop_(); P1=0x00; //P1端口输出0x00 6.4 位测试函数

位测试函数用于对字节中的一位进行测试,其函数原型如下: void_testbit_(bit x);

其中,x为待测位变量。如果该位变量置位则函数返回1,同时将该位复位为0,否则返回0。该函数产生一个 8051单片机的JBC指令,其只能用于可直接寻址的位,不允许在表达式中使用。

18

7 绝对地址访问函数

绝对地址访问的函数包含在头文件ABSACC.H中,是一些宏定义的函数。下面分别介绍常用的一些函数。

7.1 BYTE型存储空间访问函数

BYTE型存储空间访问函数用于对8051单片机的存储空间进行绝对地址访问,可以做字节寻址。其宏定义原型如下:

#define CBYTE((unsighed char volatile code*)0) #define DBYTE((unsighed char volatile idata*)0) #define PBYTE((unsighed char volatile pdata*)0) #define XBYTE((unsighed char volatile xdata*)0) 7.2 WORD型存储空间访问

WORD型存储空间访问函数可以访问8051的所有存储器空间。其宏定义原型如下: #define CWORD((unsighed int volatile code*)0) #define DWORD ((unsighed int volatile idata*)0) #define PWORD ((unsighed int volatile pdata*)0) #define XWORD ((unsighed int volatile xdata*)0) 7.3 far存储区访问函数

far存储区访问函数用于访问far存储器区域。其宏定义原型如下: #define FVAR(object,addr)(*((object volatile far*)((addr)+0x10000L))) #define FCVAR(object,addr)(*((object const far*)((addr)+0x810000L))) 其中,FVAR用于访问far空间(存储类为HDATA),FCVAR用于访问const far 空间(存储类为HCONST)。 7.4 far存储区数组访问函数

19

far存储区数组访问函数用于访问far存储器区域的数组类型目标。其宏定义原型如下: #define FARRAY(object,base)(*((object volatile far*)((base)+0x10000L))) #define FCARRAY(object,base)(*((object const far*)((base)+0x810000L))) 其中,FARRAY用于访问far空间(存储类为HDATA),FCARRAY用于访问const far 空间(存储类为HCONST)。 8 变量参数表函数

变量参数表函数用于函数参数的个数和类型可变的场合。C51编译器允许函数的参数个数和类型是可变的,可使用简略形式(记号为“...”),这时参数表的长度和参数的数据类型在定义时是未知的。C51的变量参数表函数包含在头文件STDARG.H中,主要包括如下几个。

函数原型typedef char*va_list:其功能为将va_list定义成指向参数表的指针。 函数原型void va_start (ap,v)。其功能为初始化ap参数,其一般在一个可变长度参数表的函数中使用。在使用宏va_ arg进行存取前,必须调用函数来初始化可变参数表。

函数原型typedef va_arg(ap,type):其功能为从ap指向的可变长度参数表中检索type类型的值。对va_ arg的第一次调用将返回在va_start宏中指定的v参数后的第一个参数。继续调用va_ arg将返回剩下的后续参数。对于每一个参数可以只调用一次,而且必须按照参数表中的参数的次序进行。

函数原型void va_end (ap)。其功能为终止在va_start宏中已被初始化的可变长度参数表的指针ap,并且关闭参数表,结束对可变参数表的访问。 9 全程跳转函数

全程跳转函数用于正常系列函数的调用和函数结束,还允许从深层函数调用中直接返回。其原型声明包含在头文件SETJMP.H中。这里介绍一些常用的全程跳转函数。

函数原型typedef char jmp_buf[_jblen]:其功能为定义用于保存和恢复程序环境的缓冲区,供setjmp和longjmp所使用,其必须定义为全局变量。

函数原型int setjmp(jmp_buf env):其功能为将程序执行的当前环境状态信息存入变量env中。当直接调用setjmp时,返回值为0,当从longjmp调用时,返回值为非0。

函数原型void longjmp(jmp_buf env, int retal):其功能为恢复先前调用setjmp时存在env中的环境状态信息,并从setjmp语句的下一条语句执行。参数val为调用setjmp的返回值。

10 计算结构体成员的偏移量函数

计算结构体成员的偏移量函数包含在头文件STDDEF.H中。其函数声明如下: int offsetof (structure, member);

其中,structure为结构体,member为结构体成员。该函数计算member从开始位置的偏移量,并返回字节形式的偏移量值。 11 小结

本章详细讲解了C51语言中常用的库函数,主要包括字符函数、字符串函数、I/O函数、数学函数、标准函数、内部函数、绝对地址访问函数、变量参数表函数、全程跳转函数以及偏移量函数。这些库函数涵盖了常见的字符、字符串、数学计算、I/O控制等功能,读者在进行程序设计时可以直接调用使用。因此,熟练掌握和运用本章内容,可以大大减轻程序设计的负担,方便单片机的程序设计。

20

本文来源:https://www.bwwdw.com/article/kl4g.html

Top