Keil头文件简介

  • 格式:pdf
  • 大小:310.48 KB
  • 文档页数:26

Keil中INTRINS.H的作用

在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编

时一样简便.

内部函数 描述

_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_,_cror_:将char型变量循环向左(右)移动指定位数后返回

_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。

_chkfloat_: 测试并返回源点数状态。

就是汇编中的子函数。

_crol_,_cror_:如国二进制数为01010101 那么_crol_(1) 左移1位后将高位

补低位。

结果10101010。

功 能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”

指令相关,上面几个函数不同于参数类型。

例:

#include

main()

{

unsigned int y; C-5 1 程序设计 37

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

Math.h库

函数:sin

功能:计算弧度的正弦值。

使用说明:sin(x),x为传入的弧度值。

函数:cos

功能:计 算弧度的余弦值。

使用说明:cos(x),x为传入的弧度值。

函数:tan

功能:计算弧度的正切值。

使用说 明:tan(x),x为传入的弧度值。

函数:sinh

功能:计算弧度的双曲正弦值。

使用说明:sinh(x),x为传入 的弧度值。

函数:cosh

功能:计算弧度的双曲余弦值。

使用说明:cosh(x),x为传入的弧度值。

函 数:tanh

功能:计算弧度的双曲正切值。

使用说明:tanh(x),x为传入的弧度值。

函数:asin

功能: 计算弧度的反正弦值。

使用说明:asin(x),x为传入的弧度值。

函数:acos

功能:计算弧度的反余弦值。

使 用说明:acos(x),x为传入的弧度值。

函数:atan

功能:计算弧度的反正切值。

使用说明:atan(x),x为 传入的弧度值。

函数:atan2

功能:计算两个浮点数类型值之比的反正切值。

使用说明:atan2(x,y),该函数会 计算出x/y的反正切值。

函数:log

功能:计算浮点数的自然对数值。

使用说明:log(x),计算以e为底的对数。

函数:log10

功能:以10为底来计算对数值。

使用说明:log10(x),计算以10为底的对数。

函 数:pow

功能:计算出某数的某次方值。

使用说明:pow(x,y),计算x的y次方。

函数:exp

功能:计算 浮点为数的指数函数值。

使用说明:exp(x),计算e的x次方。

函数:frexp

功能:调整浮点变量,将原变量的数值 部分调整到介于0.5和1之间。

使用说明:double y = frexp(double x, int *expptr),函数frexp将double

x的数值部分调整成介于0.5和1之间,将调整好的新数值部分回传给y,而指

数部分将传给指针expptr所指的位置,使x=y*(2^expptr)。 如x=10.5428,y

将为0.658925,*expptr将为4,有算式10.5428=0.658925*(2^4)。

函 数:ldexp

功能:根据所给予的数值部分x和指数部分y计算出浮点数x*(2^y)的值。

使用说明:ldexp(double x, int y),将返回x*(2^y)的值。

函数:_cabs

功能:取得复数结构的绝对值。

使用说明:double y = _cabs(struct _complex x),设复数x的实数部分为a,

虚数部分为b,则cabs将会计算x.a的平方加x.b的平方的和开根号的值。

函数:fabs

功 能:计算浮点数变量的绝对值。

使用说明:fabs(x),计算x的绝对值。

函数:hypot

功能:计算已知两边的直角三 角形的斜边长。

使用说明:hypot(x,y),计算x与y的平方和,再开根号后的值。

函数:ceil

功能:计算不小于 某浮点数的最小整数。

使用说明:ceil(x)。

函数:floor

功能:计算不大于某浮点数的最大整数。

使用说 明:floor(y)。

函数:modf

功能:求浮点数的小数部分。

使用说明:double z = modf(double x, double *y),x的整数部分会写入*y,

返回小数部分。如x为99.5,z将为0.5,*y将为99。

函 数:fmod

功能:求两浮点数相除后的余数。

使用说明:double z = fmod(double x, double y),z等于x除以y后的余数。

函数:sqrt

功能:求某非负浮点数的平方根。

使用说明:sqrt(x)。

注: 以上函数均在mingw gcc 4.5.0下用小例程测试通过。在gcc 4.5.0中,

求整数绝对值的abs函数是在stdlib.h头文件中提供。

assert的用法

assert();

当expression结果为“假”时,会在stderr中输出这条语句所在的文件名和行号,以及这条

表达式。这只在调试版本中起作用,在Release版本中不会产生任何代码。

通常当我们使用assert时,都在强烈说明一个含义:在这里必然如此。它通常用于一个函

数的先验条件和后验条件的检查。比如我写一个C风格复制字符串的函数,并且认为调用

者不应该传入NULL指针:

char * clone_string(const char * source)

{

char * result;

assert(source != NULL);

result = (char *)malloc(strlen(source) + 1);

if (result != NULL)

{

strcpy(result, source);

assert(strcmp(result, source) == 0);

}

return result;

}

注意到我对source是否为NULL是用assert检查的,但对result是不是为NULL是用if语

句判断的,这是因为在调用代码正确的情况下source必然不为NULL,如果断言失败,说明

调用代码中有错误,需要修改;但result作为malloc的返回值则不一定,在malloc代码无

误的情况下仍然可能返回NULL——当内存块不足时。最后又用assert对strcpy的结果进行

检查,因为只要代码正确,无论什么情况strcpy应该正常完成复制,它没有malloc那种异

常情况存在。

在《编程精粹》第二章(自己设计并使用断言)开始的一段话把assert的用途说的很清楚:

利用编译程序自动查错固然好,但我敢说只要你观察一下项目中那些比较明显的错误,就

会发现编译程序所查出的只是其中的一小部分。我还敢说,如果排除掉了程序中的所有错误

那么在大部分时间内程序都会正确工作。

还记得第1章中的下面代码吗?

strCopy = memcpy(malloc(length), str, length);

该语句在多数情况下都会工作得很好,除非malloc的调用产生失败。当malloc失败时,

就会给memcpy返回一个NULL指针。由于memcpy处理不了NULL指针,所以出现了错

误。如果你很走运,在交付之前这个错误导致程序的瘫痪,从而暴露出来。但是如果你不走

运,没有及时地发现这个错误,那某位顾客就一定会“走运”了。