文档库 最新最全的文档下载
当前位置:文档库 › Keil c51常用库函数汇总参考

Keil c51常用库函数汇总参考

Keil c51常用库函数汇总参考
Keil c51常用库函数汇总参考

Keil c51函数参考

一、数学函数

(1)cabs

原型:char cabs(char val);

功能:cabs函数取val的绝对值。

参数:一字节数val。

返回:cabs返回val的绝对值。

(2)abs

原型:Int abs(int val);

功能:求绝对值

参数:val整型数

返回:val的绝对值

(3)labs

原型:long labs(long val);

功能:labs函数确定长整数val的绝对值。

返回:val的绝对值。

(4)fabs

原型:float fabs(float val);

功能:fabs函数确定浮点数val的绝对值。

参数:

返回:fabs返回val的绝对值。

(5)sqrt

原型:float sprt(float x);

功能:sqrt函数计算x的平方根。

返回:sqrt函数返回x的正平方根。

(6)exp

原型:float exp(float x);

功能:exp函数计算自然对数中e的x次幂。e≈2.71828182845953581496,是无限循环小数。返回:e x的值。

(7)log

原型:float log(float val);

功能:log函数计算浮点数val的自然对数。自然对数基数为e。

返回:val的浮点自然对数。

(8)log10

原型:float log10(float val);

功能:logl0函数计算浮点数val的常用对数。常用对数为基数10。

返回:val的浮点常用对数。

(9)sin

原型:float sin(float x);

功能:sin函数计算浮点数x的正弦值。

参数:x必须在-65535~65535之间,或产生一个NaN错误。

返回:sin函数返回x的正弦。

(10)cos

原型:float cos(float x);

功能:COS函数计算浮点数X的余弦。

参数:X的值必须在-65535~65535之间,或产生一个NaN错误。返回:COS函数返回X的余弦。

(11)tan

原型:float tan(float x);

功能:tan函数计算浮点数x的正切值。

参数:x必须在-65535~65535之间,或错误值NaN。

返回:tan函数返回x的正切。

(12)asin

原型:float asin(float x);

功能:求反正弦

参数:浮点数x,取值必须在-1~1之间。

返回:X的反正弦,值在-π/2~π/2之间。

(13)acos

原型:float acos(float x);

功能:求反余弦

参数:浮点数x,取值必须在-1~1之间。

返回:x的反余弦,值在0~π之间。

(14)atan

原型:float atan(float x);

功能:求反正切

参数:浮点数x,取值必须在-1~1之间。

返回:X的反正切,值在-π/2~π/2之间。

(15)sinh

原型:float sinh(float x);

功能:sinh函数计算浮点数X的双曲正弦。

参数:x必须在-65535~65535之间,或产生一个NaN错误。

返回:sinh函数返回x的双曲正弦。

(16)cosh

原型:float cosh(float x);

功能:cosh函数计算浮点数X的双曲余弦。

参数:

返回:cosh函数返回X的双曲余弦。

(17)tanh

原型:float tanh(float x);

功能:tanh函数计算浮点数x的双曲正切。

返回:tanh函数返回x的双曲正切。

(18)atan2

原型:float atan2(float y,float x);

功能:计算浮点数y/x的反正切。

参数:浮点数y,浮点数x。

返回:反正切值,值在-π~π之间。x和y的符号确定返回值的象限。

(19)ceil

原型:float ceil(float val)

功能:ceil函数计算大于或等于val的最小整数值(收尾取整)。

参数:要化为整数的数。

返回:ceil函数返回不小于val的最小float整数值。

(20)floor

原型:float floor(float val);

功能:取整。

返回:floor函数返回不大于val的最大整数值。

(21)fmod

原型:float fmod(float x,float y);

功能:取模。

返回:x/y的浮点余数。

(22)modf

原型:float modf(float val,float *ip);

功能:modf函数把浮点数val分成整数和小数部分。

返回:modf函数返回带符号小数部分val。整数部分保存在浮点数ip中。

(23)pow

原型:float pow(float x,float y);

功能:pow函数计算x的y次幂。

返回:pow函数返回值x y。如果x≠0和y=O,pow返回值1;如果x=0和y≤0,pow返回NaN。如果x

二、空操作,左右位移等内嵌代码

(1)_nop_

原型:void _nop_(void);

功能:_nop_插入一个8051NOP空操作指令到程序,用来停顿1个CPU周期。本程序是固有函数,代码要求内嵌而不是调用。

返回:无。

(2)_testbit_

原型:bit _testbit_(bit b);

功能:_testbit_程序在生成的代码中用JBC指令来测试位b,并清零。

参数:本程序只能用在直接寻址位变量,对任何类型的表达式无效。固有函数,代码要求内嵌,而非调用。

返回:_testbit_程序返回值b

(3)_cror_

原型:unsigned char _cror_(unsigned char c, unsigned char b);

功能:_cror_程序字符c循环右移b位。固有函数,代码要求内嵌,而不是调用。参数:返回:右移的结果

(4)_iror_

原型:unsigned int _iror_(unsigned int i, unsigned char b);

功能:_iror_程序将整数i循环右移b位。固有函数,代码要求内嵌而不是被调用。

参数:i右移的整数,b右移的次数。

返回:_iror_程序返回右移后的值。

(5)_lror_

原型:unsigned long _lror_(unsigned long l,unsigned char b);

功能:_lror_程序将长整数l循环右移b位。固有函数代码,要求内嵌而不是被调用。

参数:l要右移的数,b要右移的位数。

返回:返回右移后的值。摘要:#include

(6)_crol_

原型:unsigned char _crol_(unsigned char c, unsigned char b);

功能:_crol_程序字符c循环左移b位。固有函数,代码要求内嵌,而不是调用。

参数:

返回:左移的结果

(7)_irol_

原型:unsigned int _irol_(unsigned int i, unsigned char b);

功能:_irol_程序将整数i循环左移b位。固有函数,代码要求内嵌而不是被调用。

参数:i左移的整数,b左移的次数。

返回:_irol_程序返回左移后的值。

(8)_lrol_

原型:unsigned long _lrol_(unsigned long l,unsigned char b);

功能:_lrol_程序将长整数l循环左移b位。固有函数,代码要求内嵌而不是被调用。

参数:l要左移的数,b要左移的位数。

返回:返回左移后的值。

(9)_chkfloat_

原型:unsigned char _chkfloat_(float val);

功能:检查浮点数的状态。

参数:浮点型变量。

返回:0,标准浮点数;1,浮点数0;2,正溢出;3,负溢出;4,NaN(不是一个数)错误状态。

(10)_push_

原型:void _push_(unsigned char _sfr);

功能:将特殊功能寄存器_sfr压入堆栈。

(11)_pop_

原型:void _pop_(unsigned char _sfr);

功能:将堆栈中的数据弹出到特殊功能寄存器_sfr。

三、字串转数字,随机数,存储池管理

(1)atof

原型:float atof(void *string);

功能:将浮点数格式的字符串转换为浮点数。如果string的第一个字符不能转换成数字,就停止处理。

参数:格式为,[{+|-}]数字[.数字][{e|E}[{+|-}]数字]。如,-12.345e+67

返回:atof函数返回string的浮点值。

(2)atoi

原型:int atoi(void *string);

功能:atoi函数转换string为一个整数值。string是一个字符序列,可以解释为一个整数。如果string的第一个字符不能转换成数字,就停止处理。

参数:atoi函数要求string有这样的格式:[空格][{+|-}]数字,如”123456”。

返回:atoi函数返回string的整数值。

(3)atol

原型:long atol(void *string);

功能:atol函数转换string为一个长整数值。string是一个字符序列,可以解释为一个长整数。如果string的第一个字符不能转换成数字,就停止处理。

参数:atol函数要求string有这样的格式:[空格][{+|-}]数字,如”1234567890”。

返回:atol函数返回string的长整数值。

(4)rand

原型:int rand(void);

功能:rand函数产生一个0~32767之间的虚拟随机数。

返回:rand函数返回一个虚拟随机数。

(5)srand

原型:void srand(int seed);

功能:srand函数设置rand函数所用的虚拟随机数发生器的起始值seed,随机数发生器对任何确定值seed产生相同的虚拟随机数序列。

返回:无。

(6)strtod

原型:unsigned long strtod(const char *string, char **ptr);

功能:strtod函数将一个浮点数格式的字符串string转换为一个浮点数。字符串开头的空白字符被忽略。

参数:要求string有下面的格式:[{+|-}]digits[.digits][{e|E}[{+|-}]digits]digits可能是一个或多个十进制数。ptr的值设置指针到string中转换部分的第一个字符。如果ptr是NULL,没有值和ptr关联。如果不能转换,则prt就设为string的值,strtod返回0。

返回:strtod函数返回由string生成的浮点数。

(7)strtol

原型:long strtol(const char *string, char **ptr, unsigned char base);

功能:strtol函数将一个数字字串string转换为一个long值。

参数:输入string是一个字符序列,可以解释为一个整数。字符串开头的空白字符被忽略,符号可选。要求string有下面的格式:[whitespace][{+|-}]digitsdigits可能是一个或多个十进制数。如果base是零,数值应该有一个十进制常数、八进制常数或十六进制常数的格式。数值的基数从格式推出。如果base在2~36之间,数值必须是一个字母或数字的非零序列,表示指定基数的一个整数。字母a~z(或A~Z)分别表示值10~36。只有小于base的字母表示的值是允许的。如果base是16,数值可能以0x或0X开头,0x或0x被忽略。prt的值设置指针指向string中转换部分的第一个字符。如果prt是NULL,没有值和ptr关联。如果不能转换,prt设置为string的值,strtol返回0。

返回:strtol函数返回string生成的整数值。如溢出则返回LONG_MIN或LONG_MAX。

(8)strtoul

原型:unsigned long strtoul(const char *string, char **ptr, unsigned char base);

功能:strtoul函数转换string为一个unsigned long值。

参数:与strtol函数类似。

返回:strtoul函数返回string生成的整数值。如溢出则返回ULONG_MAX。

(9)init_mempool

原型:void inti_mempool(void xdata *p, unsigned int size);

功能:init_mempool 函数初始化存储管理程序,提供存储池的开始地址和大小。本函数必

须在任何其他的存储管理函数(calloc,free,malloc,realloc)被调用前设置存储池,只在程序的开头调用一次。可以修改源程序以适合硬件环境。

参数:p参数指向一个xdata的存储区,用calloc,free,malloc和realloc库函数管理。size 参数指定存储池所用的字节数。

返回:无。

(10)malloc

原型:void xdata *malloc(unsigned int size);

功能:malloc函数从存储池分配size字节的存储块。

返回:malloc返回一个指向所分配的存储块的指针,如果没有足够的空间,则返回一个NULL 指针。

(11)free

原型:void free(void xdata *p);

功能:free函数返回一个存储块到存储池。p参数指向用calloc、malloc或realloc函数分配的存储块。一旦块返回到存储就可被再分配。如果p是一个NULL指针,被忽略。本程序的源代码在\KEIL\C51\LIB目录中,可以修改源程序,根据硬件来定制本程序。

参数:

返回:无。

(12)realloc

原型:void xdata *realloc(void xdata *p,unsigned int size);

功能:realloc函数改变已分配的存储块的大小。本程序的源代码在目录KEIL\C5I\LIB中,可以根据硬件环境定制本函数。

参数:P参数指向己分配块,size参数指定新块的大小。原块的内容复制到新块,新块中的任何其他区,如果是一个更大的块不初始化。

返回:realloc返回一个指向新块的指针。如果存储池没有足够的存储区,返回一个NULL指针,存储块不受影响。

(13)calloc

原型:void xdata *calloc(unsigned int num,unsigned int len);

功能:calloc函数从一个数组分配num个元素的存储区。每个元素占用len字节,并清0。字节总数为num*len。在LIB目录提供程序的源代码。可以修改源程序,为硬件定制本函数。参数:num为元素数目,len为每个元素的长度。

返回:calloc函数返回一个指针,指向分配的存储区,如果不能分配,则返回一个NULL指针。

四、流输入输出

(1)_getkey

原型:char _getkey(void);

功能:_getkey函数等待从串口接收字符。_getkey和putchar函数的源代码可以修改,提供针对硬件的字符级的I/O。

返回:接收到的字符

(2)getchar

原型:char getchar(void);

功能:getchar函数用_getkey函数从输入流读一个字符。所读的字符用putchar函数显示。本函数基于_getkey或putchar函数的操作。这些函数,在标准库中提供,用8051的串口读和写字符。定制函数可以用别的I/O设备。

返回:所读的字符。

(3)ungetchar

原型:char ungetchar(char c);

功能:ungetchar函数把字符c放回到输入流。子程序被getchar和别的返回c的流输入函数调用。getchar在调用时只能传递一个字符给ungetehar。

参数:

返回:如果成功,ungetchar函数返回字符c。如果调用者在读输入流时调用ungetchar多次,返回EOF表示一个错误条件。

(4)putchar

原型:char putchr(char c);

功能:putchar函数用8051的串口输出字符c。本程序指定执行,功能可能有变。因提供了_getkey和putchar函数的源程序,可以根据任何硬件环境修改以提供字符级的I/O。

参数:

返回:putchar函数返回输出的字符c。

(5)printf

原型:int printf(const char *fmtstr [,arguments]…);

功能:printf函数格式化一系列的字符串和数值,生成一个字符串用putchar写到输出流。参数:fmtstr参数是一个格式化字符串,可能是字符、转义系列和格式标识符。普通的字符和转义系列按说明的顺序复制到流。格式标识符通常以百分号(%)开头,要求在函数调用中包含附加的参数Arguments。格式字符串从左向右读。第一个格式标识符使用fmtstr后的第一个参数,用格式标识符转换和输出。第二个格式标识符访问fmtstr后的第二个参数。如果参数比格式标识符多,多出的参数被忽略。如果参数不够,结果是不可预料的。格式标识符用下面的格式:%[flags][width][.precision][{b|B|l|L}]type格式标识符中的每个域可以是一个字符或数字type域是一个字符,指定参数是否解释为一个字符、字符串、数字或指针。如下表所示:可选的字符b或B和l和L可直接放在类型字符前,分别指定整数类型d、i、u、o、x和X的char或long版本。flags 域是单个字符,用来对齐、输出和打印+/-号、空白、小数点、八进制和十六进制的前缀。如下表所示:width 域是一个非负数字,指定显示的最小字符数。如果输出值的字符数小于width,空白会加到左边或右边(当指定了一个标记)以达到最小的宽度。如果width用一个’0’作前缀,则填充的是零而不是空白。width域不会截短一个域。如果输出值的长度超过指定宽度,则输出所有的字符。width域可能是星号(*),在这种情况下,参数列表的一个int参数提供宽度值。如果参数使用的是unsigned char,在星号标识符前指定一个’b’。precision域是非负数字,指定显示的字符数、小数位数或有效位。precison域可能使输出值切断或舍入。precision域可能是星号(*),在这种情况,参数列表的一个int参数提供宽度值。如果参数使用的是unsigned char,在星号标识符前指定一个’

b’。本函数指定执行基于putchar函数的操作。本函数作为标准库提供,用805l的串口写字符,用别的I/O设备可以定制函数。必须确保参数类型和指定的格式匹配。可用类型映射确保正确的类型传递到printf。可传递给printf 的总的字节数受到8051 的存储区的限制。SMALL 模式和COMPACT模式最多15字节,LARGE模式最多40字节。

返回:printf函数返回实际写到输出流的字符数。

(6)sprintf

原型:int sprintf(char *buffer,const char *fmtstr [,arguments]…);

功能:sprintf函数格式化一系列的字符串和数值,并保存结果字符串在buffer fintstr。参数:参数是一个格式字符串,和printf函数指定的要求相同。

返回:sprintf函数返回实际写到buffer的字符数。

(7)vprintf

原型:void vprintf(const char *fmtstr, char *argptr);

功能:vprintf函数格式化一系列字符串和数字值,并建立一个用puschar函数写到输出流的字符串,函数类似于printf的副本,但使用参数列表的指针,而不是一个参数列表。本函数是指定执行的,基于putchar函数的操作。本函数作为标准库提供,用8051的串口写字符。别的I/O设备可以定制函数。

参数:fmtstr参数是一个指向一个格式字符串的指针,和printf函数的fmtstr参数有相同的形式和功能。argptr参数指向一系列参数,根据格式中指定的对应格式转换和输出。

返回:vprintf函数返回实际写到输出流的字符数。

(8)vsprimf

原型:void vsprintf(char *buffer, const char *fmtstr, char *argptr);

功能:vsprintf函数格式化一系列字符串和数字值,并保存字符串在Buffer中。函数类似于sprintf的副本,但使用参数列表的指针,而不是一个参数列表。

参数:fmtstr参数是一个指向一个格式字符串的指针,和printf函数的fmtstr参数有相同的形式和功能。argptr参数指向一系列参数,根据格式中指定的对应格式转换和输出。

返回:vsprintf函数返回实际写到输出流的字符数。

(9)gets

原型:char *gets(char *string, int len);

功能:gets函数调用getchar函数读一行字符到string。这行包括所有的字符和换行符('\n')。在string中换行符被一个NULL字符('\n')替代。len参数指定可读的最多字符数。如果长度超过len,gets函数用NULL字符终止string并返回。本函数指定执行基于_getkey或putchar 函数的操作。这些函数,在标准库中提供,用8051的串口读写。对别的I/O设备可以定制。参数:string要读的字符串,len最多字符数。

返回:gets函数返回string

(10)scanf

原型:int scanf(sonst char *fmtstr [,argument]…);

功能:scanf函数用getchar程序读数据。输入的数据保存在由argument根据格式字符串fmtstr 指定的位置。

参数:每个argument必须是一个指针,指向一个变量,对应fmtstr定义的类型,fmtstr控制解释输入的数据,fmtstr参数由一个或单个空白字符、非空白字符和下面定义的格式标识符组成。

·空白字符,空白(' '),制表('\t')或换行('\n'),使scanf跳过输入流中的空白字符。格式字符串中的单个的空白字符匹配输入流的0或多个空白字符。

·非空白字符,除了百分号('%'),使scanf从输入流读但不保存一个匹配字符。如果输入流的下一个字符和指定的非空白字符不匹配,scanf函数终止。

·格式标识符以百分号('%')开头,使scanf从输入流读字符,并转换字符到指定的类型值。转换后的值保存在参数列表的argument中。百分号后面的字符不被认为是一个格式标识符,只作为一个普通字符。例如%%匹配输入流的一个百分号。格式字符串从左向右读,不是格式标识符的字符必须和输入流的字符匹配。这些字符从输入流读入,但不保存,如果输入流的一个字符和格式字符串冲突,scanf终止。任何冲突的字符仍保留在输入流中。在格式字符串中的第一个格式标识符引用fmtstr后面的第一个参数,并转化输入字符,用格式标识符保存值。第二个格式标识符访问fmtstr后面的第二个参数,等等。如果参数比格式标识符多,多出的参数被忽略。如果没有足够的参数匹配格式标识符,结果是不可预料的。输入流中的值被输入域调用,用空白字符隔开。在转换输入域时,scanf遇到一个空白字符就结束一个参数的转换,而且任何当前格式标识符不认识的字符会结束一个域转换。格式标识符的格式:%[*][width][{b|h|l}]type格式标识符中的每个域可以是单个字符或数字,用来指定一个特殊的格式选项。type域是单个字符,指定输入字符是否解释为一个字符、字符串或数字。本域可以是下表中的任何值。以星号(*)作为格式标识符的第一个字符,会使输入域被扫描但不保存。星号禁止和格式标识符关联。width域是一个非负数,指定从输入流读入的最多字符数。从输入流读入的字符不超过width,并根据相应的argument转换。然而,如果一个空白字符或一个不认识字符先遇到,则读入的字符数小于width。可选字符b,h和l直接放在类型字符前面,分别指定整数类型d,i,u,o和x的char,short或long版本。本函数指定执行基于_getkey或putchar函数的操作。这些函数,作为标准库提供,用805l的串口读写。可对别的I/O设备定制函数。可以传递给scanf的字节数受8051存储区的限制。SMALL 模式或COMPACT模式最多为15字节。LARGE模式最多为40字节。

返回:scanf函数返回成功转换的输入域的数目。如果有错误则返回EOF。

(11)sscanf

原型:int sscanf(char *buffer,const char *fmtstr [,argument]…);

功能:sscanf函数从buffer读字符串。

参数:输入的数据保存在由argument根据格式字符串fmtstr指定的位置。每个argument 必须是指向变量的指针,对应定义在fmtstr 的类型,控制输入数据的解释。fmtstr参数由一个或多个空白字符、非空白字符和格式标识符组成,如同scanf函数所定义。

返回:sscanf函数返回成功转换的输入域的数目,如果出现错误则返回EOF。

(12)puts

原型:int puts(const char *string);

功能:puts函数用putchar函数写string和换行符\n到输出流。本函数指定执行基于putchar 函数的操作。本函数作为标准库提供,写字符到8051的串口。用别的I/O口可以定制函数。

参数:输出的字符串。

返回:如果出现错误,puts函数返回EOF,如果没有则返回0。

五、字符测试

(1)isalpha

原型:bit isalpha(char c);

功能:isalpha函数测试参数c,确定是否是一个字母(‘A’~’Z’,’a’~’z’)。

返回:如果c是一个字母,isalpha函数返回1(真),否则返回0(假)。

(2)isalnum

原型:bit isalnum(char c);

功能:isalnum函数测试参数c,确定是否是一个字母或数字字符(‘A’~’Z’,’a’~’z’,’0’~’9’)。

返回:如果c是一个字母或数字字符,isalnum函数返回1(真),否则返回0(假)。

(3)iscntrl

原型:bit iscntrl (char c);

功能:iscntrl函数测试参数c,确定是否是一个控制字符(0x00~0x1F或0x7F)。

返回:如果c是一个控制字符,iscntrl函数返回1(真),否则返回0(假)。

(4)isdigit

原型:bit isdigit(char c);

功能:isdigit函数测试参数c,确定是否是一个十进制数(’0’~’9’)。

返回:如果c是一个十进制数,isdigit函数返回1(真),否则返回0(假)。

(5)isgraph

原型:bit isgraph(char c);

功能:isgraph函数测试参数c,确定是否是一个可打印字符(0x21~0x7E,不包括空格)。

返回:如果c是一个可打印字符,isgraph函数返回1(真),否则返回0(假)。

(6)isprint

原型:bit isprint(char c);

功能:isprint函数测试参数c,确定是否是一个可打印字符(0x20~0x7E)。

返回:如果c是一个可打印字符,isprint函数返回1(真),否则返回0(假)。

(7)ispunct

原型:bit ispunct(char c);

功能:ispunct函数测试参数c,确定是否是一个标点符号字符( ! , . : ; ? ”# $ % &’` ( ) <> [ ] { }* + - = / | \ @ ^ _ ~ )。

返回:如果c是一个标点符号字符,ispunct函数返回1(真),否则返回0(假)。

(8)islower

原型:bit islower(char c);

功能:islower函数测试参数c,确定是否是一个小写字母字符(‘a’~’z’)。

返回:如果c是一个小写字母字符,islower函数返回1(真),否则返回0(假)。

(9)isupper

原型:bit isupper(char c);

功能:isupper函数测试参数c,确定是否是一个大写字母字符(‘A’~’Z’)。

返回:如果c是一个大写字母字符,isupper函数返回1(真),否则返回0(假)。

(10)isspace

原型:bit isspace(char c);

功能:isspace函数测试参数c,确定是否是一个空白字符(0x09~0x0D或0x20)。

返回:如果c是一个空白字符,isspace函数返回1(真),否则返回0(假)。

(11)isxdigit

原型:bit isalnum(char c);

功能:isalnum函数测试参数c,确定是否是一个十六进制数(‘A’~’F’,’a’~’f’,’0’~’9’)。

返回:如果c是一个十六进制数,isalnum函数返回1(真),否则返回0(假)。

(12)tolower

原型:char tolower(char c);

功能:tolower函数转换c为一个小写字符。如果c不是一个字母,tolower函数无效。

(13)toupper

原型:char toupper(char c);

功能:toupper函数转换c为一个大写字符。如果c表示一个字母,toupper函数无效。

参数:

返回:toupper宏返回c的大写。

(14)toint

原型:char toint(char c);

功能:toint函数解释c为十六进制值。ASCII字符’0’~’9’生成值0~9。ASCII字符’A’~’F’和’a’~’f’生成值10~15。如果c表示一个十六进制数,函数返回-1。

返回:toint宏返回c的十六进制ASCII值。

(15)_tolower

原型:#define _tolower(c) ( (c)-'A'+'a' )

功能:_tolower宏是在已知c是一个大写字符的情况下可用的lower的一个版本。

返回:_tolower宏返回c的小写。

(16)_toupper

原型:#define _toupper(c) ( (c)-'a'+'A' )

功能:_toupper宏是在已知c是一个小写字符的情况下可用的toupper的一个版本。

返回:_toupper宏返回c的大写。

(17)toascii

原型:#define toascii(c) ( (c) & 0x7F )

功能:toascii宏转换c为一个7位ASCII字符。宏只转换变量c的低7位。

返回:toascii宏返回c的7位ASCII字符。

六、跳转

(1)setjmp

原型:volatile int setjmp(jmp_buf env);

功能:setjmp函数保存当前CPU的状态在env,该状态可以调用longjmp函数来恢复。参数:当同时使用时,setjmp和longjmp函数提供一种方法实行非局部跳转。setjmp函数保存当前指令地址和别的CPU寄存器。一个longjmp的并发调用恢复指令指针和寄存器,在setjmp 调用后面恢复运行。只有声明了volatile属性的局部变量和函数参数被恢复。

返回:当CPU的当前状态被复制到env,setjmp函数返回一个0。一个非零值表示执行了longjmp函数来返回setjmp函数调用。在这种情况下,返回值是传递给longjmp函数的值。

(2)longjmp

原型:volatile void longjmp(jmp_bufenv,int retval);

功能:longjmp函数恢复用setjmp函数保存在env的状态。retval参数指定从setjmp函数调用返回值。longjmp和setjmp函数可以用来执行非局部跳转,通常用来控制一个错误恢复程序。只有用volatile属性声明的局部变量和函数参数被恢复。

七、字符串操作

(1)strcat

原型:char *strcat(char *s1,char *s2);

功能:strcat函数连接或添加s2到s1,并用NULL字符终止s1。

参数:s1目标字符串,s2源字符串。

返回:s1。

(2)strncat

原型:char *strncat(char *s1,char *s2,int len);

功能:strncat函数从s2添加最多len个字符到s1,并用NULL结束。如果s2的长度小于len,s2连带NULL全部复制。

参数:s1目标字符串,s2源字符串,len连接的最多字符数。

返回:strncat函数返回s1。

(3)strcmp

原型:char strcmp(char *s1,char *s2);

功能:strcmp函数比较字串s1和s2的内容,并返回一个值表示它们的关系。

返回:若s1s2返回正数。

(4)strncmp

原型:char *strncmp(char *s1,char *s2,int len);

功能:strncmp函数比较s1的前len字节和s2,返回一个值表示它们的关系。

参数:s1,s2为字串,len为比较的长度。

返回:若s1s2返回正数。

(5)strcpy

原型:char *strcpy(char *s1, char *s2);

功能:strcpy函数复制字符串s2到字符串s1,并用NULL字符结束s1。

参数:s1目标字符串,s2源字符串。

返回:字符串s1。

(6)strncpy

原型:char *strncpy(char *dest, char *s2, int len);

功能:strncpy函数从字符串s2复制最多len个字符到字符串s1。

返回:字符串s1。

(7)strlen

原型:int strlen(char *s);

功能:strlen函数计算字符串s的字节数,不包括NULL结束符。

参数:s要测试长度的字串。

返回:字符串s的长度。

(8)strchr

原型:char *strchr(const char *s, char c);

功能:strchr函数搜索字符串s中第一个出现的c。s中的NULL字符终止搜索。

参数:s被搜索的字符串,c要查找的字符。

返回:字符串s中指向c的指针,如没有发现则返回一个NULL指针。

(9)strops

原型:int strpos(const char *s, char c);

功能:strpos函数查找字符串s中c的第一次出现,包括s的NULL结束符。

参数:s被搜索的字符串,c要查找的字符。

返回:s中和c匹配的字符的索引。如没匹配则返回-1。s中第一个字符的索引是0。

(10)strrchr

原型:char *strrchr(const char *s, char c);

功能:strrchr函数查找字符串s中c的最后一次出现,包括s的NULL结束符。

参数:s被搜索的字符串,c要查找的字符。

返回:strrchr函数返回s中和c匹配的字符的指针,如没匹配则返回NULL。

(11)strrpos

原型:int strrpos(const char *s, char c);

功能:strrpos函数查找字符串s中c的最后一次出现,包括s的NULL结束符。

参数:s被搜索的字符串,c要查找的字符。

返回:s中和c匹配的最后字符的索引。如没匹配则返回-1,s中第一个字符的索引是0。

(12)strcspn

原型:int strcspn(char *s, char *set);

功能:在字符串s中查找字符串set中的任何字符。

参数:s源字串,set查找的字串。

返回:strcspn函数返回s中和set匹配的第一个字符的索引。如果s的第一个字符和set中的一个字符匹配,返回0。如果s中没有字符匹配,返回字符串的长度。

(13)strpbrk

原型:char *strpbrk(char *s, char *set);

功能:查找字符串s中第一个出现的set中的任何字符,不包括NULL结束符。

参数:s源字串,set查找的字串。

返回:s匹配的字符的指针。如果s没有字符和set匹配,返回一个NULL指针。

(14)strrpbrk

原型:char *strrpbrk(char *s, char *set);

功能:查找字符串s中最后一个出现的set中的任何字符,不包括NULL结束符。

返回:s最后匹配的字符的指针。如果s没有字符和set匹配,返回一个NULL指针。

(15)strspn

原型:int strspn(char *s, char *set);

功能:查找字符串s中set没有的字符。

返回:strspn函数返回s第一个和set不匹配的字符的索引。如果s中的第一个字符和set 中的字符不匹配,返回0。如果s中的所有字符set中都有,返回string的长度。

(16)strstr

原型:char *strstr(const char *s, char *sub);

功能:在字符串s中搜索子串sub。

返回:strstr函数返回子字符串sub在字符串s中第一次出现的位置的指针。指针指向第一次出现的开头。如果s中不存在sub,则返回一个NULL指针。

(17)memcmp

原型:char memcmp(void *buf1,void *buf2,int len);

功能:memcmp函数比较两个缓冲区buf1和bur2长度为len的字节,并返回一个值。

返回:若返回0,则bufl=buf2;若返回负数,则buf1bul2。

(18)memcpy

原型:void *memcpy(void *s1,void *s2,int len);

功能:memcpy函数从字符串s2复制len字节到字符串s1。如果存储缓冲区重叠,memcpy 函数不能保证s2中的那个字节在被覆盖前复制到s1。如果缓冲区重叠用memmove函数。参数:s1目标缓冲区,s2源缓冲区,len拷贝的字节数。

返回:s1。

(19)memchr

原型:void *memchr(void *buf,char c,int len);

功能:memchr函数在buf中的前len个字节中查找字符c。

返回:memchr函数返回字符c在buf中的指针,如没有则返回一个NULL指针。

(20)memccpy

原型:void *memccpy(void *dest,void *src,char c,int len);

功能:memccpy函数从src到dest复制0或更多的字符,直到字符c被复制或len字节被复制,哪个条件先遇到就执行哪个条件。

返回:memccpy函数返回一个指针,指向dest最后一个复制的字符的后一个字节。如果最后一个字符是c,则返回一个NULL指针。

(21)memmove

原型:void *memmove(void *dest,void *src,int len);

功能:memmove函数从src复制len字节到dest。如果存储缓冲区重叠,memmove函数保证src中的那个字节在被覆盖前复制到dest。

参数:dest目标缓冲区,src源缓冲区,len移动的字节数。

返回:memmove函数返回dest

(22)memset

原型:void *memset(void *buf,char c,int len);

功能:memset函数设置buf的前len字节为c。

参数:buf要初始化的缓冲区,c要设值的值,len缓冲区长度。

返回:memset函数返回dest。

八、可变参数

(1)va_arg

原型:type va_arg(argptr, type);

功能:va_arg宏用来从一个可变长度参数列表索引argptr提取并列参数。type参数指定提取参数的数据类型。本宏对每个参数只能调用一次,且必须根据参数列表中的参数顺序调用。第一次调用va_arg返回va_start宏中指定的prevparm参数后的第一个参数。后来对va_arg 的调用依次返回余下的参数。

参数:

返回:va_arg宏返回指定参数类型的值。

(2)va_end

原型:void va_end(argptr);

功能:va_end宏用来终止可变长度参数列表指针argptr的使用,argptr用va_start宏初始化。参数:

返回:无。

(3)va_start

原型:void va_start(argptr, prevparm);

功能:va_start 宏用在一个可变长度参数列表的函数中时,用va_arg 和va_end 宏初始化argptr。prevparm 参数必须是用三点号(…)指定的可选参数前紧挨的函数参数。此函数必须在用va_arg宏访问前初始化可变长度参数列表指针。

参数:

返回:无。

c51库函数

#include” 当51单片机通过8255和锁存器74LS273来扩展IO时,经常用到头文件absacc.h。 在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 例如: rval=CBYTE[0x0002];指向程序存贮器的0002h地址 rval=XWORD [0x0002];指向外RAM的0004h地址 KEIL 中ABSACC.H 定义如下: #ifndef __ABSACC_H__ #define __ABSACC_H__ #define CBYTE ((unsigned char volatile code *) 0) #define DBYTE ((unsigned char volatile data *) 0) #define PBYTE ((unsigned char volatile pdata *) 0) #define XBYTE ((unsigned char volatile xdata *) 0) #define CWORD ((unsigned int volatile code *) 0) #define DWORD ((unsigned int volatile data *) 0) #define PWORD ((unsigned int volatile pdata *) 0) #define XWORD ((unsigned int volatile xdata *) 0) #ifdef __CX51__ #define FVAR(object, addr) (*((object volatile far *) (addr))) #define FARRAY(object, base) ((object volatile far *) (base)) #define FCVAR(object, addr) (*((object const far *) (addr))) #define FCARRAY(object, base) ((object const far *) (base)) #else #define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L))) #define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L))) #define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L)) #define FCARRAY(object, base) ((object const far *) ((base)+0x810000L)) #endif #endif 再如: #define COM8255 XBYTE[0X060FF] //后面若出现COM8255,则单片机端口P0和P2联合输出0X060FF绝对物理地址(地址指向82C55指令寄存器) #define PA8255 XBYTE[0X000FF] //后面若出现PA8255,则单片机端口P0和P2联合输出0X000FF绝对物理地址(地址指向82C55的A组端口寄存器) #define PB8255 XBYTE[0X020FF] //后面若出现PB8255,则单片机端口P0和P2联合输出0X020FF绝对物理地址(地址指向82C55的B组端口寄存器) #define PC8255 XBYTE[0X040FF] //后面若出现PC8255,则单片机端口P0和P2联合输出0X040FF绝对物理地址(地址指向82C55的C组端口寄存器) ? ? absacc.h里的宏 #define CBYTE ((unsigned char volatile code? *) 0)

keil c51 详细中文手册

Keil C51使用详解 V1.0 第一章 Keil C51开发系统基本知识 (6) 第一节系统概述 (6) 第二节Keil C51单片机软件开发系统的整体结构 (6)

1. C51 for Dos 7 2. C51 for Windows的安装及注意事项: (7) 第四节Keil C51工具包各部分功能及使用简介 (7) 1. C51与A51. 7 2. L51和BL51. 8 3. DScope51,Tscope51及Monitor51. 8 4. Ishell及uVision. 9 第二章 Keil C51软件使用详解 (10) 第一节Keil C51编译器的控制指令 (10) 1. 源文件控制类 (10) 2. 目标文件(Object)控制类: (10) 3. 列表文件(listing)控制类: (10) 第二节dScope51的使用 (11) 1. dScope51 for Dos 11 2. dScope for Windows 12 第三节Monitor51及其使用 (13) 1. Monitor51对硬件的要求 (13) 2. Mon51的使用 (13) 3. MON51的配置 (13) 4. 串口连接图: (13) 5. MON51命令及使用 (14) 第四节集成开发环境(IDE)的使用 (14) 1. Ishell for Dos的使用 (14) 2. uVision for windows的使用 (15) 第三章 Keil C51 vs 标准C.. 15

第二节内存区域(Memory Areas): (16) 1. Pragram Area: (16) 2. Internal Data Memory: 16 3. External Data Memory. 16 4. Speciac Function Register Memory. 16 第三节存储模式 (16) 1. Small模式 (16) 2. Compact模式 (17) 3. large模式 (17) 第四节存储类型声明 (17) 第五节变量或数据类型 (17) 第六节位变量与声明 (17) 1. bit型变量 (17) 2. 可位寻址区说明20H-2FH.. 18 第七节Keil C51指针 (18) 1. 一般指针 (18) 2. 存储器指针 (18) 3. 指针转换 (18) 第八节Keil C51函数 (19) 1. 中断函数声明: (19) 2. 通用存储工作区 (19) 3. 选通用存储工作区由using x声明,见上例。 (19) 4. 指定存储模式 (19) 5. #pragma disable. 19 6. 递归或可重入函数指定 (19)

单片机教案C51标识符和函数

一、C51特点 1. C语言编程与汇编语言编程相比的优势 1)编程调试灵活方便 2)生成的代码编译效率高 3)完全模块化 4)可移植性好 5)便于项目维护管理 2. C51语言编译器与标准ANSI C编译器的主要区别 头文件:为了实现这些功能,只需将相应的功能寄存器的头文件加载在程序中,就可实现指定的功能。因此,C51系列头文件集中体现了各系列芯片的不同功能。 数据类型: 由于80C51系列器件包含了位操作空间和丰富的位操作指令,因此C51比ANSI C多一种位类型 数据存储类型: 80C51系列单片机有程序存储器和数据存储器。数据存储器又分片内和片外数据存储器。片内数据存储器还分直接寻址区和间接寻址区,分别对应code、data、idata、xdata以及根据80C51系列特点而设定的pdata类型。 数据运算操作和程序控制: 从数据运算操作和程序控制语句以及函数的使用上来讲,它们几乎没有什么明显的区别。只是在函数的使用上,由于单片机系统的资源有限,它的编译系统不允许太多的程序嵌套。 C51与标准ANSI C库函数: 部分库函数不适合单片机处理系统,因此被排除在外,如字符屏幕和图形函数。 C51的标识符和关键字: 标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。标识符区分大小写,第一个字符必须是字母或下划线。 二、C51的数据类型

三、存储器类型 定义变量时,除了说明存储种类外,还允许说明变量的存储器类型。存储器类型和存储种类是完全不同的概念,存储器类型指明该变量所处的单片机的内存空间。C51编译器可识别以下存储器类型,如下表所示。 四、C51的运算符和表达式 运算符就是完成某种特定运算的符号。运算符按其表达式中与运算符的关系可分为单目运算符、双目运算符和三目运算符。 赋值运算符: 使用“=”的赋值语句格式如下: 变量= 表达式; 需要注意“==”与“=”两个符号的区别,有时编译报错,往往就是错在if(b = 0xff)之类的语句中,错将“==”用为“=”。“==”符号是用来进行相等关系的运算。 算术运算符: + 加或取正值运算符 - 减或取负值运算符 * 乘运算符 / 除运算符 % 模(取余)运算符,如8 % 5 = 3,即8除以5的余数是3 关系运算符: C51中有6种关系运算符: > 大于 < 小于 >= 大于等于 <= 小于等于 == 测试等于 != 测试不等于 逻辑运算符: 逻辑与:条件式1 && 条件式2。 逻辑或:条件式1 || 条件式2。 逻辑非:!条件式。 位运算符:

Keil C51 集成开发环境的使用实验报告

Keil C51 集成开发环境的使用 姓名:专业:学号:成绩: 一、实验目的 1、熟悉Kei C51集成开发环境的基本操作; 2、掌握简单Kei C51和汇编程序的编写、调试。 二、实验内容 1、仔细阅读教材相关内容,掌握KeiC51集成开发环境的基本功能; 2、分别用汇编和C51编写清零程序,把片外RAM中的7000H-70FFH单元 中内容清零; 3、分用汇编和C51编写查找相同个数程序。统计片外RAM7000H-700FH中 “00H”的个数并保存在片内RAM30H单元中。 三、实验原理与步骤 1、清零程序 (1)汇编语言程序设计框图 (2)实验步骤 用连续或单步方式运行程序,检查7000H-70FFH单元中执行内容变化。 (3)假使把7000H-70FFH中的内容改成FFH,如何修改程序。 (4)用C51 重新编写该程序,运行并查看结果。 2、查找相同数个数 (1)汇编语言程序设计框图

(2)实验步骤 ①在7000H-700FH单元中放入随机数,其中几个单元输入0; ②用连续或单步方式运行程序; ③观察片内RAM 30H的内容,应显示“00H”的个数。 (3)用C51重新编写程序,运行并查看结果。 四、实验程序 1、清零程序 (1)汇编语言 ORG 0000H MOV R0,#0100H MOV DPTR,#7000H MOV A,#0 LOOP:MOVX @DPTR,A INC DPTR DJNZ R0,LOOP END (2) C语言 #include void main() { char xdata *p=0x7000; int t=0x7100-0x7000 ; while(t--) {*p=00; p++; } } 2、查找相同数个数

KeilC51使用详解

KeilC51使用说明 首先启动Keil μVision2程序,首次进入 Keil μVision2的编辑界面如图1所示,否则,会打开用户前一次处理的工程。 图1 首次进入Keil μVision2的编辑界面 下面通过简单的编程、调试,引导大家学习Keil μVision2软件中Keil Monitor-51 Driver 仿真器的基本使用方法和基本调试技巧。 1 工程的建立 单击“项目->新建项目…”菜单,弹出创建新工程对话框,如图2所示。选择你要保存的路径, 输入工程文件的名字, 不需要输入扩展名。比如保存到JY_E2X00目录里,工程文件的名字为 Test1,如图(2)所示,然后点击“保存”,保存后的文件扩展名为.uv2,这是KeilμVision2项 目文件扩展名。以后我们可以直接点击此文件来打开已创建的工程。 图2 创建新工程对话框

这时会弹出一个对话框,要求选择目标CPU(即用户所用单片机的型号),Keil μVision 几乎支持所有的51内核的单片机,我们以AT89S52芯片为例,如图3所示, 在左侧的Data base列表框中点击Atmel前面的“+”号,展开该层,选中AT89S52,在其右边的Description显示区域。中是对这个单片机的基本描述,然后再点击“确定”按钮. 图3 为工程选择目标CPU 窗口会出现询问是否添加startup.a51,如图4:请选择“否”。 图4 此时,在工程窗口的文件页中,出现了“Target 1”,前面有“+”号,点击“+”号展开,可以看到下一层的“Source Group1”,这时的工程还是一个空的工程,里面什么文件也没有,需要为这个工程添加文件。如图5所示。

Keil-C51-基本使用方法 (1) 。。。。2

、Keil C51工程建立与仿真 1、建立一个工程项目,选择芯片并确定选项 双击Keil uVision2快捷图标后进入Keil C51开发环境,单击“工程”菜单,在弹出的下拉菜单选中“新工程”选项,屏幕显示为图1。附录: 一 图1 建立一个工程项目在文件名中输入一个项目名“my-test”,选择保存路径(可在 “我的 文档” 中先建 立一个 同名的

文件夹),单击保存。在随后弹出的“为目标target选择设备”(Select Device for Target “Target1”)对话框中用鼠标单击Atmel前的“+”号,选择“89C51”单片机后按确定,如图2所示。 图 2 选择单片机后按确定 选择主菜单栏中的“工程”,选中下拉菜单中“Options for Target ‘Target1’”,出现图3所示的界面。单击“target”页面,在晶体Xtal(MHz)栏中选择试验板的晶振频率,默认为24MHz,我们讲座试验板的晶振频率为11.0592MHz,因此要将24.0改为11.0592。然后单击输出“Output”页面,在“建立hex格式文件”前打勾选中,如图3-4。其它采用默认设置,然后点确定。 图3 选择Target

页面 图4 选择Output页面 2、建立源程序文件 图 5 建立源程序文件

程序输入完成后,选择“文件”,在下拉菜单中选中“另存为”,将该文件以扩展名为.asm格式(如my-test.asm)保存在刚才所建立的一个文件夹中(my-test)。 3、添加文件到当前项目组中 单击工程管理器中“Target 1”前的“+”号,出现“Source Group1”后再单击,加亮后右击。在出现的下拉窗口中选择“Add Files to Group‘Source Group1’”,如图6所示。在增加文件窗口中选择刚才以asm格式编辑的文件my-test.asm,鼠标单击“ADD”按钮,这时my-test.asm文件便加入到Source Group1这个组里了,随后关闭此对话窗口。 图 6 添加文件到当前项目组中 4、编译(汇编)文件 选择主菜单栏中的“工程”,在下拉菜单中选中“重建

C51库函数详解

_chkfloat_: 函数定义: unsigned char _chkfloat_ ( float val); /* number to check */ 函数功能: _chkfloat_函数检查浮点数val 的类型。 返回值: _chkfloat_函数返回浮点数val 的类型。 返回值意义 0 标准浮点数 1 浮点0 2 +INF 正溢出 3 -INF 负溢出 4 NaN 非数 函数测试: #include #include /* 本实验测试本征库中的_chkfloat_函数 函数定义:unsigned char _chkfloat_(float val); 返回值: Return Value Meaning 0 Standard floating-point number. 1 Floating-point value 0. 2 +INF (positive overflow).

3 -INF (negative overflow). 4 NaN (Not a Number) error status. 用P1指示返回值 */ unsigned char f[4]={0xff,0xff,0xff,0xff}; void delay(unsigned int time) { while(time--); } void main() { P2=~_chkfloat_(1.2455); //Standard floating-point number. delay(50000); P2=~_chkfloat_(0.00); //Floating-point value 0. delay(50000); P2=~_chkfloat_(1000000000000000000000000000000000000000000000000000000000000000.0000 000000); //+INF (positive overflow). delay(50000); P2=~_chkfloat_(-1000000000000000000000000000000000000000000000000000000000000000.000 0000000); //-INF (negative overflow). delay(50000); P2=~_chkfloat_(*((float *)f)); //NaN (Not a Number) error status. while(1);

keil+c51教程

Keil uVision2的使用 Keil uVision2是目前使用广泛的单片机开发软件,它集成了源程序编辑和程序调试于一体,支持汇编、C、PL/M语言。 这里我们仅仅介绍Keil uVision2的简单使用,更详细的使用方法见本光盘单片机软件\Keil c51\Keil书籍与资料目录中的内容。 keil C51v6.12的安装: 先运行光盘中单片机软件\setup\setup.exe安装程序,选择安装“Eval Version”版进行安装。一直点击“Yes”或“Next”,直到“Finish”完成。 之后运行同目录中的Keil uv2汉化安装.exe安装汉化程序。 安装好后,在桌面上会产生快捷图标,如下图: keil C51v6.12的使用: 点击桌面快捷图标,可以直接进入主画面:

序。 在Keil系统中,每做个独立的程序,都视为工程(或者叫项目)。首先从菜但的“工程”中“新建工程...”,建立我们将要做的工程项目: 新建的工程要起个与工程项目意义一致的名字,可以是中文名;我们这里的程序是实验测试程序,所以起的名字为Test,并将Test工程“保存”到 C:\Keil下:

接下来,Keil环境要求我们为Test工程选择一个单片机型号;我们选择Atmel公司的89C51(虽然我们使用的是89S51,但由于89S51与89C51内、外部结构完全一样,所以这里依然选择“89C51”)。“确定”后工程项目就算建立了。

立了工程项目,肯定要实施这个工程,现在就为工程添加程序; 点击“文件”中的“新建”,新建一个空白文档;这个空白文档就是让我们编写单片机程序的场所。在这里你可以进行编辑、修改等操作。 根据题意,在文档中写入下列代码:(下列代码你暂时不要管什么意思,只要照抄正确就可以,今后在学习汇编时你会明白的) mov p0,#01010101B;将01010101二进制代码送P0口 ajmp$;程序在此原地踏步 end;程序结束标志 写完后再检查一下,并保存文件,保存文件时,其文件名最好与前面建立的工程名相同(当然这里为Test了),其扩展名必须为.Asm!“文件名”中一定要写全,如:Test.Asm;保存后的文档彩色语法会起作用,将关键字实行彩色显示:

C语言中常用的库函数

字符处理函数 本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换 头文件ctype.h 函数列表<> 函数类别函数用途详细说明 字符测试是否字母和数字isalnum 是否字母isalpha 是否控制字符iscntrl 是否数字isdigit 是否可显示字符(除空格外)isgraph 是否可显示字符(包括空格)isprint 是否既不是空格,又不是字母和数字的可显示字符ispunct 是否空格isspace 是否大写字母isupper 是否16进制数字(0-9,A-F)字符isxdigit 字符大小写转换函数转换为大写字母toupper 转换为小写字母tolower 地区化 本类别的函数用于处理不同国家的语言差异。 头文件local.h 函数列表 函数类别函数用途详细说明 地区控制地区设置setlocale 数字格式约定查询国家的货币、日期、时间等的格式转换localeconv 数学函数 本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51) 头文件math.h 函数列表 函数类别函数用途详细说明 错误条件处理定义域错误(函数的输入参数值不在规定的范围内) 值域错误(函数的返回值不在规定的范围内) 三角函数反余弦acos 反正弦asin

反正切atan 反正切2 atan2 余弦cos 正弦sin 正切tan 双曲函数双曲余弦cosh 双曲正弦sinh 双曲正切tanh 指数和对数指数函数exp 指数分解函数frexp 乘积指数函数fdexp 自然对数log 以10为底的对数log10 浮点数分解函数modf 幂函数幂函数pow 平方根函数sqrt 整数截断,绝对值和求余数函数求下限接近整数ceil 绝对值fabs 求上限接近整数floor 求余数fmod 本分类函数用于实现在不同底函数之间直接跳转代码。头文件setjmp.h io.h 函数列表 函数类别函数用途详细说明 保存调用环境setjmp 恢复调用环境longjmp 信号处理 该分类函数用于处理那些在程序执行过程中发生例外的情况。 头文件signal.h 函数列表 函数类别函数用途详细说明 指定信号处理函数signal 发送信号raise 可变参数处理 本类函数用于实现诸如printf,scanf等参数数量可变底函数。

Keil c51的使用及界面翻译

Keil C51的使用方法 Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和C 语言的程序设计,界面友好,易学易用。 下面介绍Keil C51软件的使用方法 进入Keil C51 后,屏幕如下图所示。几秒钟后出现编辑界

进入Keil C51后的编辑界面 简单程序的调试 学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习Keil C51软件的基本使用方法和基本的调试技巧。 1)建立一个新工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项 2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51 如下图所示,然后点击保存.

3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keil c51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel 的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定. 4)完成上一步骤后,屏幕如下图所示

到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。 5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项 新建文件后屏幕如下图所示 此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写

单片机开发与仿真软件Keil C51的使用

单片机开发与仿真软件Keil C51的使用 一、Keil C51 操作入门 Keil C51 简介 Keil C51 是德国知名软件公司Keil(现已并入ARM 公司)开发的基于8051 内核的微控制器软件开发平台,是目前开发8051 内核单片机的主流工具。Keil 51支持汇编语言、C语言等各种开发语言。其中,uVision2集成开发环境包含项目管理、源代码编辑和强大的程序调试环境。uVision2调试器是一个强大的全特性调试器,允许用户在PC 机上完全模拟目标程序、指令集和片内外围功能。 实验所用的是Keil C51 评估版。 Keil C51 的启动 双击桌面上的“Keil uVision2”图标,启动Keil C51程序,启动界面如图1所示。 图1 Keil C51的启动界面 建立第1 个Keil C51 程序 Keil C51 是一个功能很强大的软件,但是使用起来并不复杂。现在就通过建立一个简单的LED(发光二极管)闪烁发光的实例来初步掌握Keil C51的基本用法。硬件电路参见图2,单片机I/O 输出低电平可点亮LED。 图2 LED 闪烁发光电路 ●新建工程。执行Keil C51 软件的菜单“Project | N ew Project…”,弹出一个名为“Create

New Project”的对话框。先选择一个合适的文件夹准备来存放工程文件,比如“E:\Project\LedFlash”,其中“LedFlash”是新建的文件夹。建议:今后每新建一个工程都要在适当的磁盘位置新建一个文件夹用来保存工程文件,以方便管理,并养成良好的习惯。最后,为工程取名为“LedFlash”,并保存。参见图3。 图3 新建Keil C51 工程 ●选择CPU。紧接着,Keil C51 提示选择CPU 器件。8051 内核单片机最早是由鼎鼎大 名的Intel 公司发明的,后来其他厂商如Philips 、Atmel 、Winbond 等先后推出其兼容产品,并在8051 的基础上扩展了许多增强功能。在这里可以选择Philips 的第 1 个器件“80/87C51”,该器件与Intel 的8051 完全兼容。参见图4 。 图4 选择CPU ●接下来弹出一个如图5 所示的对话框。该对话框提示是否要把标准8051 的启动代

Keil C51 基本使用方法

附录: 一、Keil C51工程建立与仿真 1、建立一个工程项目,选择芯片并确定选项 双击Keil uVision2快捷图标后进入Keil C51开发环境,单击“工程”菜单,在弹出的下拉菜单选中“新工程”选项,屏幕显示为图1。 图1 建立一个工程项目 在文件名中输入一个项目名“my-test”,选择保存路径(可在“我的文档”中先建立一个同名的文件夹),单击保存。在随后弹出的“为目标target选择设备”(Select Device for Target “Target1”)对话框中用鼠标单击Atmel前的“+”号,选择“89C51”单片机后按确 定,如图2 所示。

图2 选择单片机后按确定 选择主菜单栏中的“工程”,选中下拉菜单中“Options for Target ‘Target1’”,出现图3所示的界面。单击“target”页面,在晶体Xtal(MHz)栏中选择试验板的晶振频率,默认为24MHz,我们讲座试验板的晶振频率为11.0592MHz,因此要将24.0改为11.0592。然后单击输出“Output”页面,在“建立hex格式文件”前打勾选中,如图3-4。其它采用默认设置,然后点确定。 图3 选择Target页面

图4 选择Output页面 2、建立源程序文件 单击“文件”菜单,在下拉菜单中选择“新建”,随后在编辑窗口中输入以下的源程序(如图5)。 ORG 0000H LJMP MAIN ORG 030H MAIN: MOV P0,#00H MOV P1 ,#00H MOV P2 ,#00H MOV P3 ,#00H ACALL DEL MOV P0 ,#0FFH MOV P1 ,#0FFH MOV P2 ,#0FFH MOV P3 ,#0FFH ACALL DEL AJMP MAIN ORG 0200H DEL: MOV R5,#04H F3: MOV R6,#0FFH F2: MOV R7,#0FFH F1: DJNZ R7,F1 DJNZ R6,F2 DJNZ R5,F3 RET END 图5 建立源程序文件 程序输入完成后,选择“文件”,在下拉菜单中选中“另存为”,将该文件以扩展名为.asm

C51编程规范

单片机C51编程规范 1单片机C51编程规范-前言 为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范。 2 单片机C51编程规范-范围 本标准规定了程序设计人员进行程序设计时必须遵循的规范。本规范主要针对C51编程语言和keil编译器而言, 包括排版、注释、命名、变量使用、代码可测性、程序效率、质量保证等内容。 3 单片机C51编程规范-总则 格式清晰 注释简明扼要 命名规范易懂 函数模块化 程序易读易维护 功能准确实现 代码空间效率和时间效率高 适度的可扩展性 4 单片机C51编程规范-数据类型定义 编程时统一采用下述新类型名的方式定义数据类型。 建立一个文件,在该文件中进行如下定义: typedef bit BOOL; 全局变量另加前缀g_。 局部变量应简明扼要。局部循环体控制变量优先使用i、j、k等;局部长度变量优先使用len、num等;临时中间变量 优先使用temp、tmp等。

函数命名 函数名用小写字母命名,每个词的第一个字母大写,并将模块标识加在最前面。 文件命名 一个文件包含一类功能或一个模块的所有函数,文件名称应清楚表明其功能或性质。 每个.c文件应该有一个同名的.h文件作为头文件。 6 单片机C51编程规范-注释 注释基本原则 l 有助于对程序的阅读理解,说明程序在"做什么",解释代码的目的、功能和采用的方法。l 一般情况源程序有效注释量在30%左右。 l 注释语言必须准确、易懂、简洁。 l 边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。 文件注释 文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。 修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。所有修改记录必须保持完 整。 文件注释放在文件顶端,用"/*……*/"格式包含。 注释文本每行缩进4个空格;每个注释文本分项名称应对齐。 /*********************************************************** 文件名称: 作者: 版本: 说明:

Keil C51中变量的使用

引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 1 CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量存储在寄存器中,对于使用特别频繁且数量不多的变量可以选用这种存储模式,以获得更高的工作效率。 相比之下,51内核单片机的存储结构则显得有些怪异,它的存储空间有3个:程序存储器空间(64 KB含片内、片外)、片外数据存储器空间(64KB)、片内数据存储器及特殊功能寄存器空间。它没有真正意义上的寄存器,它的寄存器其实是片内数据存储器(如R0~R7)和特殊功能寄存器(如A、B等)中的一部分。因此,在Keil C51中使用变量就和标准C有很大不同。 2 Keil C51变量分析 Keil C51支持标准C原有的大多数变量类型,但为这些变量新增了多种存储类型,也新增了一些标准C没有的变量。 2.1 Keil C51新增的变量存储类型 Keil C51中定义变量的格式如下: [存储种类]数据类型[存储类型]变量名表; 其中,[存储类型]是标准C中没有的,[存储类型]共有6种,分别介绍如下: ①data。将变量存储在片内可直接寻址的数据存储器中。使用这种存储模式,目标代码中对变量的访问速度最快。 ②bdata。将变量存储在片内可位寻址的数据存储器中。在目标代码中变量可以方便地进行位处理,在不进行位处理时与data相同。 ③idata。将变量存储在片内间接寻址的数据存储器中。在52内核中,当片内直接寻址数据存储器不够用时,可以使用128字节间接寻址数据存储器,访问速度一般较data要慢一些,但具有最大的片内数据存储器空间;在51内核中因无单独的间接寻址数据存储器区,idata与data无区别。 ④xdata。将变量存储在片外数据存储器中。目标代码中只能使用“MOVX A,@DPTR”和“MOVX@DPTR,A”指令访问变量,访问速度最慢,但存储空间最大(64KB)。 ⑤pdata。将变量存储在片外数据存储器中的第一页(00H~FFH)中。目标代码中可以使用“MOVX A,@Ri”和“MOVX@Ri,A”指令访问变量,访问速度与xdata相同,存储空间为256字节。 ⑥code。将变量存储在程序存储器中。目标代码中只能使用MOVC指令访问变量,因变量存储在程序存储器中,具有非易失性且为只读。 2.2 Keil C51新增的指针变量存储类型 Keil C51中的指针变量形式如下: 数据类型[数据存储类型]*[指针存储类型]标识符; 其中,[数据存储类型]和[指针存储类型]都是标准C中没有的。[数据存储类型]定义数

Keil C51详细设置

Keil C51详细设置 一.target名更改 打开Keil后,左侧Project Workspace中的target可改,方法:右击Target——Manage Compnents——双击待修改项即可,若要添加,使用对话框内对应工具栏。 二.option for target 设置之TARGET项 1 MEMARY MODEL Small:变量存储在内部ram里. Compact:变量存储在外部ram里,使用页8位间接寻址 Large:变量存储在外部Ram里,使用16位间接寻址. 我们一般使用Small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram 不够了,才会存到外部去.Compact的方式要自己通过程序来指定页的高位地址,编程比较复杂,如果外部ram很少,只有256个字节,那么对该256个字节的读取就比较快,用MOVX @Ri,A 或MOVX A,@Ri指令. 如果超过256字节,那么要不断地进行切换的话,就比较麻烦.Compact模式适用于比较少的外部ram的情况.Large模式,是指变量会优先分配到外部ram里,用MOVX A,@DPTR或MOVX @DPTR,A来读取.要注意的是,3种存储方式都支持内部256字节和外部64k字节的ram.区别是变量的优先(或默认)存储在哪里的区别.除非你不想把变量存储在内部ram,才使用后面的 Compact,Large模式.因为变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应用都是选择Small的模式.使用Small的方式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,比如: unsigned char xdata a;那么变量a就存储在外部的ram. unsigned char a;变量存储在内部ram. 假如用Large的模式: unsigned char xdata a;那么变量a就存储在外部的ram. unsigned char a;变量存储在外部ram. 这就是区别,就是说这几个选项只是影响没有特别指定变量的存储空间的时候,默认存储在哪里,比如上面的变量定义unsigned char a . 2. CODE ROM SIZE Small: program 2K or less ;适用于89c2051这些芯片,2051只有2k的代码空间,所以跳转地址只有2k,编译的时候会使用ACALL AJMP这些短跳转指令,而不会使用LCALL,LJMP指令.如果你的代码跳转超过2k,那么会出错. Compact:2k functiongs ,64k program:表示每个子函数的程序大小不超过2k,整个工程可以有64k的代码.就是说在main()里可以使用LCALL, LJMP指令,但在子程序里只会使用ACALL,AJMP 指令.除非你确认你的每个子程序不会超过2k,否则不要用Compact方式. Large:64K program:表示程序或子函数都可以大到64k.使用code bank还可以更大.通常我们都选用该方式.Code Rom Size选择Large方式速度不会比Small慢很多,所以一般没有必要选择Compact和Small的方式.我们这里选择Large方式. 3. OPERATING

Keil C51库函数及学习附录

Keil C51库函数及学习附录 Keil C51库函数及学习附录C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。 第一节本征库函数(intrinsic routines)和非本征证库函数 C51提供的本征函数是指编译时直接将固定的代码插入当 前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。 C51的本征库函数只有9个,数目虽少,但都非常有用,列如下: _crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回 _iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回 _nop_:相当于插入NOP _testbit_:相当于JBCbitvar测试该位变量并跳转同时清除。_chkfloat_:测试并返回源点数状态。 使用时,必须包含#inclucle 一行。

如不说明,下面谈到的库函数均指非本征库函数。 第二节几类重要库函数1. 专用寄存器include文件 例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。 2. 绝对地址include文件absacc.h 该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。 3. 动态内存分配函数,位于stdlib.h中 4. 缓冲区处理函数位于“string.h”中 其中包括拷贝比较移动等函数如: memccpymemchr memcmp memcpy memmove memset 这样很方便地对缓冲区进行处理。 5. 输入输出流函数,位于“stdio.h”中 流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib 目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。 第三节Keil C51库函数原型列表1. CTYPE.H bit isalnum(char c); bit isalpha(char c); bit iscntrl(char c);

单片机keilc51软件的使用方法

Keil C51软件的使用 Keil C51软件是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编和C语言的程序设计,界面友好、易学易用。下面介绍Keil C51软件的使用方法: 1.启动Keil C51,界面如下图 Twe Integratiofi IDE for Microcontroller TTiib picigiHhi is ptoLu dud by U.S. dnd iihLuiiidiLiDndl copy light IdWb. 启动Keil C51时的屏幕 进入Keil C51后的编辑界面 2?建立一个新工程

(1)单击工程菜单,在弹出的下拉菜单中选中新建工程选项 (2)然后选择你要保存的路径,输入工程文件的名字,比如保 存到C51目录里,工程文件的名字为C51,如下图所示,然后点击保存。 (3)这时会弹出一个对话框,要求你选择单片机的型号,你可 以根据你使用的单片机来选择,Keil C51几乎支持所有的51核的单 片机,我这里还是以大家用的比较多的Atmel的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明, 然后点击确定。 懐件礙与嗾固 自W S ⑥①窗匡1 F ;国标.酥文拌届性. 话擇吕标盪 备 能项一, 瑚肓除戈怦选项 裁建新建谨所有目新丈件 聆嫌译.Ctrl^F^ £u停止沟建 口程觸试矽惬谩备IX具3¥C3 Wfeu凋助 麻T徉 二耳 QJ]井工 理 f7 F艾件扩逵:S.书希和端璋环毘喃桂

(4)完成上一步骤后,屏幕如下图所示 (5)单击文件菜单,再在下拉菜单中单击新建选项,屏幕如下图所示

C51的库函数

单片机原理与应用及C51程序设计(第2版) 谢维成 杨加国主编 附录B C51的库函数 C51编译器提供了丰富的库函数,使用库函数可以大大简化用户的程序设计工作从而提高编程效率,基于MCS-51系列单片机本身的特点,某些库函数的参数和调用格式与ANSIC标准有所不同。 每个库函数都在相应的头文件中给出了函数原型声明,用户如果需要使用库函数,必须在源程序的开始处采用预处理命令#include,将有关的头文件包含进来。下面是C51中常见的库函数。 B.1 寄存器库函数REG×××.H 在REG×××.H的头文件中定义了MCS-51的所有特殊功能寄存器和相应的位,定义时都用大写字母。当在程序的头部把寄存器库函数REG×××.H包含后,在程序中就可以直接使用MCS-51中的特殊功能寄存器和相应的位。 B.2 字符函数CTYPE.H 函数原型:extern bit isalpha (char c); 再入属性:reentrant 功能:检查参数字符是否为英文字母,是则返回1,否则返回0。 函数原型:extern bit isalnum(char c); 再入属性:reentrant 功能:检查参数字符是否为英文字母或数字字符,是则返回1,否则返回0。 函数原型:extern bit iscntrl (char c); 再入属性:reentrant 功能:检查参数字符是否在0x00~0x1f之间或等于0x7f,是则返回1,否则返回0。 函数原型:extern bit isdigit(char c); 再入属性:reentrant 功能:检查参数字符是否为数字字符,是则返回1,否则返回0。 函数原型:extern bit isgraph (char c); 再入属性:reentrant 功能:检查参数字符是否为可打印字符,可打印字符的ASCII值为0x21~0x7e,是则返回1,否则返回0。 函数原型:extern bit isprint (char c);

相关文档