当前位置 首页 >工作报告 > 述职报告 >

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

作者:jkyxc 浏览数:

 1 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.3

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

  1.4

 十进制数字检查函数 十进制数字检查函数用于检查形参字符是否为十进制数字,其函数原型如下:

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

 1.5

 可打印字符检查函数 可打印字符检查函数用于检查形参字符是否为可打印字符,其函数原型如下:

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

  1.6

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

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

 1.7

 格式字符检查函数 格式字符检查函数用于检查形参字符是否为标点、空格或格式字符,其函数原型如下:

 bit ispunct (char c); 其中,c 为待判断字符,如果是则返回 1,否则返回 0。

  1.8

 小写英文字母检查函数 小写英文字母检查函数用于检查形参字符是否为小写英文字母,其函数原型如下:

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

 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

 大写字符转换函数

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

 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 为比较的长度。该函数的功能是逐个比较字符串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 的长度比n 小,则将全部复制字符串 s2(包括串结束符)。

 2.9

 字符串比较函数 字符串比较函数用于比较两个字符串的大小,其函数原型如下:

 char strcmp(char *s1,char *s2); 其中,s1 和 s2 为待比较的字符串。该函数的功能是比较字符串 s1 和 s2,如果两者相等则返回 0;如果 s1<s2,则返回一个负数;如果 s1>s2,则返回一个正数。

 2.10

 包含结束符的字符串比较函数 包含结束符的字符串比较函数用于比较两个字符串的大小,其函数原型如下:

 char*strncmp(char *s1,char *s2,int n); 其中,s1 和 s2 为待比较的字符串,n 为比较的长度。该函数的功能是比较字符串 s1和 s2 的前 n 个字符,如果两者相等则返回 0;如果 s1<s2,则返回一个负数;如果 s1>s2,则返回一个正数。这里需要和 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); 其中,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

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

 char*strpbrk(char *s1,char*set); 其中,s1 为目标字符串,set 为字符集。该函数的功能是搜索字符串 s1 中第一个包含在 set 串中的字符,返回值指向搜索到的字符的指针,如果未找到,则返回 NULL。

 2.22

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

 char*strrpbrk(char *s1,char*set); 其中,s1 为目标字符串,set 为字符集。该函数的功能是搜索字符串 s1 中最后一个包含在 set 串中的字符,返回值指向搜索到的字符的指针,如果未找到,则返回 NULL。

 O 3

 I/O 函数

 I/O 函数主要用于数据的输入输出等操作,C51 的 I/O 库函数的原型声明包含在头文件 STDIO.H 中。这些 I/O 函数使用 8051 单片机的串行接口进行通信,因此,在使用之前需要先进行串口的初始化。例如:

 SCON=0x50;

  //串口模式 1,允许接收 TMOD|=0x20;

  //初始化 T1 为定时功能,模式 2 PCON|=0x80;

  //设置 SMOD=1 TL1=0xF4;

  //波特率 4800bit/s,初值 TH1=0xF4; IE|=0x90;

 //中断 TR1=1;

 //启动定时器 3.1

 字符读入函数 字符读入函数用于从串口读入一个字符,其函数原型如下:

 char _getkey(void); 该函数执行的操作是等待从 8051 的串口读入一个字符,并返回读入的原字符。程序示例如下:

 3.2

 字符读入输出函数 字符读入输出函数用于从串口读入一个字符并输出该字符,其函数原型如下:

 char getchar (void); 该函数与_getkey 函数有细微的不同,其执行的操作是使用_getkey 从串口读入的一个字符,然后使用 putchar 函数将读入的字符输出。

 3.3

 字符串读入函数 字符串读入函数用于从串口读入一个字符串,其函数原型如下:

 char *gets (char*s, int n); 其中,s 保存读入的字符串,n 为字符串的长度。该函数执行的操作是使用 getchar 函数从串口读入一个长度为 n 的字符串,并存入字符数组 s 中。如果遇到换行符,则结束字符的输入。输入成功时将返回传入的参数指针,失败时返回空指针 NULL。

 3.4

 字符回送函数 字符回送函数用于将输入的字符回送到输入缓冲区,其函数原型如下:

 char ungetchar (char c); 其中,c 为输入字符。该函数执行的操作是将输入的字符回送到输入缓冲区,如果函数调用成功则返回 char 型值 c,失败时则返回 EOF。

 3.5

 字符输出函数 字符输出函数用于通过 8051 串行口输出字符,其函数原型如下:

 char putchar (char c); 其中,c 为通过 8051 串行口输出的字符。

 3.6

 格式化输出函数 格式化输出函数用于按照一定的格式输出数据或字符串,其函数原型如下:

 int printf (const char *fmstr[,argument]…); 该函数的功能是以一定的格式通过 8051 单片机的串行口输出数值和字符串。其中第一个参数 fmstr 是格式控制字符串,参数 argument 可以是字符串指针、字符或数值,该函数的返回值为实际输出的字符个数。

 3.7

 格式化内存缓冲区输出函数 格式化内存缓冲区输出函数用于按照一定的格式将数据或字符串输出到内存缓冲区中,其函数原型如下:

 int sprintf (char*s,const char *fmstr[,argument]…); 该函数执行的操作是通过指针 s,将字符串送入内存数据缓冲区,并以 ASCII 码的形式储存。

 3.8

 字符串输出函数 字符串输出函数用于将字符串和换行符写入串行口,其函数原型如下:

 int puts (const char*s); 其中,s 为输出的字符串或换行符。如果执行成功则返回 0,错误时返回 EOF。程序示例如下:

  3.9

 格式化输入函数 格式化输入函数用于将字符串和数据按照一定的格式从串口读入,其函数原型如下:

 int scanf (const char *fmstr[,argument]…); 该函数的功能是在格式字符的控制下从串行口读入数据。其中每个参数都必须是指针。scanf 返回值是所发现并转换的输入项数,如遇到错误则返回 EOF。

 该函数的格式控制字符串形式如下,方括号内是可选项。

 %[*][width] [{B[h][l]}]type 3.10

 格式化内存缓冲区输入函数 格式化内存缓冲区输入函数用于将格式化的字符串和数据送入数据缓冲区,其函数原型如下:

 int sscanf (char*s,const char *fmstr[,argument]…); 该函数的功能是将输入的字符串通过指针 s 指向的数据缓冲区。输入数据根据格式控制字符串 fmstr 被存放到由 argument 指定的地址。其它方面,sscanf 函数与 scanf 函数类似。

 3.11

 字符串内存输出函数 字符串内存输出函数用于将格式化字符串输出到内存数据缓冲区,其函数原型如下:

 int vprintf (const char *fmstr,char *argptr); 其中,fmstr 为格式化字符串,argptr 指向变量表的指针而不是变量表,函数返回值为实际写入到输出字符串中的字符数。其它方面,vprintf 函数与 printf 函数类似。

 3.12

 指向缓冲区的输出函数 指向缓冲区的输出函数用于将格式化字符串和数字输出到由指针所指向的内存数据缓冲区,其函数原型如下:

 int vsprintf (char*s,const char *fmstr,char *argptr); 该函数执行的操作是将格式化字符串和数字输出到由指针所指向的内存数据缓冲区。其中,该函数接受的是一个指向变量表的指针而不是变量表,其返回值为实际写入到输出字符串中的字符数。其他方面 vsprintf 函数与 sprintf 函数类似。

 4

 数学函数

 数学函数主要用于进行数学运算,其原型声明包含在头文件 MATH.H 中。下面介绍一些常用的数学函数。

 4.1

 绝对值函数 绝对值函数用于计算并返回输出数据的绝对值。按照其操作数的数据类型的不同,有如下几种形式:

 int abs(int val); char cabs(char val); float fabs(float val); long labs(long val) 这些函数分别用于计算整型、字符型、浮点型以及长整型数据的绝对值。

 4.2

 指数以及对数函数 指数函数用于计算并返回输出数据的指数。对数函数用于计算并返回输出数据的对数。其函数原型示例如下:

 float exp(float x); float log(float x); float log10(float x); float sqrt(float x); 其中 exp 函数用于计算并返回浮点数 x 的指数,log 函数用于计算并返回浮点数 x 的自然对数(自然对数以 e 为底,e=2.718282),log10 函数用于计算并返回浮点数 x 的以10 为底的对数值,sqrt 函数用于计算并返回浮点数 x 的平方根。

 4.3

 三角函数 三角函数用于计算数学中三角函数的值。在 C51 语言中包含如下几种三角函数:

 float cos(float x); float sin(float x); float tan(float x); float acos(float x); float asin(float x); float atan(float x); float atan2(float y ,float x); float cosh(float x); float sinh(float x); float tanh(float x); 4.4

 取整函数 取整函数用于取输入数据的整数。在 C51 语言中,包含两类取整函数,示例如下:

 float ceil(float x); float floor(float x); 其中 ceil 函数用于计算并返回一个不小于 x 的最小正整数(作为浮点数),floor 函数用于计算并返回一个不大于 x 的最小正整数(作为浮点数)。

 4.5

 浮点型分离函数 浮点型分离函数用于将浮点型数据的整数和小数部分分开,其函数原型如下:

 float modf(float x,float*ip); 函数 modf 将浮点数 x 分成整数和小数两部分,整数部分放入*ip,返回值为小数部分。两者都含有与 x 相同的符号。

  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 可由空格、/、制表符组成。这里的数字可以是一个或多个十进制数。

 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,则表示没有足够的内存空间可用。原存储器区域的内容被复制到新存储器区域中,如果新存储器区域较大,多出的区域不作初始化。

 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 <intrins.h>

 //头文件 #include <reg51.h>

 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 指令,其只能用于可直接寻址的位,不允许在表达式中使用。

  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 存储区数组访问函数 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 控制等功

 能,读者在进行程序设计时可以直接调用使用。因此,熟练掌握和运用本章内容,可以大大减轻程序设计的负担,方便单片机的程序设计。

推荐访问:单片机 常用 语言

相关文章:

Top