C51库函数
C-51软件包的库包含标准的应用程序,每个函数都在相应的头文件(.h)中有原型声明。如果使用库函数,必须在源程序中用预编译指令定义与该函数相关的头文件(包含了该函数的原型声明)。
如果省掉头文件,编译器则期望标准的C参数类型,从而不能保证函数的正确执行。
3.1 CTYPE.H:字符函数
函数名: isalpha
原 型: extern bit isalpha(char)
功 能: isalpha检查传入的字符是否在‘A’-‘Z’和‘a’-‘z’之间,如果为真返回值为1,否则为0。
函数名: isalnum
原 型: extern bit isalnum(char)
功 能: isalnum检查字符是否位于‘A’-‘Z’,‘a’-‘z’或‘0’-‘9’之间,为真返回值是1,否则为0。
函数名: iscntrl
原 型: extern bit iscntrl(char)
功 能: iscntrl检查字符是否位于0x00~0x1F之间或0x7F,为真返回值是1,否则为0。
函数名: isdigit
原 型: extern bit isdigit(char)
功 能: isdigit检查字符是否在‘0’-‘9’之间,为真返回值是1,否则为0。
函数名: isgraph
原 型: extern bit isgraph(char)
功 能: isgraph检查变量是否为可打印字符,可打印字符的值域为0x21~0x7E。若为可打印,返回值为1,否则为0。
函数名: isprint
原 型: extern bit isprint(char)
功 能:除与isgraph相同外,还接受空格字符(0X20)。
函数名: ispunct
原 型: extern bit ispunct(char)
功 能: ispunct检查字符是否位为标点或空格。如果该字符是个空格或32个标点和格式字符之一(假定使用ASCII字符集中128个标准字符),则返回1,否则返回0。Ispunct对下列字符返回1:(空格)!“$%^&()+,-./:<=>?_[‘~{}
函数名: islower
原 型: extern bit islower(char)
功 能: islower检查字符变量是否位于‘a’-‘z’之间,为真返回值是1,否则为0。
函数名: isupper
原 型: extern bit isupper(char)
功 能: isupper检查字符变量是否位于‘A’-‘Z’之间,为真返回值是1,否则为0。
函数名: isspace
原 型: extern bit isspace(char)
功 能: isspace检查字符变量是否为下列之一:空格、制表符、回车、换行、垂直制表符和送纸。为真返回值是1,否则为0。
函数名: isxdigit
原 型: extern bit isxdigit(char)
功 能: isxdigit检查字符变量是否位于‘0’-‘9’,‘A’-‘F’或‘a’-‘f’之间,为真返回值是1,否则为0。
函数名: toascii
原 型: toascii(c)((c)&0x7F);
功 能:该宏将任何整型值缩小到有效的ASCII范围内,它将变量和0x7F相与从而去掉低7位以上所有数位。
函数名: toint
原 型: extern char toint(char)
功 能: toint将ASCII字符转换为16进制,返回值0到9由ASCII字符‘0’到‘9’得到,10到15由ASCII字符‘a’-‘f’(与大小写无关)得到。
函数名: tolower
原 型: extern char tolower(char)
功 能: tolower将字符转换为小写形式,如果字符变量不在‘A’-‘Z’之间,则不作转换,返回该字符。
函数名: _tolower
原 型: tolower(c);(c-‘A’+‘a’)
功 能:该宏将0x20参量值逐位相或。
函数名: toupper
原 型: extern char toupper(char)
功 能: toupper将字符转换为大写形式,如果字符变量不在‘a’-‘z’之间,则不作转换,返回该字符。
函数名: _toupper
原 型: _toupper(c);((c)-‘a’+’A’)
功 能: _toupper宏将c与0xDF逐位相与。
3.2 STDIO.H:一般I/O函数
C51编译器包含字符I/O函数,它们通过处理器的串行接口操作,为支持其它I/O机制,只需修改getkey()和putchar()函数,其它所有I/O支持函数依赖这两个模块,不需要改动。在使用8051串行口之前,必须将它们初始化,下例以2400波特率,12MHz初始化串口:
SCON=0x52
TMOD=0x20
TR1=1
TH1=0Xf3
其它工作模式和波特率等细节问题可以从8051用户手册中得到。
函数名: _getkey
原 型: extern char _getkey();
功 能: _getkey()从8051串口读入一个字符,然后等待字符输入,这个函数是改变整个输入端口机制应作修改的唯一一个函数。
函数名: getchar
原 型: extern char _getchar();
功 能: getchar()使用_getkey从串口读入字符,除了读入的字符马上传给putchar函数以作响应外,与_getkey相同。
函数名: gets
原 型: extern char *gets(char *s,int n);
功 能:该函数通过getchar从控制台设备读入一个字符送入由‘s’指向的数据组。考虑到ANSI标准的建议,限制每次调用时能读入的最大字符数,函数提供了一个字符计数器‘n’,在所有情况下,当检测到换行符时,放弃字符输入。
函数名: ungetchar
原 型: extern char ungetchar(char);
功 能: ungetchar将输入字符推回输入缓冲区,因此下次gets或getchar可用该字符。ungetchar成功时返回‘char’,失败时返回EOF,不可能用ungetchar处理多个字符。
函数名: _ungetchar
原 型: extern char _ungetchar(char);
功 能: _ungetchar将传入字符送回输入缓冲区并将其值返回给调用者,下次使用getkey时可获得该字符,写回多个字符是不可能的。
函数名: putchar
原 型: extern putchar(char);
功 能: putchar通过8051串口输出‘char’,和函数getkey一样,putchar是改变整个输出机制所需修改的唯一一个函数。
函数名: printf
原 型: extern int printf(const char*,…);
功 能: printf以一定格式通过8051串口输出数值和串,返回值为实际输出的字符数,参量可以是指针、字符或数值,第一个参量是格式串指针。
注:允许作为printf参量的总字节数由C51库限制,因为8051结构上存贮空间有限,在SMALL和COMPACT模式下,最大可传递15个字节的参数(即5个指针,或1个指针和3个长字节),在LARGE模式下,至多可传递40个字节的参数。格式控制串包含下列域(方括号内的域是可能的):%[flags][width][.precision]type“width”域定义了参量欲显示的字符数,它必须是一个十进制数,如果实际显示的字符数小于“width”,输出左端补以空格,如果“width”域以0开始,则左端补0。
“flag”域用来定义下面选项:
Falg 意 义
-
输出左齐
+
输出值如果是有符号数值,则加上+/-号
‘ ‘(空格)
输出值如果为正则左边补以空格显示
#如果它与0,x或X联用,则在输出前加上字符0、0x,0X。当与值类型g、G、f、e、E联用时,‘#’使输出数产生一个十进制小数点。
b,B
它们与格式类型d、i、o、u、x、X联用,这样参量类型被接受为‘[unsigned]char’,如:%bu,%bd或%bx。
L,L
它们与格式类型d、i、o、u、x、X联用,这样参量类型被接受为‘[unsigned]long’,如:%lu,%ld或%lx。
*
下一个参量不作输出。
“type“域定义参量如下类型:
字 符
类 型
输 出 格 式
d
int
有符号十进制数(16位)
U
int
无符号十进制数
o
int
无符号八进制数
X,x
int
无符号十六进制数
f
float
[-]dddd.dddd形式的浮点数
e,E
float
[-]d.ddddE[sign]dd形式的浮点数
g,G
float
e或f形式浮点数,看哪一种输出形式好。
c
char
字符
s
pointer
指向一个带结束符号的串
p
pointer
带存贮器指示符和偏移的指针。M:aaaa。
M:=C(ode),D(ata),I(data),P(data) aaaa:指针偏移值。
例子:
printf(“Int-Val%d,Char-Val%bd,Long-Val%d”,I,c,l);
printf(“String%s,Character%c”,array,character);
printf(“Pointer%p”,&array[10]);
函数名: sprintf
原 型: extern int sprintf(char *s,const char*,…);
功 能: sprintf与printf相似,但输出不显示在控制台上,而是通过一个指针S,送入可寻址的缓冲区。
注:sprintf允许输出的参量总字节数与printf完全相同。
函数名: puts
原 型: extern int puts(const char*,…);
功 能: puts将串‘s’和换行符写入控制台设备,错误时返回EOF,否则返回一非负数。
函数名: scanf
原 型: extern int scanf(const char*,…);
功 能: scanf在格式串控制下,利用getcha函数由控制台读入数据,每遇到一个值(符
号格式串规定),就将它按顺序赋给每个参量,注意每个参量必须都是指针。scanf返回它所发现并转换的输入项数。若遇到错误返回EOF。格式串包括:
l 空格、制表符等,这些空白字符被忽略。
l 字符,除需匹配的“%”(格式控制字符)外。
l 转换指定字符“%”,后随几个可选字符;赋值抑制符“*”,一个指定最大域宽的数。
注:scanf参量允许的总字节数与printf相同,格式控制串可包括下列域(方括号内是可选的):
%[flags][width]type
格式串总是以百分号开始,每个域包含一个或多个字符或数。
“width”域定义了参量可接受的字符数,“width”必须是一个正十进制数。如果实际输入字符数量小于“width”,则不会进行填充。
‘flag’域用来定义下面选项:
Flag
意 义
*
输入被忽略
b,h
它们用作格式类型d,i,o,u和x的前缀,用这些变量可定义参量是字符指针还是无符号字符指针。如%bu,%bd,%bx。
L
它们被作格式类型d,i,o,u和x的前缀,使用这个前缀可定义参量是长指针还是无符号字长指针。如%lu,%ld,%lx。
“type”域定义参量为如下类型:
描 述 符
类 型
输 入 格 式
d
ptr to int
有符号十进制数(16位)
i
ptr to int
如C中记号一样,整型值
u
ptr to int
无符号十进制数
o
ptr to int
无符号八进制数
x
ptr to int
无符号十六进制数
f,e,g
ptr to float
浮点数
c
ptr to char
一个字符
s
ptr to string
一个字串
例子:
scanf(“%d%bd%ld”,&i,&c,&l);
scanf(“%f”,&f);
scanf(“%3s,%c”,&string[0],&character);
函数名: sscanf
原 型: extern int sscanf(const *s,const char*,…);
功 能: sscanf与scanf方式相似,但串输入不是通过控制台,而是通过另一个以空结束
的指针。
注:sscanf参量允许的总字节数由C-51库限制,这是因为8051处理器结构内存的限制,在SMALL和COMPACT模式,最大允许15字节参数(即至多5个指针,或2个指针,2个长整型或1个字符型)的传递。在LARGE模式下,最大允许传送40个字节的参数。
3.3 STRING.H:串函数
串函数通常将指针串作输入值。一个串就包括2个或多个字符。串结以空字符表示。在函数memcmp,memcpy,memchr,memccpy,memmove和memset中,串长度由调用者明确规定,使这些函数可工作在任何模式下。
函数名: memchr
原 型: extern void *memchr(void *sl, char val,int len);
功 能: memchr顺序搜索s1中的len个字符找出字符val,成功时返回s1中指向val的
指针,失败时返回NULL。
函数名: memcmp
原 型: extern char memcmp(void *sl, void *s2,int len);
功 能: memcmp逐个字符比较串s1和s2的前len个字符。相等时返回0,如果串s1大
于或小于s2,则相应返回一个正数或负数。
函数名: memcpy
原 型: extern void *memcpy(void *dest, void *src,int len);
功 能: memcpy由src所指内存中拷贝len个字符到dest中,返回批向dest中的最后一
个字符的指针。如果src和dest发生交迭,则结果是不可预测的。
函数名: memccpy
原 型: extern void *memccpy(void *dest, void *src,char val,int len);
功 能: memccpy拷贝src中len个字符到dest中,如果实际拷贝了len个字符返回NULL。
拷贝过程在拷贝完字符val后停止,此时返回指向dest中下一个元素的指针。
函数名: memmove
原 型: extern void *memmove(void *dest, void *src,int len);
功 能: memmove工作方式与memcpy相同,但拷贝区可以交迭。
函数名: memset
原 型: extern void *memset(void *s, char val,int len);
功 能: memset 将val值填充指针s中len个单元。
函数名: strcat
原 型: extern char *strcat(char *s1, char *s2);
功 能: strcat将串s2拷贝到串s1结尾。它假定s1定义的地址区足以接受两个串。返
回指针指向s1串的第一字符。
函数名: strncat
原 型: extern char *strncat(char *s1, char *s2,int n);
功 能: strncat拷贝串s2中n个字符到串s1结尾。如果s2比n短,则只拷贝s2。
函数名: strcmp
原 型: extern char strcmp(char *s1, char *s2);
功 能: strcmp比较串s1和s2,如果相等返回0,如果s1s2则返回
一个正数。
函数名: strncmp
原 型: extern char strncmp(char *s1, char *s2,int n);
功 能: strncmp比较串s1和s2中前n个字符,返回值与strncmp相同。
函数名: strcpy
原 型: extern char *strcpy(char *s1, char *s2);
功 能: strcpy将串s2包括结束符拷贝到s1,返回指向s1的第一个字符的指针。
函数名: strncpy
原 型: extern char *strncpy(char *s1, char *s2,int n);
功 能: strncpy与strcpy相似,但只拷贝n个字符。如果s2长度小于n,则s1串以‘0’
补齐到长度n。
函数名: strlen
原 型: extern int strlen(char *s1);
功 能: strlen返回串s1字符个数(包括结束字符)。
函数名: strchr,strpos
原 型: extern char *strchr(char *s1, char c);
extern int strpos(char *s1,char c);
功 能: strchr搜索s1串中第一个出现的‘c’字符,如果成功,返回指向该字符的别指
针,搜索也包括结束符。搜索一个空字符返回指向空字符的指针而不是空指针。
strpos与strchr相似,但它返回字符在串中的位置或-1,s1串的第一个字符位置是0。
函数名: strrchr,strrpos
原 型: extern char *strrchr(char *s1, char c);
extern int strrpos(char *s1,char c);
功 能: strrchr搜索s1串中最后一个出现的‘c’字符,如果成功,返回指向该字符的
指针,否则返回NULL。对s1搜索也返回指向字符的指针而不是空指针。
strrpos与strrchr相似,但它返回字符在串中的位置或-1。
函数名: strspn,strcspn,strpbrk,strrpbrk
原 型: extern int strspn(char *s1, char *set);
extern int strcspn(char *s1,char *set);
extern char *strpbrk(char *s1,char *set);
extern char *strpbrk(char *s1,char *set);
功 能: strspn搜索s1串中第一个不包含在set中的字符,返回值是s1中包含在set里
字符的个数。如果s1中所有字符都包含在set里,则返回s1的长度(包括结束符)。如果s1是空串,则返回0。
strcspn与strspn类似,但它搜索的是s1串中的第一个包含在set里的字符。strpbrk与strspn很相似,但它返回指向搜索到字符的指针,而不是个数,如果未找到,则返回NULL。
strrpbrk与strpbrk相似,但它返回s1中指向找到的set字集中最后一个字符的指针。
3.4 STDLIB.H:标准函数
函数名: atof
原 型: extern double atof(char *s1);
功 能: atof将s1串转换为浮点值并返回它。输入串必须包含与浮点值规定相符的数。
C51编译器对数据类型float和double相同对待。
函数名: atol
原 型: extern long atol(char *s1);
功 能: atol将s1串转换成一个长整型值并返回它。输入串必须包含与长整型值规定相
符的数。
函数名: atoi
原 型: extern int atoi(char *s1);
功 能: atoi将s1串转换为整型数并返回它。输入串必须包含与整型数规定相符的数。
3.5 MATH.H:数学函数
函数名: abs,cabs,fabs,labs
原 型: extern int abs(int va1);
extern char cabs(char val);
extern float fabs(float val);
extern long labs(long val);
功 能: abs决定了变量val的绝对值,如果val为正,则不作改变返回;如果为负,则
返回相反数。这四个函数除了变量和返回值的数据不一样外,它们功能相同。
函数名: exp,log,log10
原 型: extern float exp(float x);
extern float log(float x);
extern float log10(float x);
功 能:exp返回以e为底x的幂,log返回x的自然数(e=2.718282),log10返回x以10
为底的数。
函数名: sqrt
原 型: extern float sqrt(float x);
功 能: sqrt返回x的平方根。
函数名:rand,srand
原 型: extern int rand(void);
extern void srand(int n);
功 能: rand返回一个0到32767之间的伪随机数。srand用来将随机数发生器初始化成
一个已知(或期望)值,对rand的相继调用将产生相同序列的随机数。
函数名: cos,sin,tan
原 型: extern float cos(flaot x);
extern float sin(flaot x);
extern flaot tan(flaot x);
功 能: cos返回x的余弦值。Sin返回x的正弦值。tan返回x的正切值,所有函数变量
范围为-π/2~+π/2,变量必须在±65535之间,否则会产生一个NaN错误。
函数名: acos,asin,atan,atan2
原 型: extern float acos(float x);
extern float asin(float x);
extern float atan(float x);
extern float atan(float y,float x);
功 能: acos返回x的反余弦值,asin返回x的正弦值,atan返回x的反正切值,它们
的值域为-π/2~+π/2。atan2返回x/y的反正切,其值域为-π~+π。
函数名: cosh,sinh,tanh
原 型: extern float cosh(float x);
extern float sinh(float x);
extern float tanh(float x);
功 能: cosh返回x的双曲余弦值;sinh返回x的双曲正弦值;tanh返回x的双曲正切
值。
函数名: fpsave,fprestore
原 型: extern void fpsave(struct FPBUF *p);
extern void fprestore (struct FPBUF *p);
功 能: fpsave保存浮点子程序的状态。fprestore将浮点子程序的状态恢复为其原始状
态,当用中断程序执行浮点运算时这两个函数是有用的。
3.6 ABSACC.H:绝对地址访问
函数名: CBYTE,DBYTE,PBYTE,XBYTE
原 型: #define CBYTE((unsigned char *)0x50000L)
#define DBYTE((unsigned char *)0x40000L)
#define PBYTE((unsigned char *)0x30000L)
#define XBYTE((unsigned char *)0x20000L)
功 能: 上述宏定义用来对8051地址空间作绝对地址访问,因此,可以字节寻址。CBYTE
寻址CODE区,DBYTE寻址DATA区,PBYTE寻址XDATA区(通过MOVX @R0命令),XBYTE寻址XDATA区(通过MOVX @DPTR命令)。
例:下列指令在外存区访问地址0x1000
xval=XBYTE[0x1000];
XBYTE[0X1000]=20;
通过使用#define指令,用符号可定义绝对地址,如符号X10可与XBYTE[0x1000]地址相等:#define X10 XBYTE[0x1000]。
函数名: CWORD,DWORD,PWORD,XWORD
原 型: #define CWORD((unsigned int *)0x50000L)
#define DWORD((unsigned int *)0x40000L)
#define PWORD((unsigned int *)0x30000L)
#define XWORD((unsigned int *)0x20000L)
功 能:这些宏与上面相似,只是它们指定的类型为unsigned int。通过灵活的数据类型,
所有地址空间都可以访问。
3.7 INTRINS.H:内部函数
函数名: _crol_,_irol_,_lrol_
原 型: unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
功 能:_crol_,_irol_,_lrol_以位形式将val左移n位,该函数与8051“RLA”指令
相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
y=0x00ff;
y=_irol_(y,4);
}
函数名: _cror_,_iror_,_lror_
原 型: unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
功 能:_cror_,_iror_,_lror_以位形式将val右移n位,该函数与8051“RRA”指令
相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
y=0x0ff00;
y=_iror_(y,4);
}
函数名: _nop_
原 型: void _nop_(void);
功 能:_nop_产生一个NOP指令,该函数可用作C程序的时间比较。C51编译器在_nop_函
数工作期间不产生函数调用,即在程序中直接执行了NOP指令。
例:
P()=1;
_nop_();
P()=0;
函数名: _testbit_
原 型:bit _testbit_(bit x);
功 能:_testbit_产生一个JBC指令,该函数测试一个位,当置位时返回1,否则返回0。
如果该位置为1,则将该位复位为0。8051的JBC指令即用作此目的。 _testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。
STDARG.H:变量参数表
C51编译器允许再入函数的变量参数(记号为“…”)。头文件STDARG.H允许处理函数的参数表,在编译时它们的长度和数据类型是未知的。为此,定义了下列宏。
宏 名: va_list
功 能: 指向参数的指针。
宏 名: va_stat(va_list pointer,last_argument)
功 能: 初始化指向参数的指针。
宏 名: type va_arg(va_list pointer,type)
功 能:返回类型为type的参数。
宏 名: va_end(va_list pointer)
功 能: 识别表尾的哑宏。
3.8 SETJMP.H:全程跳转
Setjmp.h中的函数用作正常的系列数调用和函数结束,它允许从深层函数调用中直接返回。
函数名: setjmp
原 型: int setjmp(jmp_buf env);
功 能: setjmp将状态信息存入env供函数longjmp使用。当直接调用setjmp 时返回值
是0,当由longjmp调用时返回非零值,setjmp只能在语句IF或SWITCH中调用一次。
函数名: long jmp
原 型: long jmp(jmp_buf env,int val);
功 能:longjmp恢复调用setjmp时存在env中的状态。程序继续执行,似乎函数setjmp
已被执行过。由setjmp返回的值是在函数longjmp中传送的值val,由setjmp调用的函数中的所有自动变量和未用易失性定义的变量的值都要改变。
3.9 REGxxx.H:访问SFR和SFR-BIT地址
文件REG51.H,REG52.H和REG552.H允许访问8051系列的SFR和SFR-bit的地址,这些文件都包含#include指令,并定义了所需的所有SFR名以寻址8051系列的外围电路地址,对于8051系列中其它一些器件,用户可用文件编辑器容易地产生一个“.h”文件。
下例表明了对8051 PORT0和PORT1的访问:
#include
main() {
if(p0==0x10) p1=0x50;
}
阅读(2491) | 评论(0) | 转发(0) |