C51模块化

C51模块化
C51模块化

C51的模块化设计方法

一个大的单片机程序往往包含很多模块,我是这样组织的:

1、每一个C源文件都要建立一个与之名字一样的H文件(头文件),里面仅仅包括该C文件的函数的声明,其他的什么也不会有,比如变量的定义啊等等不应该有。

2、建立一个所有的文件都要共同使用的头文件,里面当然就是单片机的管脚使用的定义,还有里面放那些需要的KEIL系统的头文件,比如#i nclude,#i nclude等等,把这个文件命名为common.h,或者干脆就叫main.h

3、每个C源文件应该包含自己的头文件以及那个共同的使用的头文件,里面还放自己本文件内部使用的全局变量或者以extern定义的全局变量

4、主文件main.c里面包含所有的头文件包括那个共同使用的文件,main.c里面的函数可以再做一个头文件,也可以直接放在文件的开头部分声明就可以了,里面一般还有中断服务程序也放在main.c里面

5、对于那些贯穿整个工程的变量,可以放在那个共同的使用的头文件里面,也可以用extern关键字在某个C源文件里面定义,哪个文件要使用就重复定义一下

6、建立工程的时候,只要把C源文件加到工程中,把H文件直接放到相应的目录下面就可以了,不需要加到工程里面。

第一章概述

本手册介绍ASM51宏汇编器及用汇编语言开发MCS-51系列单片机软件的过程。本章概述ASM51宏汇编器及用法。

1.1 模块化程序设计

ASM51宏汇编器允许用户以模块方式编程,以适应用户模块化的程序设计。模块是具有相对独立功能的程序,它能独立进行汇编或编译。模块化程序设计是将一个大的或复杂的程序分成小的功能模块,每个模块程序单独编写、汇编和调试,最后再将这些模块连接起来,形成一个完整的用户程序。这样做比单块程序更易编写、调试和修改。

模块程序的开发只需根据模块的输入及输出定义,按其所需的输入并检查其输出以校核模块的正确性。由于程序具有良好的模块接口,可以把问题限定在模块内,一旦识别出有毛病的模块,解决这个问题就相当简单了。当每个模块都测试完毕即可将各模块连接起来,最后再测试全模块。

模块化程序的另一个好处是程序共享,即一个模块中的程序可以被其他模块引用。由于模块化程序是可重新定位的,因而也就允许在满足其输入及输出要求是被调用。

1.2 MCS-51模块程序的开发过程

本节简要讨论使用可重定位的汇编器(ASM51),连接/重新定位程序(RL51)及代码转换程序(OH)来开发程序的过程。

1.2.1 段、模块及程序

段是一块程序代码或数据存贮器。段是可重新定位的或绝对的。一个可重新定位的段有一个名字、类型及其属性。具有相同段名,但在不同模块的各个段,将由RL51把它们合并在一起。绝对段没有名字因而也不能与其它段结合。

一个模块有一个或多个段。模块有用户指定的名字。模块的定义决定局部符号的作用域。一个目标文件有一个或多个模块。

把全部输入模块的所有绝对的及可重新定位的段连接起来,最后能形成单一的绝对模块,即完整的用户应用程序。

1.2.2 源程序编辑

完成上述模块化设计后,使用文本编辑器编写源程序。若在开发过程中检测到错误,再回到文本编辑器以修改源程序。

1.2.3 汇编

宏汇编器(ASM51)把源程序翻译成目标代码产生一个目标文件(当至少有一个输入段是可重新定位的段时称为可重新定位的目标文件,否则是绝对的目标文件)以及表明汇编结果的一个列表文件。当ASM51的启动中有DEBUG控制项的,该目标文件将包含符号表及其他符号调试的信息。

汇编器能以可重新定位的目标代码格式产生各目标文件。不过,如果该模块仅有绝对段而无外部访问,形成的该目标文件是绝对的。

列表文件提供的正常记录既有源程序又有目标代码。汇编器也在该列表文件中提供语法及其它出错的诊断信息。例如,为一条仅能使用八位值的指令规定一个16位值,汇编器会指出该值超出了范围。此外,也可以把一个符号表加到列表文件后面,该符号表列出全部符号及其属性。

1.2.4 连接及重新定位

在对程序的各个模块汇编之后,用RL51连接各目标模块文件。RL51程序通过把具有相同段名及类型的各段连接起来,并为重定位段分配相应的绝对存贮器。RL51也解决所有模块间的访问。RL51输出一个绝对模块文件和一个连接/定位过程的列表文件。

此主题相关图片如下:

图1-1 汇编程序与连接/重新定位程序的输出

1.3 开发MCS-51汇编程序过程

*FILTER.EXE 过滤程序

过滤源程序文件,使其编辑格式符合AEDIT格式。

*ASM51.EXE 汇编程序

对MCS-51源文件汇编。源文件扩展名推荐使用.ASM或.A51,输出文件产生目标文件.OBJ和列表文件.LST。

*RL51.EXE 连接定位程序

将多个浮动目标文件连接定位成一个绝对目标文件,输入文件为.OBJ文件或库.LIB文件。输出用TO指定生成.ABS,

同时也产生.M51符号文件。

*LIB51.EXE 库管理程序

将调试好的模块装入库中,使之可以被共享,提高调试效率。

*OH.EXE 十六进制格式目标代码转换

将.ABS绝对目标文件代码转换成.HEX文件。

第一章完

求助,生成Keil c51的库文件

尝试把一些函数编译成库文件,一直失败,而且找不到这方面的资料

我的步骤:

1.项目中选择生成.lib文件

2.编译编辑好的函数

3.把生成的.lib文件拷贝到keil默认的/lib/文件夹下面,或者是保留在原来的文件夹下面

4.把头文件放进/inc/文件夹下面

5.在其他项目中包含头文件

答:把生成的.lib加入你的工程就行了。

关于c51模块化设计的一些建议:

? A 不要在主程序中写入过长的代码;

B 为每个子程序编写头文件;

C 将相似功能的子程序写在同一个源文件里。

?子程序调用方法:

方法A:将各个子程序保存为*.c,声明函数后调用;

方法B:包含头文件调用。

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)

单片机教案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。 逻辑非:!条件式。 位运算符:

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);

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等参数数量可变底函数。

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库函数及学习附录

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);

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);

C51库函数

C51库函数积累: (1)_chkfloat_: 函数定义:unsigned char _chkfloat_ ( float val); /* number to check */函数功能:_chkfloat_函数检查浮点数val 的类型。 返回值:_chkfloat_函数返回浮点数val 的类型。

P2=~_chkfloat_; delay(50000); P2=~_chkfloat_; delay(50000); P2=~_chkfloat_; delay(50000); P2=~_chkfloat_(*((float *)f)); while(1); } (2)_crol_: 函数定义:unsigned char _crol_ ( unsigned char c, unsigned char b);/* character to rotate left */ /* bit positions to rotate */ 函数功能:_crol_函数将一个字节c循环左移b位。 返回值:_crol函数返回将c循环左移b位后的值。 /* 本实验测试本征库中的_crol_函数 函数定义:unsigned char _crol_(unsigned char c,unsigned char b); 返回值:_crol_函数返回将c循环左移b位后的值。 用P1指示返回值 */ y=cos(x); y=cosh(x); //y= while(1); } (28)exp: 函数定义:float exp ( float x); /* power to use for ex function */ 函数功能:取x的自然指数值。 返回值:x的自然指数值。 /*

单片机C语言知识(C51)的普通库函数

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。

c51中的intrins库函数

c51中的intrins库函数 流水灯循环左移右移,用C语言,要高效的话,只有用伪本征函数文件“intrins.h”中的_crol_(),_cror_()...等等函数,具体解释如蓝色文字,例如,要用P1口驱动8个共阳连接的二极管左循环一个一个地亮,语句是 P1=_crol_(a,1);//a储存被移位的字符。 _crol_ 字符循环左移 _cror_ 字符循环右移 _irol_ 整数循环左移 _iror_ 整数循环右移 _lrol_ 长整数循环左移 _lror_ 长整数循环右移 _nop_ 空操作8051 NOP 指令 _testbit_ 测试并清零位8051 JBC 指令 详解: 函数名: _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; C-5 1 程序设计 37 y=0x00ff; y=_irol_(y,4); /*y=0x0ff0*/ } 函数名: _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”指令 相关,上面几个函数不同于参数类型。

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的双曲正弦。

C51函数库函数功能表

一、CTYPE.H 1、extern bit isalpha (unsigned char); 检查参数字符是否为英文字符,是则返回1,否则返回0 2、extern bit isalnum (unsigned char); 检查参数字符是否为字母或者数字字符,是则返回1,否则返回0 3、extern bit iscntrl (unsigned char); 检查参数值是否在0x00~0x7F之间或者等于0x7F,是则返回1,否则返回0 4、extern bit isdigit (unsigned char); 检查参数值是否为数字字符,是则返回1,否则返回0 5、extern bit isgraph (unsigned char); 检查参数是否为可打印字符(0x21~0x7E),是则返回1,否则返回0 6、extern bit isprint (unsigned char); 检查参数是否为可打印字符,包括空格符,其余与isgraph相同 7、extern bit ispunct (unsigned char); 检查参数是否为标点、空格或者格式字符,是则返回1,否则返回0 8、extern bit islower (unsigned char); 检查参数是否为小写字母,是则返回1,否则返回0 9、extern bit isupper (unsigned char); 检查参数是否为大写字母,是则返回1,否则返回0 10、extern bit isspace (unsigned char); 检查参数是否为下列之一:空格、制表符、回车、换行、垂直制表符和送纸符号,是则返回1,否则返回0 11、extern bit isxdigit (unsigned char); 检查参数是否为16进制数字字符,是则返回1,否则返回0 12、extern unsigned char tolower (unsigned char); 将大写字符转换成小写形式,如果字符不在(A~Z)之间,则直接返回该字符 13、extern unsigned char toupper (unsigned char); 将小写字符转换成大写形式,如果字符不在(a~z)之间,则直接返回该字符 14、extern unsigned char toint (unsigned char); 将ASCII字符0~9,A~F(不分大小写)转换成16进制的数字,返回转换后的16进制数字 二、STDIO.H #ifndef EOF #define EOF -1 #endif #ifndef NULL #define NULL ((void *) 0) #endif #ifndef _SIZE_T

KEIL C51库函数

KEIL C51库函数C51单片机 2010-09-14 11:35:47 阅读233 评论0 字号:大中小订阅 . 第一节 Keil C51扩展关键字 深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类: 8051存储类型及存储区域 * 存储模式 * 存储器类型声明 * 变量类型声明 * 位变量与位寻址 * 特殊功能寄存器(SFR) * C51指针 * 函数属性 具体说明如下(8031为缺省CPU)。 C51 V4.0版本有以下扩展关键字(共19个): _at_ idata sfr16 alien interrupt small bdata large _task_ Code bit pdata using reentrant xdata compact sbit data sfr 第二节存储模式 存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种: 1. Small模式 所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。 2. Compact模式 所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。 3. large模式 所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。 提示:存储模式在C51编译器选项中选择 第三节指针 C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer). 1. 一般指针 一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型,例如:long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。 char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。 一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。 2. 存储器指针 基于存储器的指针说明时即指定了存贮类型,例如: char data * str;str指向data区中char型数据 int xdata * pow; pow指向外部RAM的int型整数。 这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。 3. 指针转换 即指针在上两种类型之间转化: * 当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。 * 如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用

Keil51 常用库函数

Keil C51库函数 笔记: 单片机C语言中P1=P1<<4表示:读取P1口的值然后左移4位赋给P1口也就是读取P1口的值后将低4位清零,并将低4位赋给高4位。 第一节本征库函数(intrinsic routines)和非本征库函数 C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。 C51的本征库函数只有9个,数目虽少,但都非常有用,列如下: _crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回 _iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回 _lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回 _nop_:相当于插入NOP _testbit_:相当于JBC bitvar测试该位变量并跳转同时清除。 _chkfloat_:测试并返回源点数状态。 使用时,必须包含#inclucle 一行。 如不说明,下面谈到的库函数均指非本征库函数。 第二节几类重要库函数 1. 专用寄存器include文件 例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。 2. 绝对地址include文件absacc.h 该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。 3. 动态内存分配函数,位于stdlib.h中 4. 缓冲区处理函数位于“string.h”中 其中包括拷贝比较移动等函数如: memccpy memchr memcmp memcpy memmove memset 这样很方便地对缓冲区进行处理。 5. 输入输出流函数,位于“stdio.h”中 流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。

C语言中KeilC51库函数大全

Keil C51库函数参考 C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。 第一节本征库函数(i n t ri ns i c rou t i ne s)和非本征证库函数 C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。 C51的本征库函数只有9个,数目虽少,但都非常有用,列如下: _crol_,_cror_:将char型变量循环向左(右)移动指定位数 后返回 _iror_,_irol_:将int型变量循环向左(右)移动指定位数后返 回 _lrol_,_lror_:将long型变量循环向左(右)移动指定位数后 返回 _nop_:相当于插入NOP _testbit_:相当于JBC bitvar测试该位变量并跳转同时 清除。 _chkfloat_:测试并返回源点数状态。 使用时,必须包含#inclucle 一行。 如不说明,下面谈到的库函数均指非本征库函数。 第二节几类重要库函数 1. 专用寄存器include文件 例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。 2. 绝对地址include文件absacc.h 该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。 3. 动态内存分配函数,位于stdlib.h中 4. 缓冲区处理函数位于“string.h”中 其中包括拷贝比较移动等函数如: memccpy memchr memcmp memcpy memmove memset 这样很方便地对缓冲区进行处理。

C51库函数

C51库函数 C-51软件包的库包含标准的应用程序,每个函数都在相应的头文件(.h)中有原型声明。如果使用库函数,必须在源程序中用预编译指令定义与该函数相关的头文件(包含了该函数的原型声明)。例如: #include 如果省掉头文件,编译器则期望标准的C参数类型,从而不能保证函数的正确执行。 3.1 CTYPE.H:字符函数 在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个标点和格式

相关主题
相关文档
最新文档