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文件中
建立一个和这个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文件中
相关文章推荐
- 【python】如何在某.py文件中调用其他.py内的函数
- 【python】如何在某.py文件中调用其他.py内的函数
- c++中如何在主函数中调用其他文件内的函数?
- 【python】如何在某.py文件中调用其他.py内的函数
- 小结linux框架下函数如何可以使其被其他文件调用
- 【python】如何在某.py文件中调用其他.py内的函数
- 小结linux框架下函数如何可以使其被其他文件调用
- 如何在某.py文件中调用其他.py内的函数
- 转:python之如何在某文件中调用其他文件内的函数
- c++如何一个文件如何调用在同一个工程下的另一个文件的函数
- python 如何调用另一个路径下py文件的函数
- C语言如何跨文件调用函数定义中声明的变量
- 如何调用MFC中的函数打开一个系统资源面板,获取文件
- 如果已经在一个类中定义了全局函数,在其它类文件中如何调用它?
- iOS 里面如何使用第三方应用程序打开自己的文件,调用wps其他应用打开当前应用里面的的ppt doc xls
- OpenResty如何在一个lua文件调用另一个lua文件的函数
- 如何用VB编写自己的DLL文件,并调用其中的函数
- xsl 文件如何定义 Javascript 函数并且调用
- js调用其他js文件的函数,以及js加载过程
- [VB.NET]vb.net中如何检测一个已知的文件是否已经被打开或者被其他应用程序调用