关于C51头文件的一些资料

 

 keil 中自己编写C语言头文件 
 
自己编写一个C语言头文件,把自己常用的一些函数放进去。所看到文章做法和一般C语言头文件写法基本一样,自己学着试了一下,老是不成功。后来去图书馆查书,才知道原
来keil 的C语言比较特别,引用同一工程其他文件中的函数需要在声明函数前加extern。
 
以下是一个例子:
//步骤一:建立fc.h
#ifndef FC_H
#define FC_H
#include <reg51.h>
extern void f(void)
#endif
//步骤二:建立fc.c
#include "fc.h"
#include <reg51.h>
//还需要什么头文件自己添加
void f(void)
{
 //要什么程序自己添加
}
步骤三:将f.h和f.c放在工程的文件夹里,并在keil 中将f.c添加到工程中(右键左边的Source Group n,
选择Add file to group 'Source group n'),要用到f()函数的话就include“fC.h”就行了,例如:
#include <reg51.h>
#include "fc.h"
void main()
{
f();
while(1);
}
 
结果大功告成,成功编译,但是并没有想象中那么实用,例如 fc.c 中如果定义了函数但没有被引用的话,
keil 会发出警告,虽然可以编译,但是一大堆警告很烦人,也和容易让人忽视其他很重要警告。我想自己
编写头文件主要是适用于大型工程吧。很多人编写各自不同的函数,然后通过头文件的引用把函数给主程
序或者其他子程序引用。
 
注:fc.h也可以放在keil/C51/INC下,引用时变为#include <fc.h>

C51编程:头文件条件编译

 

程序移植到另外一个CPU上,其中头文件要更改。如想做一个兼容的,可用条件编译来控制头文件的编译。

假如有两个头文件my1.h和my2.h,在CPU1上编译my1.h,在CPU2上编译my2.h,则:

#define CPU1 // 在使用CPU1时打开该定义,反之关闭该定义;该定义放在公共入口头文件的顶头

#ifdefine CPU1

  #include "my1.h"

#else

  #include "my2.h"

#endif

如还有更多文件呢,如system.h,hard.h,这些在两个系统中都要有的,则有区别的就放在这里面,相同的就放在外面

#ifdef CPU1

  #include "my1.h"

  #include "system1.h"

  #include "hard1.h"

#else

  #include "my2.h"

  #include "system2.h" 也可以是system1.h

  #include "hard2.h"

#endif

#include "Public1.h"

...

也可以在各个头文件中把有差异的地方用

#ifdef CPU1

#else

#endif

来区分开来

不仅仅是头文件,其他输出设备以及电路板的不同版本都可采用条件编译

 

c51中的intrins.h库函数

 

 1..怎么用C51写一个NOP语句呢?

把头文件intrins.h包含进来,然后在需用NOP处调用_nop_();函数即可。

头文件intrins.h包含进来,然后在需用NOP处调用_nop_();函数即可。

2.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_,_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”指令

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

例:

#include

main()

{

unsigned int y;

y=0x0ff00;

y=_iror_(y,4); /*y=0x0ff0*/

}

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

 

伪本征函数——Keil C51头文件INTRINS.H的应用演示

*--------------------------------------------------------------------------

        伪本征函数——Keil C51头文件INTRINS.H的应用演示

                    作者:HotPower@126.com  2004.5.16  第一版

--------------------------------------------------------------------------*/

#include "reg51.h"

#include "intrins.h"

unsigned char readdata(void)

{

unsigned char val;

  for (val = 8; val >   0; val--)

  {

    _clrb_(TXD);

   _nop_();

    _movcb_(RXD);

    _rrca_();

    _setb_(TXD);

   _nop_();

  }

  _movra_(val);

  return val;

}

void writedata(unsigned char val)

{

  _movar_(val);

  for (val = 8; val >   0; val--)

  {

    _clrb_(TXD);

    _rrca_();

    _movbc_(RXD);

    _setb_(TXD);

   _nop_();

  }

}

main()

{

unsigned char i;

/*----------------------------------

  _movb0_();演示

-----------------------------------*/

  i = 0x01;

  _movb0_(TXD,i);

  i = 0x02;

  TXD = i & 0x01;

  i = 0x03;

  if (i & 0x01) TXD = 1;

  else TXD = 0;

/*---------------------------------*/

/*----------------------------------

  _movb7_();演示

-----------------------------------*/

  i = 0x04;

  _movb7_(RXD,i);

  i = 0x05;

  TXD = i & 0x80;

  i = 0x06;

  if (i & 0x80) TXD = 1;

  else TXD = 0;

  i = 0x07;

  if (i >  = 0x80) TXD = 1;

  else TXD = 0;

/*---------------------------------*/

/*----------------------------------

  _rlcar_();_movra_()组合演示

-----------------------------------*/

  i = 0x08;

  _setc_();

  _movra_(i);

  i   <  <= 1;

  i |= 0x01;

  i   <  <= 1;

  i ++;

  i += i;

  i *= 2;

  i ++;

/*---------------------------------*/

/*----------------------------------

  _rrcar_();_movra_()组合演示

-----------------------------------*/

  i = 0x09;

  _setc_();

  _rrcar_(i);

  _movra_(i);

  i >  >  = 1;

  i |= 0x80;

/*---------------------------------*/

  i = readdata();

  writedata(i);

  while(1);

}

为了更好的支持我,如果要转载请注明出处:fengmm521.blog.163.com

欢迎大家去我的个人网站和论坛留下脚印,网站:http://www.k557.com,论坛:http://www.k557.com/bbs

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值