您的位置:首页 > 其它

keil 中如何调用其他文件的函数

2013-08-01 14:50 441 查看
      今天有点小郁闷,搞了好久也没有真正搞通i2c的含义,但是也还是学到了很多东西的哦,在keil中肯定会包含有很多文件的哦,那怎么样在一个C文件中调用另一个的函数呢?呵呵!

       建立一个和这个C文件同名的H文件,把这个C文件中的函数都包含到这个H文件中就ok!

例如:有这样一个serial.C文件:

/********************************************************************************
*程序名称:serial.c
*程序描述:单片机串口通信,所用单片机为Philiph的P89C52*2
*编    制:LZS
*备    注:编译器keil C51 V7.06;时间2008.2.11;版本V1.0
*          定时计数器T1作为波特率发生器
*          波特率为4800;接收采用中断方式;发送采用查询方式
*********************************************************************************/
#include "reg51.h"

/**********************************************************************
*函数名称:void Init_SerialComm(void)
*函数描述:串口初始化
*入口参数:无
*出口参数:无
*备    注:
***********************************************************************/
void Init_SerialComm(void)
{
 TMOD=0x20;  //定时计数器T1工作在方式2,8bit自动重装
 TH1=0xEB;
 TL1=0xEB;   //波特率为1200;晶振频率为9.6MHZ
 SCON=0x50;  //串口工作在方式1
 PCON=0x80;
 EA=1;
 ES=1;
 TR1=1;
}

 
/*****************************************************************************
*函数名称:void UartSendChar(unsigned char ch)
*函数描述:向串口发送一个字节的数据
*入口参数: unsigned char ch
*出口参数:无
*备    注:无
******************************************************************************/
void UartSendChar(unsigned char ch)
{
 SBUF=ch;
 while(TI==0);
 TI=0;
}

/*********************************************************************************
*函数名称:void UartSendString(unsigned int *p,unsigned int string)
*函数描述:向串口发送strlong个字节的数据
*入口参数:unsigned int *p 指向发送数据的指针,unsigned int strlong发送数据的字节数
*出口参数:无
*备    注:无
**********************************************************************************/
void UartSendString(unsigned char *p,unsigned int strlong)
{
 unsigned char tmp=0;
 for(tmp=0;tmp<strlong;tmp++)
 {
  UartSendChar(*(p+tmp));
 }
 

}

/*************************************************************************
4.bcc异或校验法(block check character)
实现方法:很多基于串口的通讯都用这种既简单又相当准确的方法。
它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最
后的结果就是校验值,通常把她附在通讯数据的最后一起发送出去。
接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验
值一致就说明收到的数据是完整的。校验值计算的代码类似于:
unsigned uCRC=0;//校验初始值
for(int i=0;i<DataLenth;i++) uCRC^=Data[i];

适用范围:适用于大多数要求不高的数据通讯。

应用例子:ic卡接口通讯、很多单片机系统的串口通讯都使用。
********************************************************************************/

 

它对应的头文件如下:

#ifndef __serial_H__
#define __serial_H__

void Init_SerialComm(void);
void UartSendChar(unsigned char ch);
void UartSendString(unsigned char *p,unsigned int strlong);
//static void UartIntrruptService(void);

 

#endif

 

 这样就可以用#include来包含调用这个C文件中的函数了哦!呵呵!for example:

#include "serial.h"
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define InBufferLong 20
uchar counter;
uchar trdata[InBufferLong];
uchar checksum; 
uint i; 
bit Read_Flag=0;

/***************************************************************************************
*函数名称:int main(void)
*函数描述:主函数
*入口参数:无
*出口参数:无
*备    注:无
*****************************************************************************************/

int main(void)
{

    
 Init_SerialComm();
 while(1)
 {

 if(Read_Flag==1)
 {
  UartSendString(trdata,InBufferLong);
  Read_Flag=0;
  }
  }
}

 

/****************************************************************************************
*函数名称:void UartIntrruptService(void)
*函数描述:串口中断服务函数
*入口参数:无
*出口参数:无
*备    注:无
*******************************************************************************************/    
 
static void UartIntrruptService(void) interrupt 4 using 3
{

 if(RI)
 {
  RI=0;
  i=SBUF;
  if(i>127) //当接收到的数值大于127时
  {
   counter=0;
   trdata[counter]=i; //把接收到的数值保存在trdata[0]
   checksum=i-128;   //和校验等于接收到的数值-128
  }
  else
  {
   counter++;
   trdata[counter]=i;
   checksum^=i;
   if((counter==(InBufferLong-1))&&(1)) //接收满并且checksum=0时
   {
    Read_Flag=1;
    counter=0;
   }
  }
 }
 
  
}
 在这应注意:1.被调用的C文件中只包含头文件即可,每个函数都使用局部变量

                       2.所有的全局变量都在主C文件中定义

                       3.中断要放到主C文件中

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: